-
-
-
- {{ t('shortcutKeys.HelpNote') }}
-
-
-
-
-
-
- {{ key.description }}
-
-
-
- {{ key.keys.replace(/[\[\]\\\(\)]/g, '') }}
-
-
-
-
-
-
-
-
- {{ key.description }}
-
-
-
- {{ key.keys.replace(/[\[\]\\\(\)]/g, '') }}
-
-
-
-
+
+
+
+
+
+
+
+ {{ t('shortcutKeys.HelpNote') }}
+
+
+
+
+
+ {{ key.description }}
+
+ {{ key.keys.replace(/[\[\]\\\(\)]/g, '') }}
+
-
-
-
+
+
-
-
diff --git a/frontend/components/widgets/InfoMask.vue b/frontend/components/widgets/InfoMask.vue
index e9049948b..d14b919d1 100644
--- a/frontend/components/widgets/InfoMask.vue
+++ b/frontend/components/widgets/InfoMask.vue
@@ -1,56 +1,51 @@
-
-
-
+
+
+
+
+
-
-
\ No newline at end of file
diff --git a/frontend/components/widgets/PWA.vue b/frontend/components/widgets/PWA.vue
index 7429e0c97..af9d47b19 100644
--- a/frontend/components/widgets/PWA.vue
+++ b/frontend/components/widgets/PWA.vue
@@ -10,14 +10,14 @@ import { detectBrowser, detectOS } from '@/utils/system-detect.js';
import { trackEvent } from '@/utils/use-analytics';
-// 定义数据
+// Define data
const isDesktopChrome = ref(true);
const isAndroidChrome = ref(false);
const isMacSafari = ref(false);
const isIosSafari = ref(false);
const isOtherBrowser = ref(false);
-// 定义方法
+// Define methods
const getBrowser = () => {
const os = detectOS();
const browser = detectBrowser();
diff --git a/frontend/components/widgets/Patch.vue b/frontend/components/widgets/Patch.vue
deleted file mode 100644
index edd2de68c..000000000
--- a/frontend/components/widgets/Patch.vue
+++ /dev/null
@@ -1,90 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/frontend/components/widgets/Preferences.vue b/frontend/components/widgets/Preferences.vue
index 605b6e4e2..74730eff4 100644
--- a/frontend/components/widgets/Preferences.vue
+++ b/frontend/components/widgets/Preferences.vue
@@ -1,217 +1,148 @@
-
-
-
-
-
{{ t('nav.preferences.preferenceTips') }}
-
-
-
-
-
{{
- t('nav.preferences.language') }}
-
-
-
-
- 中文
- English
- Français
- Türkçe
- {{ t('nav.preferences.systemAuto') }}
-
-
-
-
-
{{ t('nav.preferences.languageTips') }}
+
+
+
+
+
+
+
+ {{ t('nav.preferences.title') }}
+
+
+
+
+
+
+
+
+ {{ t('nav.preferences.preferenceTips') }}
+
+
+
+
+ {{ t('nav.preferences.language') }}
+ v && prefLanguage(v)">
+
+
+
+
+
+ {{ currentLang.label }}
+
+
+
+
+
+
+
+
+ {{ lang.label }}
+
+
+
+
+ {{ t('nav.preferences.languageTips') }}
+
+
+
+
+ {{ t('nav.preferences.colorScheme') }}
+ v && prefTheme(v)">
+
+
+ {{ opt.label }}
+
+
+
+
+
+
+ {{ t('nav.preferences.ipSourcesToCheck') }}
+ v && prefipCards(Number(v))">
+
+ {{ num }}
+
+
+ {{ t('nav.preferences.ipSourcesToCheckTips') }}
+
+
+
+
+ {{ t('nav.preferences.ipDB') }}
+ v != null && prefipGeoSource(Number(v))">
+
+ {{ currentIpDB?.text || '—' }}
+
+
+
+ {{ ipdb.text }}
+
+
+
+ {{ t('nav.preferences.ipDBTips') }}
+
+
+
+
+ {{ t('nav.preferences.appSettings') }}
+
+
-
-
-
-
-
{{
- t('nav.preferences.colorScheme') }}
-
-
-
-
- {{
- t('nav.preferences.colorLight') }}
- {{
- t('nav.preferences.colorDark') }}
- {{ t('nav.preferences.systemAuto') }}
-
-
-
-
-
-
-
-
-
- {{ t('nav.preferences.ipSourcesToCheck') }}
-
-
-
-
- {{ num
- }}
-
-
-
{{ t('nav.preferences.ipSourcesToCheckTips') }}
-
-
-
-
-
-
- {{ t('nav.preferences.ipDB') }}
-
-
-
-
-
- {{ ipdb.text }}
-
-
-
-
-
{{ t('nav.preferences.ipDBTips') }}
-
-
-
-
-
-
{{
- t('nav.preferences.appSettings') }}
-
-
-
-
{{
- t('nav.preferences.autoRun')
- }}
-
-
{{ t('nav.preferences.autoRunTips') }}
-
-
-
-
-
-
-
-
-
{{
- t('nav.preferences.connectivityAutoRefresh') }}
-
{{ t('nav.preferences.connectivityAutoRefreshTips') }}
-
-
-
-
-
-
-
-
-
{{
- t('nav.preferences.showMap')
- }}
-
-
{{ t('nav.preferences.showMapTips') }}
-
-
-
-
-
-
-
-
-
{{
- t('nav.preferences.simpleMode')
- }}
-
{{ t('nav.preferences.simpleModeTips') }}
-
-
-
-
-
-
-
-
-
{{
- t('nav.preferences.popupConnectivityNotifications') }}
-
-
{{ t('nav.preferences.popupConnectivityNotificationsTips') }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
\ No newline at end of file
+// Also react when the user switches theme via any path — the watcher keeps
+// applyTheme() firing even if a future code path mutates store.theme directly.
+watch(() => userPreferences.value.theme, applyTheme);
+
+
+// Section title: lucide icon + text, unified rhythm
+const SectionTitle = (props, { slots }) =>
+ h('h3', { class: 'flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wide text-muted-foreground mb-2' }, [
+ props.icon ? h(props.icon, { class: 'size-3.5' }) : null,
+ slots.default?.(),
+ ]);
+SectionTitle.props = ['icon'];
+
+// Section tip text
+const SectionTip = (props, { slots }) =>
+ h('p', { class: 'mt-2 text-xs text-muted-foreground leading-relaxed' }, slots.default?.());
+
+// App Settings switch row: label + tip on left, Switch on right
+const PrefRow = (props, { emit }) =>
+ h('div', { class: 'flex items-start justify-between gap-3 p-3' }, [
+ h('div', { class: 'flex-1 min-w-0' }, [
+ h('label', {
+ for: props.id,
+ class: 'text-sm font-medium cursor-pointer select-none',
+ }, props.label),
+ h('p', { class: 'mt-0.5 text-xs text-muted-foreground leading-relaxed' }, props.tip),
+ ]),
+ h(Switch, {
+ id: props.id,
+ modelValue: props.modelValue,
+ 'onUpdate:modelValue': (v) => emit('update:modelValue', v),
+ }),
+ ]);
+PrefRow.props = ['id', 'label', 'tip', 'modelValue'];
+PrefRow.emits = ['update:modelValue'];
+
diff --git a/frontend/components/widgets/QueryIP.vue b/frontend/components/widgets/QueryIP.vue
index 852ad4760..c215a4976 100644
--- a/frontend/components/widgets/QueryIP.vue
+++ b/frontend/components/widgets/QueryIP.vue
@@ -1,255 +1,124 @@
-
-
-
-
-
-
-
-
+
+
-
-
-
diff --git a/frontend/components/widgets/Toast.vue b/frontend/components/widgets/Toast.vue
index d21d6ae4b..90828b69b 100644
--- a/frontend/components/widgets/Toast.vue
+++ b/frontend/components/widgets/Toast.vue
@@ -1,78 +1,33 @@
-
-
-
-
- {{ alert.alertMessage }}
-
-
-
+
-
-
\ No newline at end of file
diff --git a/frontend/composables/use-info-mask.js b/frontend/composables/use-info-mask.js
new file mode 100644
index 000000000..67624e287
--- /dev/null
+++ b/frontend/composables/use-info-mask.js
@@ -0,0 +1,110 @@
+// Info mask logic: 3 level switch (no mask / mask IP / mask IP + geographic information)
+//
+// Input:
+// - refs: { IPCheckRef, webRTCRef, dnsLeaksRef } — each result card component ref
+// - store: main store (for setAlert / allHasLoaded monitoring)
+// - t: i18n translation function
+//
+// Output:
+// - infoMaskLevel: ref<0|1|2>
+// - toggleInfoMask(): () => void
+// - showMaskButton: ref
— becomes true after allHasLoaded
+// - isInfosLoaded: ref — synchronized from store.allHasLoaded, for shortcut judgment
+
+import { ref, watch } from 'vue';
+import { trackEvent } from '../utils/use-analytics.js';
+import { maskedInfo } from '../utils/masked-info.js';
+
+export function useInfoMask({ refs, store, t }) {
+ const infoMaskLevel = ref(0);
+ const isInfosLoaded = ref(false);
+ const showMaskButton = ref(false);
+ const originipDataCards = ref([]);
+ const originleakTest = ref([]);
+ const originstunServers = ref([]);
+
+ const applyMask = () => {
+ const { IPCheckRef, webRTCRef, dnsLeaksRef } = refs;
+ if (infoMaskLevel.value === 0) {
+ IPCheckRef.value.ipDataCards.forEach((card) => {
+ if (card.id === 'cloudflare_v6' || card.id === 'ipify_v6') {
+ card.ip = maskedInfo(t).ipv6;
+ } else {
+ card.ip = maskedInfo(t).ipv4;
+ }
+ });
+ webRTCRef.value.stunServers.forEach((server) => {
+ server.ip = maskedInfo(t).webrtcip;
+ });
+ dnsLeaksRef.value.leakTest.forEach((server) => {
+ server.ip = maskedInfo(t).dnsendpoints;
+ });
+ infoMaskLevel.value = 1;
+ } else if (infoMaskLevel.value === 1) {
+ IPCheckRef.value.ipDataCards.forEach((card) => {
+ Object.assign(card, maskedInfo(t));
+ });
+ dnsLeaksRef.value.leakTest.forEach((server) => {
+ server.geo = maskedInfo(t).country_name;
+ });
+ infoMaskLevel.value = 2;
+ }
+ };
+
+ const removeMask = () => {
+ const { IPCheckRef, webRTCRef, dnsLeaksRef } = refs;
+ const newIpDataCards = JSON.parse(JSON.stringify(originipDataCards.value));
+ IPCheckRef.value.ipDataCards.splice(0, IPCheckRef.value.ipDataCards.length, ...newIpDataCards);
+
+ const newStunServers = JSON.parse(JSON.stringify(originstunServers.value));
+ webRTCRef.value.stunServers.splice(0, webRTCRef.value.stunServers.length, ...newStunServers);
+
+ const newLeakTests = JSON.parse(JSON.stringify(originleakTest.value));
+ dnsLeaksRef.value.leakTest.splice(0, dnsLeaksRef.value.leakTest.length, ...newLeakTests);
+
+ infoMaskLevel.value = 0;
+ };
+
+ const toggleInfoMask = () => {
+ const { IPCheckRef, webRTCRef, dnsLeaksRef } = refs;
+ trackEvent('SideButtons', 'ToggleClick', 'InfoMask');
+ let style;
+ let title;
+ let message;
+ if (infoMaskLevel.value === 0) {
+ originipDataCards.value = JSON.parse(JSON.stringify(IPCheckRef.value.ipDataCards));
+ originstunServers.value = JSON.parse(JSON.stringify(webRTCRef.value.stunServers));
+ originleakTest.value = JSON.parse(JSON.stringify(dnsLeaksRef.value.leakTest));
+ applyMask();
+ style = 'text-warning';
+ message = t('alert.maskedInfoMessage_1');
+ title = t('alert.maskedInfoTitle_1');
+ } else if (infoMaskLevel.value === 1) {
+ applyMask();
+ style = 'text-success';
+ message = t('alert.maskedInfoMessage');
+ title = t('alert.maskedInfoTitle');
+ } else {
+ removeMask();
+ style = 'text-danger';
+ message = t('alert.unmaskedInfoMessage');
+ title = t('alert.unmaskedInfoTitle');
+ }
+ store.setAlert(true, style, message, title);
+ };
+
+ watch(
+ () => store.allHasLoaded,
+ (val) => {
+ isInfosLoaded.value = val;
+ showMaskButton.value = true;
+ },
+ );
+
+ return {
+ infoMaskLevel,
+ isInfosLoaded,
+ showMaskButton,
+ toggleInfoMask,
+ };
+}
diff --git a/frontend/composables/use-refresh-orchestrator.js b/frontend/composables/use-refresh-orchestrator.js
new file mode 100644
index 000000000..526027e4f
--- /dev/null
+++ b/frontend/composables/use-refresh-orchestrator.js
@@ -0,0 +1,82 @@
+// Refresh / initial load sequence orchestration
+//
+// Input:
+// - refs: { IPCheckRef, connectivityRef, webRTCRef, dnsLeaksRef }
+// - store: main store
+// - t: i18n translation function
+// - userPreferences: computed(() => store.userPreferences)
+// - infoMaskLevel: ref — reset to 0 when refreshing
+//
+// Output:
+// - loadingControl(): initial load sequence starts (after all cards are mounted)
+//
+// Internal:
+// - monitor store.shouldRefreshEveryThing, trigger refresh → reset loadingStatus → schedule component refreshes → Alert → reset flag
+
+import { watch } from 'vue';
+
+function scheduleTimedTasks(tasks) {
+ tasks.forEach((task) => {
+ setTimeout(() => {
+ task.action();
+ if (task.after) task.after();
+ }, task.delay);
+ });
+}
+
+export function useRefreshOrchestrator({ refs, store, t, userPreferences, infoMaskLevel }) {
+ const refreshingAlert = () => {
+ store.setAlert(
+ true,
+ 'text-success',
+ t('alert.refreshEverythingMessage'),
+ t('alert.refreshEverythingTitle'),
+ );
+ };
+
+ const refreshEverything = () => {
+ store.setLoadingStatus('connectivity', false);
+ store.setLoadingStatus('webrtc', false);
+ store.setLoadingStatus('dnsleaktest', false);
+ store.setLoadingStatus('ipcheck', false);
+
+ const { IPCheckRef, connectivityRef, webRTCRef, dnsLeaksRef } = refs;
+ scheduleTimedTasks([
+ { action: () => IPCheckRef.value.checkAllIPs(), delay: 0 },
+ { action: () => connectivityRef.value.handelCheckStart(true), delay: 2000 },
+ { action: () => webRTCRef.value.checkAllWebRTC(true), delay: 3000 },
+ { action: () => dnsLeaksRef.value.checkAllDNSLeakTest(true), delay: 2500 },
+ { action: () => refreshingAlert(), delay: 500 },
+ ]);
+ infoMaskLevel.value = 0;
+ store.setRefreshEveryThing(false);
+ };
+
+ const loadingControl = (t1 = 0, t2 = 2000, t3 = 3000, t4 = 2500) => {
+ const { IPCheckRef, connectivityRef, webRTCRef, dnsLeaksRef } = refs;
+ const mountedStatus = Object.values(store.mountingStatus).every(Boolean);
+ if (mountedStatus) {
+ setTimeout(() => IPCheckRef.value.checkAllIPs(), t1);
+ if (userPreferences.value.autoStart) {
+ setTimeout(() => connectivityRef.value.handelCheckStart(), t2);
+ setTimeout(() => webRTCRef.value.checkAllWebRTC(false), t3);
+ setTimeout(() => dnsLeaksRef.value.checkAllDNSLeakTest(false), t4);
+ } else {
+ store.setLoadingStatus('connectivity', true);
+ store.setLoadingStatus('webrtc', true);
+ store.setLoadingStatus('dnsleaktest', true);
+ }
+ } else {
+ setTimeout(() => loadingControl(t1, t2, t3, t4), 1000);
+ }
+ };
+
+ watch(
+ () => store.shouldRefreshEveryThing,
+ (newVal) => {
+ if (newVal) refreshEverything();
+ },
+ );
+
+ return { loadingControl };
+}
diff --git a/frontend/composables/use-scroll-to.js b/frontend/composables/use-scroll-to.js
new file mode 100644
index 000000000..87c7e6650
--- /dev/null
+++ b/frontend/composables/use-scroll-to.js
@@ -0,0 +1,7 @@
+// Smooth scroll to specified element (supports passing element or id string)
+export function scrollToElement(el, offset = 0) {
+ const element = typeof el === 'string' ? document.getElementById(el) : el;
+ if (!element) return;
+ const y = element.getBoundingClientRect().top + window.scrollY - offset;
+ window.scrollTo({ top: y, behavior: 'smooth' });
+}
diff --git a/frontend/composables/use-section-tracking.js b/frontend/composables/use-section-tracking.js
new file mode 100644
index 000000000..3a9e16d9d
--- /dev/null
+++ b/frontend/composables/use-section-tracking.js
@@ -0,0 +1,58 @@
+// Scroll tracking: when page scrolls
+// 1) capture the first partially visible section, write to store.changeSection() (for Nav highlighting)
+// 2) send one JNScroll event when each section first fully enters the viewport (only once, deduplicated)
+
+import { onMounted, onBeforeUnmount } from 'vue';
+import { useMainStore } from '@/store';
+import { trackEvent } from '@/utils/use-analytics';
+import { SECTION_IDS } from '@/data/sections';
+
+const isElementFullyInViewport = (el) => {
+ const rect = el.getBoundingClientRect();
+ return (
+ rect.top >= 0 &&
+ rect.left >= 0 &&
+ rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
+ rect.right <= (window.innerWidth || document.documentElement.clientWidth)
+ );
+};
+
+const isElementPartiallyInViewport = (el) => {
+ const rect = el.getBoundingClientRect();
+ const viewportHeight = (window.innerHeight || document.documentElement.clientHeight);
+ return rect.bottom > 0 && rect.top < viewportHeight;
+};
+
+const firstElementInViewport = (elementIds) => {
+ for (const elementId of elementIds) {
+ const element = document.getElementById(elementId);
+ if (element && isElementPartiallyInViewport(element)) return elementId;
+ }
+ return null;
+};
+
+export function useSectionTracking() {
+ const store = useMainStore();
+ const trackedSections = new Set();
+
+ const checkSectionsAndTrack = () => {
+ const firstVisibleSectionId = firstElementInViewport(SECTION_IDS);
+ if (firstVisibleSectionId) store.changeSection(firstVisibleSectionId);
+
+ SECTION_IDS.forEach(sectionId => {
+ const section = document.getElementById(sectionId);
+ if (section && isElementFullyInViewport(section) && !trackedSections.has(sectionId)) {
+ trackEvent(sectionId, 'JNScroll', sectionId);
+ trackedSections.add(sectionId);
+ }
+ });
+ };
+
+ onMounted(() => {
+ window.addEventListener('scroll', checkSectionsAndTrack);
+ });
+
+ onBeforeUnmount(() => {
+ window.removeEventListener('scroll', checkSectionsAndTrack);
+ });
+}
diff --git a/frontend/composables/use-shortcuts.js b/frontend/composables/use-shortcuts.js
new file mode 100644
index 000000000..956d8aaa7
--- /dev/null
+++ b/frontend/composables/use-shortcuts.js
@@ -0,0 +1,235 @@
+// Keyboard shortcut registration
+//
+// Input:
+// - refs: all components involved in the shortcut keys (see below for destructuring)
+// - store: main store
+// - t: i18n translation function
+// - configs: computed(() => store.configs)
+// - userPreferences: computed(() => store.userPreferences)
+// - isSignedIn: computed(() => store.isSignedIn)
+//
+// Output:
+// - loadShortcuts(): should be called onMounted, internally will delay 2s to wait for configs to load,
+// then register all mappings and pass keyMap to helpModalRef (for help modal)
+//
+// Note:
+// - all scrolling + navigation actions use scrollToElement + advancedToolsRef.navigateAndToggleOffcanvas
+// - `h` key infoMask switch only executes when isInfosLoaded is true
+
+import { trackEvent } from '../utils/use-analytics.js';
+import { mappingKeys, keyMap, navigateCards } from '../utils/shortcut.js';
+import { scrollToElement } from './use-scroll-to.js';
+
+function buildShortcutConfig({ refs, store, t, configs, userPreferences, isSignedIn }) {
+ const {
+ navBarRef,
+ preferencesRef,
+ queryIPRef,
+ helpModalRef,
+ additionalRef,
+ footerRef,
+ speedTestRef,
+ advancedToolsRef,
+ IPCheckRef,
+ connectivityRef,
+ webRTCRef,
+ dnsLeaksRef,
+ isInfosLoaded,
+ openedCard,
+ toggleInfoMask,
+ } = refs;
+
+ const goToAdvancedTool = (path, trackName) => {
+ scrollToElement('AdvancedTools', 80);
+ advancedToolsRef.value.navigateAndToggleOffcanvas(path);
+ trackEvent('Nav', 'NavClick', trackName);
+ };
+
+ const config = [
+ {
+ keys: 'g',
+ action: () => {
+ window.scrollTo({ top: 0, behavior: 'smooth' });
+ trackEvent('ShortCut', 'ShortCut', 'GoToTop');
+ },
+ description: t('shortcutKeys.GoToTop'),
+ },
+ {
+ keys: 'j',
+ action: () => { navigateCards('down'); trackEvent('ShortCut', 'ShortCut', 'GoNext'); },
+ description: t('shortcutKeys.GoNext'),
+ },
+ {
+ keys: 'k',
+ action: () => { navigateCards('up'); trackEvent('ShortCut', 'ShortCut', 'GoPrevious'); },
+ description: t('shortcutKeys.GoPrevious'),
+ },
+ {
+ // Open the currently J/K-highlighted card if it's an Advanced Tool
+ // (those carry data-adv-path). No-op for any other card type —
+ // IP cards, Connectivity, WebRTC, etc. have their own refresh
+ // shortcuts rather than an "open" concept.
+ keys: 'o',
+ action: () => {
+ const highlighted = document.querySelector(
+ '.keyboard-shortcut-card[data-keyboard-hover="true"]'
+ );
+ const path = highlighted?.getAttribute('data-adv-path');
+ if (!path) return;
+ advancedToolsRef.value.navigateAndToggleOffcanvas(path);
+ trackEvent('ShortCut', 'ShortCut', 'OpenHighlightedTool');
+ },
+ description: t('shortcutKeys.OpenHighlightedTool'),
+ },
+ {
+ keys: 'G',
+ action: () => {
+ window.scrollTo({ top: document.body.scrollHeight, behavior: 'smooth' });
+ trackEvent('ShortCut', 'ShortCut', 'GoToBottom');
+ },
+ description: t('shortcutKeys.GoToBottom'),
+ },
+ {
+ keys: 'R',
+ action: () => {
+ store.setRefreshEveryThing(true);
+ trackEvent('ShortCut', 'ShortCut', 'RefreshEverything');
+ },
+ description: t('shortcutKeys.RefreshEverything'),
+ },
+ {
+ keys: '([1-6])',
+ type: 'regex',
+ action: (num) => {
+ if (num > userPreferences.value.ipCardsToShow) return;
+ const card = IPCheckRef.value.ipDataCards[num - 1];
+ scrollToElement('IPInfo-' + num, 300);
+ IPCheckRef.value.refreshCard(card, num - 1);
+ trackEvent('ShortCut', 'ShortCut', 'IPCheck');
+ },
+ description: t('shortcutKeys.RefreshIPCard'),
+ },
+ {
+ keys: 'c',
+ action: () => {
+ scrollToElement('Connectivity', 80);
+ connectivityRef.value.handelCheckStart(true);
+ trackEvent('ShortCut', 'ShortCut', 'Connectivity');
+ },
+ description: t('shortcutKeys.RefreshConnectivityTests'),
+ },
+ {
+ keys: 'w',
+ action: () => {
+ scrollToElement('WebRTC', 80);
+ webRTCRef.value.checkAllWebRTC(false);
+ trackEvent('ShortCut', 'ShortCut', 'WebRTC');
+ },
+ description: t('shortcutKeys.RefreshWebRTC'),
+ },
+ {
+ keys: 'd',
+ action: () => {
+ scrollToElement('DNSLeakTest', 80);
+ dnsLeaksRef.value.checkAllDNSLeakTest(true);
+ trackEvent('ShortCut', 'ShortCut', 'DNSLeakTest');
+ },
+ description: t('shortcutKeys.RefreshDNSLeakTest'),
+ },
+ {
+ keys: 's',
+ action: () => {
+ scrollToElement('SpeedTest', 80);
+ speedTestRef.value.speedTestController();
+ trackEvent('ShortCut', 'ShortCut', 'SpeedTest');
+ },
+ description: t('shortcutKeys.SpeedTestButton'),
+ },
+ { keys: 'l', action: () => goToAdvancedTool('/pingtest', 'PingTest'), description: t('shortcutKeys.PingTest') },
+ { keys: 'M', action: () => goToAdvancedTool('/macchecker', 'MacChecker'), description: t('shortcutKeys.MacChecker') },
+ { keys: 't', action: () => goToAdvancedTool('/mtrtest', 'MTRTest'), description: t('shortcutKeys.MTRTest') },
+ { keys: 'S', action: () => goToAdvancedTool('/securitychecklist', 'SecurityChecklist'), description: t('shortcutKeys.SecurityChecklist') },
+ { keys: 'r', action: () => goToAdvancedTool('/ruletest', 'RuleTest'), description: t('shortcutKeys.RuleTest') },
+ { keys: 'n', action: () => goToAdvancedTool('/dnsresolver', 'DNSResolver'), description: t('shortcutKeys.DNSResolver') },
+ { keys: 'C', action: () => goToAdvancedTool('/censorshipcheck', 'CensorshipCheck'), description: t('shortcutKeys.CensorshipCheck') },
+ { keys: 'b', action: () => goToAdvancedTool('/browserinfo', 'BrowserInfo'), description: t('shortcutKeys.BrowserInfo') },
+ { keys: 'W', action: () => goToAdvancedTool('/whois', 'Whois'), description: t('shortcutKeys.Whois') },
+ {
+ keys: 'f',
+ action: () => {
+ if (openedCard.value !== 0) {
+ advancedToolsRef.value.fullScreen();
+ trackEvent('ShortCut', 'ShortCut', 'FullScreen');
+ }
+ },
+ description: t('shortcutKeys.fullScreenAdvancedTools'),
+ },
+ {
+ keys: 'q',
+ action: () => { queryIPRef.value.openModal(); trackEvent('ShortCut', 'ShortCut', 'QueryIP'); },
+ description: t('shortcutKeys.IPCheck'),
+ },
+ {
+ keys: 'h',
+ action: () => {
+ if (isInfosLoaded.value) toggleInfoMask();
+ trackEvent('ShortCut', 'ShortCut', 'ToggleInfoMask');
+ },
+ description: t('shortcutKeys.ToggleInfoMask'),
+ },
+ {
+ keys: 'p',
+ action: () => { navBarRef.value.OpenPreferences(); trackEvent('ShortCut', 'ShortCut', 'Preferences'); },
+ description: t('shortcutKeys.Preferences'),
+ },
+ {
+ keys: 'a',
+ action: () => { footerRef.value.openAbout(); trackEvent('ShortCut', 'ShortCut', 'About'); },
+ description: t('shortcutKeys.About'),
+ },
+ {
+ keys: 'x',
+ action: () => { additionalRef.value.openCurlModal(); trackEvent('ShortCut', 'ShortCut', 'Curl'); },
+ description: t('shortcutKeys.Curl'),
+ },
+ {
+ keys: '?',
+ action: () => {
+ helpModalRef.value.openModal();
+ trackEvent('ShortCut', 'ShortCut', 'Help');
+ if (isSignedIn.value && !store.userAchievements.CleverTrickery.achieved) {
+ store.setTriggerUpdateAchievements('CleverTrickery');
+ }
+ },
+ description: t('shortcutKeys.Help'),
+ },
+ ];
+
+ if (configs.value.originalSite) {
+ config.push({
+ keys: 'i',
+ action: () => goToAdvancedTool('/invisibilitytest', 'InvisibilityTest'),
+ description: t('shortcutKeys.InvisibilityTest'),
+ });
+ }
+
+ return config;
+}
+
+export function useShortcuts({ refs, store, t, configs, userPreferences, isSignedIn }) {
+ const registerShortcutKeys = () => {
+ const shortcuts = buildShortcutConfig({ refs, store, t, configs, userPreferences, isSignedIn });
+ shortcuts.forEach((entry) => mappingKeys(entry));
+ };
+
+ const loadShortcuts = () => {
+ setTimeout(() => {
+ registerShortcutKeys();
+ if (refs.helpModalRef.value) {
+ refs.helpModalRef.value.keyMap = keyMap;
+ }
+ }, 2000);
+ };
+
+ return { loadShortcuts };
+}
diff --git a/frontend/composables/use-status-tone.js b/frontend/composables/use-status-tone.js
new file mode 100644
index 000000000..06ced9170
--- /dev/null
+++ b/frontend/composables/use-status-tone.js
@@ -0,0 +1,31 @@
+// Unified "state → visual" mapping: 4 tone levels share the same color scheme
+//
+// wait waiting/not executed sky
+// ok-fast success + fast green
+// ok-slow success + slow amber
+// fail failure/timeout red
+//
+// Each module maps its business status (e.g. test.status === 'Available' && test.time < 200)
+// to these 4 tone levels, then calls dotClass(tone) / textClass(tone) to get the corresponding
+// Tailwind class. This way Connectivity / WebRTC / DnsLeak / future similar modules
+// all use the same visual language, and the color scheme is applied throughout the site.
+export const dotColorMap = {
+ 'wait': 'bg-info',
+ 'ok-fast': 'bg-success',
+ 'ok-slow': 'bg-warning',
+ 'fail': 'bg-destructive',
+};
+
+export const textColorMap = {
+ 'wait': 'text-muted-foreground',
+ 'ok-fast': 'text-success',
+ 'ok-slow': 'text-warning',
+ 'fail': 'text-destructive',
+};
+
+export function useStatusTone() {
+ return {
+ dotClass: (tone) => dotColorMap[tone] || dotColorMap.wait,
+ textClass: (tone) => textColorMap[tone] || textColorMap.wait,
+ };
+}
diff --git a/frontend/data/achievements.js b/frontend/data/achievements.js
new file mode 100644
index 000000000..642528c8a
--- /dev/null
+++ b/frontend/data/achievements.js
@@ -0,0 +1,46 @@
+// Achievements definitions
+//
+// Only contains static definitions (name + img), no runtime state (achieved / achievedTime / showDetails).
+// Runtime state is generated by createInitialAchievementsState() factory, ensuring that each call returns a fresh object,
+// and does not pollute state between multiple Pinia store instances.
+
+export const ACHIEVEMENTS_DEFINITIONS = [
+ { name: 'IAmHuman', img: '/achievements/iamhuman.webp' },
+ { name: 'BarelyEnough', img: '/achievements/barelyenough.webp' },
+ { name: 'RapidPace', img: '/achievements/rapidpace.webp' },
+ { name: 'TorrentFlow', img: '/achievements/torrentflow.webp' },
+ { name: 'SteadyGoing', img: '/achievements/steadygoing.webp' },
+ { name: 'TooFastTooSimple', img: '/achievements/toofasttoosimple.webp' },
+ { name: 'SwiftAscent', img: '/achievements/swiftascent.webp' },
+ { name: 'SurfaceCheck', img: '/achievements/surfacecheck.webp' },
+ { name: 'HalfwayThere', img: '/achievements/halfwaythere.webp' },
+ { name: 'FullySecured', img: '/achievements/fullysecured.webp' },
+ { name: 'JustInCase', img: '/achievements/justincase.webp' },
+ { name: 'HiddenWell', img: '/achievements/hiddenwell.webp' },
+ { name: 'SlipUp', img: '/achievements/slipup.webp' },
+ { name: 'CleverTrickery', img: '/achievements/clevertrickery.webp' },
+ { name: 'EnergySaver', img: '/achievements/energysaver.webp' },
+ { name: 'ResourceHog', img: '/achievements/resourcehog.webp' },
+ { name: 'MakingBigNews', img: '/achievements/makingbignews.webp' },
+ { name: 'GenerousDonor', img: '/achievements/generousdonor.webp' },
+ { name: 'ItIsOpen', img: '/achievements/itisopen.webp' },
+ { name: 'CuriousCat', img: '/achievements/curiouscat.webp' },
+ { name: 'CrossingTheWall', img: '/achievements/crossingthewall.webp' },
+];
+
+/**
+ * Returns a fresh achievements state object (store state initial value), compatible with the original store.userAchievements.
+ */
+export function createInitialAchievementsState() {
+ const state = {};
+ for (const def of ACHIEVEMENTS_DEFINITIONS) {
+ state[def.name] = {
+ name: def.name,
+ img: def.img,
+ achieved: false,
+ achievedTime: null,
+ showDetails: false,
+ };
+ }
+ return state;
+}
diff --git a/frontend/data/changelog.json b/frontend/data/changelog.json
new file mode 100644
index 000000000..41d56df3b
--- /dev/null
+++ b/frontend/data/changelog.json
@@ -0,0 +1,1016 @@
+[
+ {
+ "version": "v1.0",
+ "date": "Nov 06, 2020",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Display user's IP information",
+ "zh": "显示用户的 IP 信息",
+ "fr": "Affichage des informations IP de l'utilisateur",
+ "tr": "Kullanıcının IP bilgilerini görüntüleme"
+ }
+ },
+ {
+ "type": "add",
+ "change": {
+ "en": "Display IP information before and after proxy",
+ "zh": "显示代理前后的 IP 信息",
+ "fr": "Affichage des informations IP avant et après le proxy",
+ "tr": "Proxy öncesi ve sonrası IP bilgilerini görüntüleme"
+ }
+ },
+ {
+ "type": "add",
+ "change": {
+ "en": "Check website availability",
+ "zh": "检查网站可用性",
+ "fr": "Vérification de la disponibilité des sites web",
+ "tr": "Web sitesi kullanılabilirliğini kontrol etme"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v2.0",
+ "date": "Nov 24, 2023",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Refactored the entire project using Vue2",
+ "zh": "使用 Vue2 重构了整个项目",
+ "fr": "Refonte complète du projet en utilisant Vue2",
+ "tr": "Tüm proje Vue2 kullanılarak yeniden yazıldı"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Refactored UI using Bootstrap v5",
+ "zh": "使用 Bootstrap v5 重构了 UI",
+ "fr": "Refonte de l'interface utilisateur en utilisant Bootstrap v5",
+ "tr": "UI Bootstrap v5 kullanılarak yeniden düzenlendi"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v2.1",
+ "date": "Nov 25, 2023",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Added WebRTC test",
+ "zh": "添加了 WebRTC 测试",
+ "fr": "Ajout du test WebRTC",
+ "tr": "WebRTC testi eklendi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Optimized program logic",
+ "zh": "优化了程序的一些逻辑",
+ "fr": "Optimisation de la logique du programme",
+ "tr": "Program mantığı optimize edildi"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v2.2",
+ "date": "Nov 26, 2023",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Added DNS leak test",
+ "zh": "添加了 DNS 泄漏测试",
+ "fr": "Ajout du test de fuite DNS",
+ "tr": "DNS sızıntı testi eklendi"
+ }
+ },
+ {
+ "type": "add",
+ "change": {
+ "en": "Support displaying Bing maps in the frontend",
+ "zh": "支持在前端显示 Bing 地图",
+ "fr": "Prise en charge de l'affichage des cartes Bing dans l'interface",
+ "tr": "Ön yüzde Bing haritalarını görüntüleme desteği eklendi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Multiple logic optimizations",
+ "zh": "多个逻辑优化",
+ "fr": "Multiples optimisations de la logique",
+ "tr": "Çoklu mantık optimizasyonları"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v2.3",
+ "date": "Nov 27, 2023",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Added dark mode",
+ "zh": "添加了黑暗模式",
+ "fr": "Ajout du mode sombre",
+ "tr": "Karanlık mod eklendi"
+ }
+ },
+ {
+ "type": "add",
+ "change": {
+ "en": "Added minimalist mode for mobile",
+ "zh": "增加移动版简约模式",
+ "fr": "Ajout du mode minimaliste pour mobile",
+ "tr": "Mobil için minimalist mod eklendi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Optimized file structure",
+ "zh": "优化了文件结构",
+ "fr": "Optimisation de la structure des fichiers",
+ "tr": "Dosya yapısı optimize edildi"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v2.4",
+ "date": "Dec 1, 2023",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Added support for English language",
+ "zh": "支持英文语言",
+ "fr": "Prise en charge de la langue anglaise",
+ "tr": "İngilizce dil desteği eklendi"
+ }
+ },
+ {
+ "type": "add",
+ "change": {
+ "en": "Added information masking feature",
+ "zh": "添加信息遮罩功能",
+ "fr": "Ajout de la fonctionnalité de masquage des informations",
+ "tr": "Bilgi gizleme özelliği eklendi"
+ }
+ },
+ {
+ "type": "add",
+ "change": {
+ "en": "Support PWA, can be installed on mobile and desktop",
+ "zh": "支持 PWA,可以安装到手机和桌面上",
+ "fr": "Prise en charge de PWA, peut être installé sur mobile et ordinateur de bureau",
+ "tr": "PWA desteği, mobil ve masaüstüne kurulabilir"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v2.5",
+ "date": "Dec 20, 2023",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Added support for keyboard shortcuts",
+ "zh": "支持快捷键操作",
+ "fr": "Prise en charge des raccourcis clavier",
+ "tr": "Klavye kısayolları desteği eklendi"
+ }
+ },
+ {
+ "type": "add",
+ "change": {
+ "en": "Added website speed test feature",
+ "zh": "添加网速测试功能",
+ "fr": "Ajout de la fonctionnalité de test de vitesse des sites web",
+ "tr": "Web sitesi hız testi özelliği eklendi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Support deployment using Docker",
+ "zh": "支持使用 Docker 部署",
+ "fr": "Prise en charge du déploiement à l'aide de Docker",
+ "tr": "Docker kullanarak dağıtım desteği"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Support retrieving IP geolocation information from multiple sources",
+ "zh": "支持从多个来源获取 IP 归属地等信息",
+ "fr": "Prise en charge de la récupération des informations de géolocalisation IP à partir de plusieurs sources",
+ "tr": "Birden fazla kaynaktan IP coğrafi konum bilgisi alma desteği"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v3.0",
+ "date": "Jan 28, 2024",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Refactored the entire project using Vite + Vue3",
+ "zh": "使用 Vite + Vue3 重构了整个项目",
+ "fr": "Refonte complète du projet en utilisant Vite + Vue3",
+ "tr": "Tüm proje Vite + Vue3 kullanılarak yeniden yazıldı"
+ }
+ },
+ {
+ "type": "add",
+ "change": {
+ "en": "Added global latency test feature",
+ "zh": "增加全球延迟测试功能",
+ "fr": "Ajout de la fonctionnalité de test de latence mondiale",
+ "tr": "Global gecikme testi özelliği eklendi"
+ }
+ },
+ {
+ "type": "add",
+ "change": {
+ "en": "Added MTR test feature",
+ "zh": "增加 MTR 测试功能",
+ "fr": "Ajout de la fonctionnalité de test MTR",
+ "tr": "MTR testi özelliği eklendi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Multiple performance and user experience optimizations",
+ "zh": "多个性能优化和体验优化",
+ "fr": "Multiples optimisations de performance et d'expérience utilisateur",
+ "tr": "Çoklu performans ve kullanıcı deneyimi optimizasyonları"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v3.1",
+ "date": "Jan 30, 2024",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Added support for a new language: French",
+ "zh": "支持新的语言:法语",
+ "fr": "Ajout de la prise en charge d'une nouvelle langue : français",
+ "tr": "Yeni bir dil desteği eklendi: Fransızca"
+ }
+ },
+ {
+ "type": "add",
+ "change": {
+ "en": "Added loading animation",
+ "zh": "添加数据加载中的动画",
+ "fr": "Ajout d'une animation de chargement des données",
+ "tr": "Yükleme animasyonu eklendi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Optimized caching strategy",
+ "zh": "优化了缓存策略",
+ "fr": "Optimisation de la stratégie de cache",
+ "tr": "Önbellekleme stratejisi optimize edildi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Adjusted dark mode styles",
+ "zh": "调整黑暗模式样式",
+ "fr": "Ajustement du style du mode sombre",
+ "tr": "Karanlık mod stilleri ayarlandı"
+ }
+ },
+ {
+ "type": "fix",
+ "change": {
+ "en": "Fixed some minor issues",
+ "zh": "修复了一些小问题",
+ "fr": "Correction de quelques problèmes mineurs",
+ "tr": "Bazı küçük sorunlar düzeltildi"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v3.2",
+ "date": "Feb 3, 2024",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Added NAT type detection",
+ "zh": "添加 NAT 类型检测",
+ "fr": "Ajout de la détection du type NAT",
+ "tr": "NAT türü tespiti eklendi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Optimized PWA application experience",
+ "zh": "优化 PWA 应用的体验",
+ "fr": "Optimisation de l'expérience de l'application PWA",
+ "tr": "PWA uygulama deneyimi optimize edildi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Enhanced backend script security",
+ "zh": "提高后端脚本安全性",
+ "fr": "Amélioration de la sécurité du script backend",
+ "tr": "Arka uç komut dosyası güvenliği artırıldı"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v3.3",
+ "date": "Feb 6, 2024",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Added support for using different IP geolocation sources",
+ "zh": "支持使用不同的 IP 地理位置信息源",
+ "fr": "Prise en charge de l'utilisation de différentes sources d'informations de géolocalisation IP",
+ "tr": "Farklı IP coğrafi konum kaynaklarını kullanma desteği eklendi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Improved user experience for connection availability detection",
+ "zh": "优化连接可用性检测的用户体验",
+ "fr": "Amélioration de l'expérience utilisateur de la détection de disponibilité de connexion",
+ "tr": "Bağlantı kullanılabilirlik tespiti için kullanıcı deneyimi iyileştirildi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Optimized UI experience",
+ "zh": "优化 UI 体验",
+ "fr": "Amélioration de l'expérience utilisateur de l'interface utilisateur",
+ "tr": "UI deneyimi optimize edildi"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v3.4",
+ "date": "Feb 17, 2024",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Added ASN details viewer",
+ "zh": "添加 ASN 详细信息查看器",
+ "fr": "Ajout d'un visualiseur de détails ASN",
+ "tr": "ASN detayları görüntüleyici eklendi"
+ }
+ },
+ {
+ "type": "add",
+ "change": {
+ "en": "Added proxy detection feature",
+ "zh": "添加 IP 地址是否为代理的判断",
+ "fr": "Ajout de la détection de proxy",
+ "tr": "Proxy tespiti özelliği eklendi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Optimized UI for displaying IP information",
+ "zh": "优化 IP 信息的展示 UI",
+ "fr": "Optimisation de l'interface utilisateur pour l'affichage des informations IP",
+ "tr": "IP bilgilerini görüntüleme arayüzü optimize edildi"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v3.5",
+ "date": "Mar 3, 2024",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Added rule test feature",
+ "zh": "添加规则测试",
+ "fr": "Ajout du test de règles",
+ "tr": "Kural testi özelliği eklendi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Some Improvements",
+ "zh": "优化了部分逻辑",
+ "fr": "Quelques améliorations",
+ "tr": "Bazı İyileştirmeler"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v3.6",
+ "date": "Mar 10, 2024",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Added DNS resolution feature",
+ "zh": "添加 DNS 解析功能",
+ "fr": "Ajout de la fonction de résolution DNS",
+ "tr": "DNS çözümlemesi özelliği eklendi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Optimized home page structure, advanced features are now collapsible",
+ "zh": "优化主页结构,高级功能折叠展示",
+ "fr": "Optimisation de la structure de la page d'accueil, les fonctionnalités avancées sont désormais repliables",
+ "tr": "Ana sayfa yapısı optimize edildi, gelişmiş özellikler artık daraltılabilir"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Optimized program logic",
+ "zh": "优化了程序逻辑",
+ "fr": "Optimisation de la logique du programme",
+ "tr": "Program mantığı optimize edildi"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v3.7",
+ "date": "Apr 26, 2024",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Added censorship test feature",
+ "zh": "添加封锁测试功能",
+ "fr": "Fonctionnalité de test de censure ajoutée",
+ "tr": "Sansür testi özelliği eklendi"
+ }
+ },
+ {
+ "type": "add",
+ "change": {
+ "en": "Network speed test now allows custom packet size",
+ "zh": "网速测试可以自定义数据包大小",
+ "fr": "Le test de vitesse réseau permet maintenant de personnaliser la taille des paquets",
+ "tr": "Ağ hız testi artık özel paket boyutuna izin veriyor"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Optimized some functional logic",
+ "zh": "优化了部分功能逻辑",
+ "fr": "Optimisation de certaines logiques fonctionnelles",
+ "tr": "Bazı fonksiyonel mantıklar optimize edildi"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v3.8",
+ "date": "May 4, 2024",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Added preferences panel to save settings locally",
+ "zh": "增加设置面板,可以在本地保存偏好设置",
+ "fr": "Ajout du panneau de préférences pour enregistrer les paramètres localement",
+ "tr": "Ayarları yerel olarak kaydetmek için tercihler paneli eklendi"
+ }
+ },
+ {
+ "type": "add",
+ "change": {
+ "en": "Allow customization of multiple default behaviors on second program launch",
+ "zh": "可以自定义程序在第二次启动时的多个默认行为",
+ "fr": "Permettre la personnalisation de plusieurs comportements par défaut lors du deuxième lancement du programme",
+ "tr": "İkinci program açılışında birden fazla varsayılan davranışı özelleştirmeye izin ver"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Significantly optimized program logic",
+ "zh": "大量优化了程序的逻辑",
+ "fr": "Optimisation significative de la logique du programme",
+ "tr": "Program mantığı önemli ölçüde optimize edildi"
+ }
+ },
+ {
+ "type": "fix",
+ "change": {
+ "en": "Fixed some minor issues",
+ "zh": "修复了一些小问题",
+ "fr": "Correction de quelques problèmes mineurs",
+ "tr": "Bazı küçük sorunlar düzeltildi"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v3.9",
+ "date": "May 8, 2024",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Added Whois search feature",
+ "zh": "增加 Whois 查询功能",
+ "fr": "Ajout de la fonction de recherche Whois",
+ "tr": "Whois arama özelliği eklendi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Optimized display and animation effects for advanced tools",
+ "zh": "优化高级功能的展示与动画效果",
+ "fr": "Optimisation de l'affichage et des effets d'animation pour les outils avancés",
+ "tr": "Gelişmiş araçlar için görüntüleme ve animasyon efektleri optimize edildi"
+ }
+ },
+ {
+ "type": "fix",
+ "change": {
+ "en": "Fixed some minor issues",
+ "zh": "修复了一些小问题",
+ "fr": "Correction de quelques problèmes mineurs",
+ "tr": "Bazı küçük sorunlar düzeltildi"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v4.0",
+ "date": "May 13, 2024",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Refactored the entire project using Vue 3's Composition API",
+ "zh": "采用 Vue 3 的 Composition API 重构了整个项目",
+ "fr": "Refonte complète du projet en utilisant la Composition API de Vue 3",
+ "tr": "Tüm proje Vue 3'ün Composition API'si kullanılarak yeniden yazıldı"
+ }
+ },
+ {
+ "type": "add",
+ "change": {
+ "en": "Split the frontend into multiple modules to improve maintainability",
+ "zh": "拆分前端多个模块,提高了程序的可维护性",
+ "fr": "Découpage du frontend en plusieurs modules pour améliorer la maintenabilité du programme",
+ "tr": "Bakım kolaylığını artırmak için ön yüz birden fazla modüle bölündü"
+ }
+ },
+ {
+ "type": "add",
+ "change": {
+ "en": "Added Invisibility Test feature (Beta)",
+ "zh": "增加隐身测试功能(Beta)",
+ "fr": "Ajout de la Test d'invisibilité (bêta)",
+ "tr": "Görünmezlik Testi özelliği eklendi (Beta)"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Optimized backend program dependencies",
+ "zh": "优化后端程序的依赖结构",
+ "fr": "Optimisation de la structure des dépendances du backend",
+ "tr": "Arka uç program bağımlılıkları optimize edildi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Optimized numerous details",
+ "zh": "优化了大量细节",
+ "fr": "Optimisation de nombreux détails",
+ "tr": "Çok sayıda detay optimize edildi"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v4.1",
+ "date": "July 11, 2024",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Added MAC address lookup feature",
+ "zh": "添加 MAC 地址查询功能",
+ "fr": "Ajout de la fonction de recherche MAC",
+ "tr": "MAC adresi arama özelliği eklendi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Optimized numerous details",
+ "zh": "优化了部分程序细节",
+ "fr": "Optimisation de nombreux détails",
+ "tr": "Çok sayıda detay optimize edildi"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v4.2",
+ "date": "Sept 25, 2024",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Added browser information query feature",
+ "zh": "添加浏览器信息查询功能",
+ "fr": "Ajout de la fonction de requête d'informations du navigateur",
+ "tr": "Tarayıcı bilgisi sorgulama özelliği eklendi"
+ }
+ },
+ {
+ "type": "add",
+ "change": {
+ "en": "Added MaxMind GeoIP database",
+ "zh": "添加 MaxMind 地理数据库",
+ "fr": "Ajout de la base de données géographique MaxMind",
+ "tr": "MaxMind GeoIP veritabanı eklendi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Multiple experience enhancements",
+ "zh": "多处体验优化",
+ "fr": "Améliorations multiples de l'expérience",
+ "tr": "Çoklu deneyim geliştirmeleri"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v4.3",
+ "date": "Oct 30, 2024",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Added command line API feature",
+ "zh": "添加命令行 API 功能",
+ "fr": "Ajout de la fonctionnalité API en ligne de commande",
+ "tr": "Komut satırı API özelliği eklendi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "WebRTC test can now display regional information",
+ "zh": "WebRTC 测试可以展示地区信息",
+ "fr": "Le test WebRTC peut maintenant afficher des informations régionales",
+ "tr": "WebRTC testi artık bölgesel bilgileri görüntüleyebiliyor"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "DNS leak test can now display regional information",
+ "zh": "DNS 泄露测试可以展示地区信息",
+ "fr": "Le test de fuite DNS peut maintenant afficher des informations régionales",
+ "tr": "DNS sızıntı testi artık bölgesel bilgileri görüntüleyebiliyor"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v4.4",
+ "date": "Dec 7, 2024",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Language preferences",
+ "zh": "语言偏好设置",
+ "fr": "Préférences de langue",
+ "tr": "Dil tercihleri"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Map provider changed to Google",
+ "zh": "地图展示供应商变更为 Google",
+ "fr": "Fournisseur de carte changé en Google",
+ "tr": "Harita sağlayıcısı Google olarak değiştirildi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Other general optimizations",
+ "zh": "其它常规优化",
+ "fr": "Autres optimisations générales",
+ "tr": "Diğer genel optimizasyonlar"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v4.5",
+ "date": "Dec 25, 2024",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Add Security Checklist",
+ "zh": "添加安全检查清单",
+ "fr": "Liste de vérification de sécurité",
+ "tr": "Güvenlik Kontrol Listesi Eklendi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Other general optimizations",
+ "zh": "其它常规优化",
+ "fr": "Autres optimisations générales",
+ "tr": "Diğer genel optimizasyonlar"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v5.0",
+ "date": "Jan 31, 2025",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Add user system",
+ "zh": "新增用户系统",
+ "fr": "Ajout de la système d'utilisateur",
+ "tr": "Kullanıcı sistemi eklendi"
+ }
+ },
+ {
+ "type": "add",
+ "change": {
+ "en": "Add user achievement system",
+ "zh": "新增用户成就系统",
+ "fr": "Ajout de la système de réussite utilisateur",
+ "tr": "Kullanıcı başarı sistemi eklendi"
+ }
+ },
+ {
+ "type": "add",
+ "change": {
+ "en": "Add Lite version",
+ "zh": "新增 Lite 版本",
+ "fr": "Ajout de la version Lite",
+ "tr": "Lite sürümü eklendi"
+ }
+ },
+ {
+ "type": "add",
+ "change": {
+ "en": "Speed test can now display data change charts",
+ "zh": "网速测试可以看到数据变化图表",
+ "fr": "Le test de vitesse peut maintenant afficher des graphiques de données",
+ "tr": "Hız testi artık veri değişim grafiklerini görüntüleyebiliyor"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Code efficiency optimization",
+ "zh": "代码效率优化",
+ "fr": "Optimisation de la performance du code",
+ "tr": "Kod verimliliği optimizasyonu"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v5.1",
+ "date": "Nov 12, 2025",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Added support for Turkish language",
+ "zh": "支持土耳其语",
+ "fr": "Ajout de la prise en charge de la langue turque",
+ "tr": "Türkçe dil desteği eklendi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Optimized code efficiency",
+ "zh": "代码效率优化",
+ "fr": "Optimisation de l'efficacité du code",
+ "tr": "Kod verimliliği optimize edildi"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v5.2",
+ "date": "Jan 05, 2026",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Enhanced ASN information richness",
+ "zh": "提升 ASN 信息的丰富性",
+ "fr": "Amélioration de la richesse des informations ASN",
+ "tr": "ASN bilgilerinin zenginliği artırıldı"
+ }
+ },
+ {
+ "type": "add",
+ "change": {
+ "en": "Added IP quality score display",
+ "zh": "IP 质量分数显示",
+ "fr": "Affichage de la qualité IP",
+ "tr": "IP kalite puanı görüntüleme"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Optimized code efficiency",
+ "zh": "代码效率优化",
+ "fr": "Optimisation de l'efficacité du code",
+ "tr": "Kod verimliliği optimize edildi"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v5.3",
+ "date": "Apr 14, 2026",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Added MaxMind GeoIP database auto-update",
+ "zh": "MaxMind 地理数据库自动更新",
+ "fr": "Mise à jour automatique de la base de données géographique MaxMind",
+ "tr": "MaxMind GeoIP veritabanı otomatik güncelleme"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Optimized caching strategy",
+ "zh": "优化缓存策略",
+ "fr": "Optimisation de la stratégie de cache",
+ "tr": "Önbellek stratejisi optimize edildi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Significantly improved build speed",
+ "zh": "大大提升构建速度",
+ "fr": "Amélioration significative de la vitesse de construction",
+ "tr": "Kod verimliliği optimize edildi, yapı hızı büyük ölçüde artırıldı"
+ }
+ }
+ ]
+ },
+ {
+ "version": "v6.0",
+ "date": "Apr 19, 2026",
+ "content": [
+ {
+ "type": "add",
+ "change": {
+ "en": "Refactored the entire project with Shadcn UI + Tailwind CSS",
+ "zh": "使用 Shadcn UI + Tailwind CSS 重构了整个项目",
+ "fr": "Refonte complète du projet avec Shadcn UI + Tailwind CSS",
+ "tr": "Tüm proje Shadcn UI + Tailwind CSS ile yeniden yazıldı"
+ }
+ },
+ {
+ "type": "add",
+ "change": {
+ "en": "Improved AI-development friendliness via multiple Agents.md files",
+ "zh": "通过多个 Agents.md 提升 AI 开发友好性",
+ "fr": "Amélioration de la compatibilité avec le développement assisté par IA grâce à plusieurs fichiers Agents.md",
+ "tr": "Birden çok Agents.md dosyasıyla AI geliştirme dostluğu iyileştirildi"
+ }
+ },
+ {
+ "type": "add",
+ "change": {
+ "en": "Added automated tests to improve robustness",
+ "zh": "增加自动测试功能,提升程序健壮性",
+ "fr": "Ajout de tests automatisés pour améliorer la robustesse",
+ "tr": "Sağlamlığı artırmak için otomatik testler eklendi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "More component-oriented design, easier to maintain and extend",
+ "zh": "更加组件化的设计,更方便维护和扩展",
+ "fr": "Conception davantage orientée composants, plus facile à maintenir et à étendre",
+ "tr": "Bakımı ve genişletmesi daha kolay, daha bileşen odaklı tasarım"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Reorganized the project directory structure for better clarity",
+ "zh": "重新设计程序目录结构,使其更加清晰易懂",
+ "fr": "Réorganisation de la structure des répertoires du projet pour plus de clarté",
+ "tr": "Daha net ve anlaşılır olması için proje dizin yapısı yeniden düzenlendi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "All pages redesigned with a more modern look and feel",
+ "zh": "所有页面全部重新设计,更具现代化美感",
+ "fr": "Toutes les pages redessinées avec une esthétique plus moderne",
+ "tr": "Tüm sayfalar daha modern bir görünümle yeniden tasarlandı"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Faster build times and smaller bundle size",
+ "zh": "提升程序打包速度,减少打包体积",
+ "fr": "Temps de compilation plus rapides et taille de bundle réduite",
+ "tr": "Daha hızlı derleme süreleri ve daha küçük paket boyutu"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Significantly simplified the backend to improve performance",
+ "zh": "后端程序大量简化,提升程序性能",
+ "fr": "Backend largement simplifié pour améliorer les performances",
+ "tr": "Performansı artırmak için arka uç önemli ölçüde basitleştirildi"
+ }
+ },
+ {
+ "type": "improve",
+ "change": {
+ "en": "Polished comments across the codebase for better readability",
+ "zh": "优化程序里所有的注释,使其更加清晰易懂",
+ "fr": "Commentaires affinés dans tout le code source pour une meilleure lisibilité",
+ "tr": "Daha iyi okunabilirlik için kod tabanındaki tüm yorumlar iyileştirildi"
+ }
+ },
+ {
+ "type": "fix",
+ "change": {
+ "en": "Fixed multiple bugs and improved overall stability",
+ "zh": "修复了多个 Bug,提升了程序稳定性",
+ "fr": "Correction de plusieurs bugs et amélioration de la stabilité globale",
+ "tr": "Birden fazla hata düzeltildi ve genel kararlılık iyileştirildi"
+ }
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/frontend/utils/country-name.js b/frontend/data/country-name.js
similarity index 99%
rename from frontend/utils/country-name.js
rename to frontend/data/country-name.js
index 9fc50acce..19a3bb15b 100644
--- a/frontend/utils/country-name.js
+++ b/frontend/data/country-name.js
@@ -1263,7 +1263,7 @@ const countryList =
}
];
-// 导出
+
export default function getCountryName(abbr, lang) {
const country = countryList.find(item => item.abbr === abbr);
return country ? country[lang] : '';
diff --git a/frontend/data/default-preferences.js b/frontend/data/default-preferences.js
new file mode 100644
index 000000000..e6a68bf43
--- /dev/null
+++ b/frontend/data/default-preferences.js
@@ -0,0 +1,24 @@
+// Default user preferences
+//
+// When userPreferences key is missing or missing fields in localStorage, use this default value as fallback.
+// store.loadPreferences() will merge localStorage override values.
+
+export const DEFAULT_PREFERENCES = Object.freeze({
+ theme: 'auto', // auto | light | dark
+ connectivityAutoRefresh: false,
+ simpleMode: false,
+ autoStart: true,
+ hideUnavailableIPStack: false,
+ popupConnectivityNotifications: true,
+ ipCardsToShow: 4,
+ ipGeoSource: 0,
+ lang: 'auto', // auto | zh | en | fr | tr
+});
+
+/**
+ * Returns a fresh default preferences object (writable copy).
+ * Avoid calling side directly modifying DEFAULT_PREFERENCES (Object.freeze also prevents).
+ */
+export function createDefaultPreferences() {
+ return { ...DEFAULT_PREFERENCES };
+}
diff --git a/frontend/data/ip-databases.js b/frontend/data/ip-databases.js
new file mode 100644
index 000000000..0f57d80c6
--- /dev/null
+++ b/frontend/data/ip-databases.js
@@ -0,0 +1,33 @@
+// IP database definitions
+//
+// Each item: { id, text, url, enabled }
+// - id numeric identifier, referenced elsewhere in the app (e.g. userPreferences.ipGeoSource)
+// - text UI display name, also lookup key (e.g. `WebRtcTest.vue` looks for "MaxMind")
+// - url template string, {{ip}} and {{lang}} will be replaced by buildDbUrl()
+// - enabled initial enabled state (user can toggle in Preferences, store will write back this field)
+
+export const IP_DATABASES = [
+ { id: 0, text: 'IPCheck.ing', url: '/api/ipchecking?ip={{ip}}&lang={{lang}}', enabled: true },
+ { id: 1, text: 'IPinfo.io', url: '/api/ipinfo?ip={{ip}}', enabled: true },
+ { id: 2, text: 'IP-API.com', url: '/api/ipapicom?ip={{ip}}&lang={{lang}}', enabled: true },
+ { id: 3, text: 'IPAPI.is', url: '/api/ipapiis?ip={{ip}}', enabled: true },
+ { id: 4, text: 'IP2Location.io', url: '/api/ip2location?ip={{ip}}', enabled: true },
+ { id: 5, text: 'IP.sb', url: '/api/ipsb?ip={{ip}}', enabled: true },
+ { id: 6, text: 'MaxMind', url: '/api/maxmind?ip={{ip}}&lang={{lang}}', enabled: true },
+];
+
+/**
+ * Returns a fresh ipDBs array (store state initial value), not sharing references with exported IP_DATABASES.
+ */
+export function createInitialIpDBs() {
+ return IP_DATABASES.map((db) => ({ ...db }));
+}
+
+/**
+ * Pure function: render the final request URL based on the data source record and IP/lang.
+ * Extracted to data layer for convenience of unit tests, avoiding dependency on Pinia store.
+ */
+export function buildDbUrl(db, ip, lang) {
+ if (!db || !db.url) return null;
+ return db.url.replace('{{ip}}', ip).replace('{{lang}}', lang || 'en');
+}
diff --git a/frontend/data/sections.js b/frontend/data/sections.js
new file mode 100644
index 000000000..728aa6445
--- /dev/null
+++ b/frontend/data/sections.js
@@ -0,0 +1,54 @@
+// Main section IDs for the page
+//
+// This set of IDs is used in multiple places:
+// - store.mountingStatus / loadingStatus key set
+// - composables/use-section-tracking.js scroll monitoring and `store.changeSection()`
+// - App.vue shortcut scroll targets
+// - Nav.vue top navigation item loop
+//
+
+export const SECTION_IDS = [
+ 'IPInfo',
+ 'Connectivity',
+ 'WebRTC',
+ 'DNSLeakTest',
+ 'SpeedTest',
+ 'AdvancedTools',
+];
+
+export const DEFAULT_SECTION = 'IPInfo';
+
+// store.mountingStatus key mapping (lowercase snake-ish format, compatible with historical naming)
+const MOUNTING_KEYS = [
+ 'ipcheck',
+ 'connectivity',
+ 'webrtc',
+ 'dnsleaktest',
+ 'speedtest',
+ 'advancedtools',
+];
+
+// store.loadingStatus key mapping (subset of mounting: without speedtest / advancedtools)
+const LOADING_KEYS = [
+ 'ipcheck',
+ 'connectivity',
+ 'webrtc',
+ 'dnsleaktest',
+];
+
+function createStatusObject(keys) {
+ return keys.reduce((acc, key) => {
+ acc[key] = false;
+ return acc;
+ }, {});
+}
+
+/** Returns a fresh mountingStatus initial object */
+export function createMountingStatus() {
+ return createStatusObject(MOUNTING_KEYS);
+}
+
+/** Returns a fresh loadingStatus initial object */
+export function createLoadingStatus() {
+ return createStatusObject(LOADING_KEYS);
+}
diff --git a/frontend/utils/speedtest-colos.js b/frontend/data/speedtest-colos.js
similarity index 100%
rename from frontend/utils/speedtest-colos.js
rename to frontend/data/speedtest-colos.js
diff --git a/frontend/firebase-init.js b/frontend/firebase-init.js
index 64feaaac9..51bfb8b0a 100644
--- a/frontend/firebase-init.js
+++ b/frontend/firebase-init.js
@@ -3,10 +3,12 @@ import { initializeApp } from "firebase/app";
import { getAuth } from "firebase/auth";
let auth;
+// import.meta.env only exists in Vite; Node / test environment may not have it, use optional chaining to fallback
+const env = import.meta.env ?? {};
const firebaseConfig = {
- apiKey: import.meta.env.VITE_FIREBASE_API_KEY,
- authDomain: import.meta.env.VITE_FIREBASE_AUTH_DOMAIN,
- projectId: import.meta.env.VITE_FIREBASE_PROJECT_ID,
+ apiKey: env.VITE_FIREBASE_API_KEY,
+ authDomain: env.VITE_FIREBASE_AUTH_DOMAIN,
+ projectId: env.VITE_FIREBASE_PROJECT_ID,
};
const isFireBaseSet = !!firebaseConfig.apiKey && !!firebaseConfig.authDomain && !!firebaseConfig.projectId;
diff --git a/frontend/lib/utils.js b/frontend/lib/utils.js
new file mode 100644
index 000000000..63446cecf
--- /dev/null
+++ b/frontend/lib/utils.js
@@ -0,0 +1,8 @@
+// Shadcn-vue cn() helper function: merge classes, handle Tailwind conflicts
+
+import { clsx } from 'clsx';
+import { twMerge } from 'tailwind-merge';
+
+export function cn(...inputs) {
+ return twMerge(clsx(inputs));
+}
diff --git a/frontend/locales/en.json b/frontend/locales/en.json
index 3c3eed312..af6304d63 100644
--- a/frontend/locales/en.json
+++ b/frontend/locales/en.json
@@ -159,8 +159,6 @@
"appSettings": "Program Settings",
"autoRun": "Auto Run",
"autoRunTips": "If disabled, the app will only check the local IP and will not run tests automatically.",
- "showMap": "Show Map",
- "showMapTips": "Displays a map on the IP info card.",
"simpleMode": "Simple Mode",
"simpleModeTips": "Reduces the information displayed on IP cards. Effective on mobile devices only.",
"connectivityAutoRefresh": "Multiple Connectivity Refreshes",
@@ -261,7 +259,6 @@
"Note": "Checks the availability of target websites in four regions known for rigorous internet censorship, including: Mainland China, Saudi Arabia, Russia, and Turkey. Tests are also conducted from regions with relatively free internet as a control group for verification. Some regions have clear legal provisions for internet censorship, while others are more vague.",
"Note2": "Please enter a URL or domain name to start the censorship test:",
"Note3": "A website is only considered blocked if it cannot be accessed from all servers within the same country.",
- "Run": "Run Test",
"Placeholder": "URL or Domain Name",
"Country": "Region",
"Status": "Status",
@@ -280,7 +277,6 @@
"Title": "Invisibility Test",
"Note": "When you use a proxy or VPN, do the websites you visit really not know that you are using a proxy? Are you truly invisible? We will use various methods to try to calculate the vulnerabilities in your disguise and find evidence that you are using a proxy. Although some test results may not be completely accurate, this test is still highly informative.",
"Note2": "After clicking Run, the system will run a script that usually completes all tests within 10 seconds. During this process, your IP information, browser information, etc. will be collected and analyzed in the background.",
- "Run": "Run Test",
"fetchError": "Unable to fetch test results",
"yourIP": "Your main test IP is",
"proxyScore": "Proxy Percentage",
@@ -391,7 +387,6 @@
"Title": "MAC Lookup",
"Note": "Query the manufacturer of a physical address (MAC address), whether it is unicast/multicast, global/local, etc. Supports querying with a complete 12-digit address or just the prefix. You can also use this tool to verify if the physical address you generated meets your needs.",
"Note2": "Please enter a physical address to start the query:",
- "Run": "Query",
"Placeholder": "F0:2F:4B:01:0A:AA",
"invalidMAC": "Invalid physical address",
"fetchError": "Unable to fetch query results",
@@ -420,7 +415,6 @@
"Note2": "Please enter a domain name or IP address to start the query:",
"Note3": "Whois information contains various types of fields. The following is the raw text information",
"Placeholder": "Domain Name or IP",
- "Run": "Query",
"invalidURL": "Invalid domain name or IP",
"fetchError": "Unable to fetch query results or query results are empty",
"Provider": "Information Provider"
@@ -430,7 +424,6 @@
"Note": "In some regions, due to political or commercial reasons, some operators may contaminate certain domain names, resulting in incorrect results when accessed directly. Using DNS resolution checks will help you inspect the resolution results of domain names from well-known DNS providers around the world. Among the built-in DNS tests, some providers are from China, whose DNS resolution results may be contaminated. Please be discerning.",
"Note2": "Please enter a URL or domain name to start resolution:",
"Placeholder": "URL or Domain Name",
- "Run": "Run",
"invalidURL": "Invalid URL or Domain Name",
"fetchError": "Unable to fetch resolution results",
"Provider": "DNS Provider",
@@ -440,7 +433,7 @@
"ruletest": {
"Title": "Rule Test",
"Name": "Test",
- "Note": "Rule test is used to determine if the proxy software's domain-based rules are set correctly. Before conducting the test, you need to refer to the card below and set different domain-based routing rules for the 8 different URLs of IPCheck.ing in your proxy software.",
+ "Note": "Rule test is used to determine if the proxy software's domain-based rules are set correctly. Before conducting the test, you need to refer to the card below and set different domain-based routing rules for the 8 different URLs of IPCheck.ing in your proxy software. Usually, the rule settings may use a format like: DOMAIN, ptest-3.ipcheck.ing, POLICY. The specific format may vary depending on the proxy software you are using.",
"StatusWait": "Awaiting Test or Test Error",
"StatusError": "Test Error",
"Country": "Proxy region",
@@ -452,10 +445,10 @@
"RefreshWebRTC": "Refresh WebRTC Test",
"RefreshDNSLeakTest": "Refresh DNS Leak Test",
"SpeedTestButton": "Start/Pause Speed Test",
- "ToggleMaps": "Show/Hide Maps",
"SourceSelect": "Select IP Geolocation Source",
"ShowASNInfo": "Show AS Details",
"CopyIP": "Copy IP Address",
+ "ViewOnMap": "View location on map",
"InfoMask": "Hide IP Information",
"QueryIP": "Query IP Address",
"GithubLink": "View Source Code on GitHub",
@@ -484,6 +477,7 @@
"isProxy": "Proxy",
"qualityScore": "IP Quality",
"qualityScoreUnknown": "Score Unknown",
+ "advancedUnlockCta": "To avoid abuse, sign in to view the following information",
"ASNInfo": {
"trafficPercentage": "Traffic Percentage: ",
"note": "Data for this AS : ",
@@ -535,8 +529,8 @@
"id": "webrtc",
"Title": "WebRTC Test",
"Note": "WebRTC often establishes connections directly via UDP. If the test returns your real IP, it means your proxy settings do not cover these connections. In addition to detecting the IP you use when connecting to WebRTC, we also detect your NAT type. However, NAT type detection is not 100% accurate and is for reference only.",
- "StatusWait": "Awaiting Test or Connection Error",
- "StatusError": "Test Error",
+ "StatusWait": "Awaiting Test",
+ "StatusError": "Connection Error",
"NATType": {
"srflx": "Port Restricted Cone or Symmetric",
"prflx": "Port Restricted Cone",
@@ -547,11 +541,10 @@
},
"dnsleaktest": {
"id": "dnsleaktest",
- "Name": "Test",
+ "Name": "DNS Endpoint Test",
"Title": "DNS Leak Test",
"Note": "A DNS leak means that when you are connected to a VPN/proxy, your domain name resolutions are still done through your local ISP, thus posing a risk of DNS leaks.",
"Note2": "The method to test for DNS leaks involves accessing a newly generated domain name to detect which regional DNS exit you are resolving through. If the endpoint region returned matches your local service provider's region, there is a risk of DNS leakage. In this case, you may need to modify your VPN/proxy settings.",
- "Endpoint": "DNS Endpoint",
"EndpointCountry": "Endpoint Region",
"StatusWait": "Awaiting Test",
"StatusError": "Test Error"
@@ -596,7 +589,6 @@
"PacketLoss": "Packet Loss",
"ReceivedPackets": "Received",
"DroppedPackets": "Dropped",
- "Run": "Run Test",
"Error": "Test failed, it looks like your IP is not allowed to perform Ping test."
},
"mtrtest": {
@@ -607,14 +599,12 @@
"Note3": "Please select your IP address for testing.",
"SelectIP": "Select an IP Address",
"Region": "Region",
- "Run": "Run Test",
"Error": "Test failed, it looks like your IP is not allowed to perform MTR test."
},
"ipcheck": {
"id": "ipcheck",
"Title": "IP Check",
"Placeholder": "Please enter an IP address",
- "Button": "Check",
"Error": "Please enter a valid IPv4 or IPv6 address."
},
"alert": {
@@ -649,13 +639,13 @@
"MTRTest": "Open MTR Test panel",
"RuleTest": "Open Rule Test panel",
"DNSResolver": "Open DNS Resolution panel",
- "ToggleMaps": "Toggle Maps",
"IPCheck": "Query IP Address",
"ToggleInfoMask": "Toggle Info Masking",
"Help": "Show Shortcut Keys",
"HelpNote": "People who use shortcuts are really awesome!",
"GoNext": "Next Card",
"GoPrevious": "Previous Card",
+ "OpenHighlightedTool": "Open Highlighted Advanced Tool",
"RefreshRuleTests": "Refresh Rule Tests",
"CensorshipCheck": "Open Censorship Check panel",
"Preferences": "Open Preferences",
@@ -671,7 +661,7 @@
"page": {
"title": "IPCheck.ing - Check My IP Address and Geolocation - Check WebRTC Connection IP - DNS Leak Test - Speed Test - Jason Ng Open Source",
"description": "A better and open source IP Toolbox. Easy to check what's your IPs, IP information, check for DNS leaks, examine WebRTC connections, test website availability, lookup DNS record, lookup Whois, and test latency from around the world.",
- "keywords": "MyIP,IP Tool,My IP,IP check,IP lookup,DNS leak test,WebRTC test,Speed test,DNS lookup,Whois lookup, Ping test, privacy test",
+ "keywords": "MyIP, IP tool, IP check, IP lookup, DNS leak test, WebRTC test, speed test, DNS lookup, WHOIS lookup, ping test, privacy test",
"footerLink": "https://github.com/jason5ng32/MyIP",
"copyRightName": "Originally from ",
"copyRightLink": "https://ipcheck.ing",
@@ -684,7 +674,7 @@
"Title": "About",
"product1": "IPCheck.ing is a free IP toolbox that helps you check your IP information, test website availability, examine DNS exit information, perform speed tests, global latency tests, MTR tests, and more.",
"product2": "This is an open-source project, and you can view the source code by clicking on the GitHub icon at the bottom of the page.",
- "product3": "Initially, this was a personal project for me to learn Vue.js and how to write code using ChatGPT. Over time, it gained more stars on GitHub, so I did a lot of refactoring and added many useful features. I hope you will enjoy it.",
+ "product3": "Initially, this was a personal project for me to learn Vue.js and how to write code using AI. Over time, it gained more stars on GitHub, so I did a lot of refactoring and added many useful features. I hope you will enjoy it.",
"meTitle": "About Me",
"me1": "My name is Jason Ng, also known as Achán online. I'm not a professional programmer, but I love coding, open-source, and sharing.",
"me2": "Most of the time, I work as a product manager, a blogger, a motorcyle rider and a geek.",
@@ -705,506 +695,6 @@
"Title": "Changelog",
"add": "Added",
"improve": "Improved",
- "fix": "Fixed",
- "versions": [
- {
- "version": "v1.0",
- "date": "Nov 06, 2020",
- "content": [
- {
- "type": "add",
- "change": "Display user's IP information"
- },
- {
- "type": "add",
- "change": "Display IP information before and after proxy"
- },
- {
- "type": "add",
- "change": "Check website availability"
- }
- ]
- },
- {
- "version": "v2.0",
- "date": "Nov 24, 2023",
- "content": [
- {
- "type": "add",
- "change": "Refactored the entire project using Vue2"
- },
- {
- "type": "improve",
- "change": "Refactored UI using Bootstrap v5"
- }
- ]
- },
- {
- "version": "v2.1",
- "date": "Nov 25, 2023",
- "content": [
- {
- "type": "add",
- "change": "Added WebRTC test"
- },
- {
- "type": "improve",
- "change": "Optimized program logic"
- }
- ]
- },
- {
- "version": "v2.2",
- "date": "Nov 26, 2023",
- "content": [
- {
- "type": "add",
- "change": "Added DNS leak test"
- },
- {
- "type": "add",
- "change": "Support displaying Bing maps in the frontend"
- },
- {
- "type": "improve",
- "change": "Multiple logic optimizations"
- }
- ]
- },
- {
- "version": "v2.3",
- "date": "Nov 27, 2023 ",
- "content": [
- {
- "type": "add",
- "change": "Added dark mode"
- },
- {
- "type": "add",
- "change": "Added minimalist mode for mobile"
- },
- {
- "type": "improve",
- "change": "Optimized file structure"
- }
- ]
- },
- {
- "version": "v2.4",
- "date": "Dec 1, 2023",
- "content": [
- {
- "type": "add",
- "change": "Added support for English language"
- },
- {
- "type": "add",
- "change": "Added information masking feature"
- },
- {
- "type": "add",
- "change": "Support PWA, can be installed on mobile and desktop"
- }
- ]
- },
- {
- "version": "v2.5",
- "date": "Dec 20, 2023",
- "content": [
- {
- "type": "add",
- "change": "Added support for keyboard shortcuts"
- },
- {
- "type": "add",
- "change": "Added website speed test feature"
- },
- {
- "type": "improve",
- "change": "Support deployment using Docker"
- },
- {
- "type": "improve",
- "change": "Support retrieving IP geolocation information from multiple sources"
- }
- ]
- },
- {
- "version": "v3.0",
- "date": "Jan 28, 2024",
- "content": [
- {
- "type": "add",
- "change": "Refactored the entire project using Vite + Vue3"
- },
- {
- "type": "add",
- "change": "Added global latency test feature"
- },
- {
- "type": "add",
- "change": "Added MTR test feature"
- },
- {
- "type": "improve",
- "change": "Multiple performance and user experience optimizations"
- }
- ]
- },
- {
- "version": "v3.1",
- "date": "Jan 30, 2024",
- "content": [
- {
- "type": "add",
- "change": "Added support for a new language: French"
- },
- {
- "type": "add",
- "change": "Added loading animation"
- },
- {
- "type": "improve",
- "change": "Optimized caching strategy"
- },
- {
- "type": "improve",
- "change": "Adjusted dark mode styles"
- },
- {
- "type": "fix",
- "change": "Fixed some minor issues"
- }
- ]
- },
- {
- "version": "v3.2",
- "date": "Feb 3, 2024",
- "content": [
- {
- "type": "add",
- "change": "Added NAT type detection"
- },
- {
- "type": "improve",
- "change": "Optimized PWA application experience"
- },
- {
- "type": "improve",
- "change": "Enhanced backend script security"
- }
- ]
- },
- {
- "version": "v3.3",
- "date": "Feb 6, 2024",
- "content": [
- {
- "type": "add",
- "change": "Added support for using different IP geolocation sources"
- },
- {
- "type": "improve",
- "change": "Improved user experience for connection availability detection"
- },
- {
- "type": "improve",
- "change": "Optimized UI experience"
- }
- ]
- },
- {
- "version": "v3.4",
- "date": "Feb 17, 2024",
- "content": [
- {
- "type": "add",
- "change": "Added ASN details viewer"
- },
- {
- "type": "add",
- "change": "Added proxy detection feature"
- },
- {
- "type": "improve",
- "change": "Optimized UI for displaying IP information"
- }
- ]
- },
- {
- "version": "v3.5",
- "date": "Mar 3, 2024",
- "content": [
- {
- "type": "add",
- "change": "Added rule test feature"
- },
- {
- "type": "improve",
- "change": "Some Improvements"
- }
- ]
- },
- {
- "version": "v3.6",
- "date": "Mar 10, 2024",
- "content": [
- {
- "type": "add",
- "change": "Added DNS resolution feature"
- },
- {
- "type": "improve",
- "change": "Optimized home page structure, advanced features are now collapsible"
- },
- {
- "type": "improve",
- "change": "Optimized program logic"
- }
- ]
- },
- {
- "version": "v3.7",
- "date": "Apr 26, 2024",
- "content": [
- {
- "type": "add",
- "change": "Added censorship test feature"
- },
- {
- "type": "add",
- "change": "Network speed test now allows custom packet size"
- },
- {
- "type": "improve",
- "change": "Optimized some functional logic"
- }
- ]
- },
- {
- "version": "v3.8",
- "date": "May 4, 2024",
- "content": [
- {
- "type": "add",
- "change": "Added preferences panel to save settings locally"
- },
- {
- "type": "add",
- "change": "Allow customization of multiple default behaviors on second program launch"
- },
- {
- "type": "improve",
- "change": "Significantly optimized program logic"
- },
- {
- "type": "fix",
- "change": "Fixed some minor issues"
- }
- ]
- },
- {
- "version": "v3.9",
- "date": "May 8, 2024",
- "content": [
- {
- "type": "add",
- "change": "Added Whois search feature"
- },
- {
- "type": "improve",
- "change": "Optimized display and animation effects for advanced tools"
- },
- {
- "type": "fix",
- "change": "Fixed some minor issues"
- }
- ]
- },
- {
- "version": "v4.0",
- "date": "May 13, 2024",
- "content": [
- {
- "type": "add",
- "change": "Refactored the entire project using Vue 3's Composition API"
- },
- {
- "type": "add",
- "change": "Split the frontend into multiple modules to improve maintainability"
- },
- {
- "type": "add",
- "change": "Added Invisibility Test feature (Beta)"
- },
- {
- "type": "improve",
- "change": "Optimized backend program dependencies"
- },
- {
- "type": "improve",
- "change": "Optimized numerous details"
- }
- ]
- },
- {
- "version": "v4.1",
- "date": "July 11, 2024",
- "content": [
- {
- "type": "add",
- "change": "Added MAC address lookup feature"
- },
- {
- "type": "improve",
- "change": "Optimized numerous details"
- }
- ]
- },
- {
- "version": "v4.2",
- "date": "Sept 25, 2024",
- "content": [
- {
- "type": "add",
- "change": "Added browser information query feature"
- },
- {
- "type": "add",
- "change": "Added MaxMind GeoIP database"
- },
- {
- "type": "improve",
- "change": "Multiple experience enhancements"
- }
- ]
- },
- {
- "version": "v4.3",
- "date": "Oct 30, 2024",
- "content": [
- {
- "type": "add",
- "change": "Added command line API feature"
- },
- {
- "type": "improve",
- "change": "WebRTC test can now display regional information"
- },
- {
- "type": "improve",
- "change": "DNS leak test can now display regional information"
- }
- ]
- },
- {
- "version": "v4.4",
- "date": "Dec 7, 2024",
- "content": [
- {
- "type": "add",
- "change": "Language preferences"
- },
- {
- "type": "improve",
- "change": "Map provider changed to Google"
- },
- {
- "type": "improve",
- "change": "Other general optimizations"
- }
- ]
- },
- {
- "version": "v4.5",
- "date": "Dec 25, 2024",
- "content": [
- {
- "type": "add",
- "change": "Add Security Checklist"
- },
- {
- "type": "improve",
- "change": "Other general optimizations"
- }
- ]
- },
- {
- "version": "v5.0",
- "date": "Jan 31, 2025",
- "content": [
- {
- "type": "add",
- "change": "Add user system"
- },
- {
- "type": "add",
- "change": "Add user achievement system"
- },
- {
- "type": "add",
- "change": "Add Lite version"
- },
- {
- "type": "add",
- "change": "Speed test can now display data change charts"
- },
- {
- "type": "improve",
- "change": "Code efficiency optimization"
- }
- ]
- },
- {
- "version": "v5.1",
- "date": "Nov 12, 2025",
- "content": [
- {
- "type": "add",
- "change": "Added support for Turkish language"
- },
- {
- "type": "improve",
- "change": "Optimized code efficiency"
- }
- ]
- },
- {
- "version": "v5.2",
- "date": "Jan 05, 2026",
- "content": [
- {
- "type": "add",
- "change": "Enhanced ASN information richness"
- },
- {
- "type": "add",
- "change": "Added IP quality score display"
- },
- {
- "type": "improve",
- "change": "Optimized code efficiency"
- }
- ]
- },
- {
- "version": "v5.3",
- "date": "Apr 14, 2026",
- "content": [
- {
- "type": "add",
- "change": "Added MaxMind GeoIP database auto-update"
- },
- {
- "type": "improve",
- "change": "Optimized caching strategy"
- },
- {
- "type": "improve",
- "change": "Significantly improved build speed"
- }
- ]
- }
- ]
+ "fix": "Fixed"
}
-}
\ No newline at end of file
+}
diff --git a/frontend/locales/fr.json b/frontend/locales/fr.json
index 15436ffab..534294e75 100644
--- a/frontend/locales/fr.json
+++ b/frontend/locales/fr.json
@@ -1,1210 +1,700 @@
{
- "user": {
- "SignIn": "Connexion",
- "SignInWithGoogle": "Connexion avec Google",
- "SignInWithGithub": "Connexion avec GitHub",
- "SignOut": "Déconnexion",
- "SignInToView": "Connectez-vous pour voir",
- "SignInToUse": "Connectez-vous pour utiliser",
- "InvalidUserToken": "Token utilisateur non valide",
- "MyAchievements": "Succès",
- "Fields": {
- "User": "Utilisateur",
- "CreatedAt": "Créé Le",
- "LastLogin": "Dernière Connexion",
- "Level": "Niveau d'Utilisateur",
- "FunctionUses": "Utilisation des Avancées",
- "Times": "Fois",
- "Fetching": "Recherche..."
- },
- "Level": {
- "Standard": "Utilisateur Standard",
- "Premium": "Utilisateur Premium",
- "Owner": "Administrateur",
- "Developer": "Développeur",
- "HonoraryMember": "Membre Honoraire"
- },
- "Benefits": {
- "Title": "Avantages Utilisateurs",
- "Benefit": "Avantage",
- "Note1": "En tant que produit open-source, l'utilisation de IPCheck.ing est gratuite.",
- "Note2": "Cependant, afin de prévenir les abus, nous limitons certaines fonctionnalités. En vous connectant, vous obtiendrez les avantages suivants :",
- "Benefit1": "Lorsque vous utilisez IPCheck.ing comme source de données IP, tous les champs sont affichés intégralement.",
- "Benefit2": "Peut utiliser le test d'invisibilité.",
- "Benefit3": "Peut voir les badges de réussite qu'il a obtenus",
- "Benefit4": "Réduit les restrictions d'accès à certaines fonctionnalités.",
- "FootNote": "D'autres avantages sont en cours de développement..."
- },
- "Achievements": {
- "Title": "Succès",
- "Note": "En utilisant IPCheck.ing, vous pouvez déclencher certains succès. Ici, vous pouvez voir tous vos succès.",
- "Get": "obtenus",
- "GetCount": "Succès obtenus:",
- "NotGet": "non obtenus",
- "NotGetCount": "Succès non obtenus",
- "FooterNote": "Parfois, il peut y avoir des succès limités dans le temps.",
- "Congrats": "🎉 Félicitations",
- "CongratsMessage": "Vous avez obtenu un nouvel accomplissement !",
- "NewAchievementIs": "Le nouvel accomplissement est :",
- "Type": {
- "IAmHuman": {
- "Title": "Je suis humain",
- "Meet": "Utiliser IPCheck.ing après s'être connecté"
- },
- "BarelyEnough": {
- "Title": "Tout juste suffisant",
- "Meet": "Vitesse de téléchargement supérieure à 100 Mb/s"
- },
- "RapidPace": {
- "Title": "Allure rapide",
- "Meet": "Vitesse de téléchargement supérieure à 500 Mb/s"
- },
- "TorrentFlow": {
- "Title": "Flux torrentiel",
- "Meet": "Vitesse de téléchargement supérieure à 1000 Mb/s"
- },
- "SteadyGoing": {
- "Title": "Débit constant",
- "Meet": "Vitesse d'envoi supérieure à 50 Mb/s"
- },
- "TooFastTooSimple": {
- "Title": "Trop rapide, trop simple",
- "Meet": "Vitesse d'envoi supérieure à 200 Mb/s"
- },
- "SwiftAscent": {
- "Title": "Ascension rapide",
- "Meet": "Vitesse d'envoi supérieure à 1000 Mb/s"
- },
- "SurfaceCheck": {
- "Title": "Vérification superficielle",
- "Meet": "Terminer un élément de la liste de contrôle de sécurité"
- },
- "HalfwayThere": {
- "Title": "À mi-chemin",
- "Meet": "Terminer 50 % de la liste de contrôle de sécurité"
- },
- "FullySecured": {
- "Title": "Sécurisé à 100%",
- "Meet": "Terminer toute la liste de contrôle de sécurité"
- },
- "JustInCase": {
- "Title": "Au cas où",
- "Meet": "Effectuer un test de furtivité"
- },
- "HiddenWell": {
- "Title": "Bien caché",
- "Meet": "La probabilité de proxy et de VPN est de 0 dans le test de furtivité"
- },
- "SlipUp": {
- "Title": "Gaffe",
- "Meet": "La probabilité de proxy ou de VPN est supérieure à 50 % dans le test de furtivité"
- },
- "CleverTrickery": {
- "Title": "Ruse ingénieuse",
- "Meet": "Avoir consulté tous les raccourcis clavier"
- },
- "EnergySaver": {
- "Title": "Économe en énergie",
- "Meet": "Configurer le programme pour qu'il ne s'exécute pas automatiquement"
- },
- "ResourceHog": {
- "Title": "Gourmand en ressources",
- "Meet": "Configurer plusieurs rafraîchissements pour la disponibilité"
- },
- "MakingBigNews": {
- "Title": "Faire les gros titres",
- "Meet": "Les appels de fonctions avancées dépassent 1000 fois"
- },
- "GenerousDonor": {
- "Title": "Généreux donateur",
- "Meet": "Avoir fait un don au projet IPCheck.ing"
- },
- "ItIsOpen": {
- "Title": "C'est ouvert",
- "Meet": "Le test de censure a trouvé un site bloqué"
- },
- "CuriousCat": {
- "Title": "Chat curieux",
- "Meet": "Rechercher les informations de IPCheck.ing dans la recherche Whois"
- },
- "CrossingTheWall": {
- "Title": "Huit personnes traversent la muraille",
- "Meet": "Toutes les 8 adresses IP de test sont différentes dans le test de règles"
- }
- }
- }
+ "user": {
+ "SignIn": "Connexion",
+ "SignInWithGoogle": "Connexion avec Google",
+ "SignInWithGithub": "Connexion avec GitHub",
+ "SignOut": "Déconnexion",
+ "SignInToView": "Connectez-vous pour voir",
+ "SignInToUse": "Connectez-vous pour utiliser",
+ "InvalidUserToken": "Token utilisateur non valide",
+ "MyAchievements": "Succès",
+ "Fields": {
+ "User": "Utilisateur",
+ "CreatedAt": "Créé Le",
+ "LastLogin": "Dernière Connexion",
+ "Level": "Niveau d'Utilisateur",
+ "FunctionUses": "Utilisation des Avancées",
+ "Times": "Fois",
+ "Fetching": "Recherche..."
},
- "nav": {
- "id": "nav",
- "Title": "IPCheck.ing",
- "Navigation": "Navigation",
- "IPInfo": "Infos IP",
- "Connectivity": "Connectivité",
- "WebRTC": "Test WebRTC",
- "DNSLeakTest": "Test de fuite DNS",
- "SpeedTest": "Test de vitesse",
- "PingTest": "Latence mondiale",
- "MTRTest": "Test MTR",
- "RuleTest": "Test de règles",
- "AdvancedTools": "Outils avancés",
- "preferences": {
- "title": "Préférences",
- "preferenceTips": "Ces paramètres sont enregistrés dans votre navigateur pour une utilisation ultérieure. Certains paramètres nécessitent un rafraîchissement de la page pour prendre effet.",
- "colorScheme": "Schéma de Couleurs",
- "systemAuto": "Système",
- "colorLight": "Jour",
- "colorDark": "Nuit",
- "ipSourcesToCheck": "Serveurs pour vérifier les adresses IP",
- "ipSourcesToCheckTips": "Sélectionnez le nombre de serveurs pour vérifier votre adresse IP. Plus vous en sélectionnez, plus cela prendra de temps pour terminer la vérification.",
- "appSettings": "Paramètres de l'App",
- "autoRun": "Exécution Automatique",
- "autoRunTips": "Si désactivé, l'appli vérifiera seulement l'IP local et n'exécutera pas de tests automatiquement.",
- "showMap": "Afficher la Carte",
- "showMapTips": "Affiche une carte sur la carte d'info IP.",
- "simpleMode": "Mode Simple",
- "simpleModeTips": "Réduit les informations affichées sur les cartes IP. Effectif uniquement sur les appareils mobiles.",
- "connectivityAutoRefresh": "Rafraîchissements Multiples de Connectivité",
- "connectivityAutoRefreshTips": "Activé, l'appli effectue cinq vérifications au démarrage et affiche le délai le plus bas.",
- "popupConnectivityNotifications": "Alertes de Connectivité Pop-up",
- "popupConnectivityNotificationsTips": "Activé, les résultats de la première vérification sont affichés sous forme d'alerte pop-up.",
- "ipDB": "Base de données de géolocalisation IP",
- "ipDBTips": "Vous pouvez sélectionner la source de données de géolocalisation IP par défaut. Si la source sélectionnée n'est pas disponible, le système utilisera les sources suivantes.",
- "language": "Paramètres de langue",
- "languageTips": "Rafraîchissement du navigateur pour prendre effet."
- }
- },
- "securitychecklist": {
- "Title": "Liste de vérification de sécurité",
- "Note": "Ceci est une liste de vérification de cybersécurité très complète, couvrant des aspects tels que la sécurité des mots de passe, la sécurité de navigation, et la sécurité des dispositifs mobiles. Dans l'environnement actuel, une fuite d'informations peut entraîner des pertes significatives, il est donc nécessaire de s'assurer que nous protégeons notre vie privée et augmentons la sécurité de nos accès lors de la connexion à Internet.",
- "Note2": "Cette liste contient de nombreux éléments; vous n'avez pas besoin de tout vérifier en une seule fois. Les progrès seront sauvegardés dans le navigateur, et vous pouvez revenir à tout moment pour continuer les vérifications.",
- "Progress": "Progression des vérifications",
- "Item": "Élément",
- "Items": "Élément(s) ",
- "Priority": "Priorité",
- "Ignore": "Ignorer",
- "alert-total": "La vérification de sécurité a un total de",
- "alert-checked": "Vous avez complété",
- "alert-ignored": "Ignoré",
- "alert-unchecked": "Non vérifié.",
- "Checked": "Vérifié",
- "Ignored": "Ignoré",
- "Unchecked": "Non vérifié",
- "Basic": "De base",
- "Optional": "En option",
- "Essential": "Essentiel",
- "Advanced": "Avancé",
- "Reset": "Réinitialiser",
- "ShowAll": "Afficher tout",
- "ShowUnchecked": "Afficher les éléments non cochés",
- "ShowIgnored": "Afficher les éléments ignorés",
- "ShowChecked": "Afficher les éléments cochés",
- "Loading": "Chargement..."
+ "Level": {
+ "Standard": "Utilisateur Standard",
+ "Premium": "Utilisateur Premium",
+ "Owner": "Administrateur",
+ "Developer": "Développeur",
+ "HonoraryMember": "Membre Honoraire"
},
- "curl": {
- "Title": "API de ligne de commande",
- "Note1": "Eh bien, il s'avère que toi aussi tu aimes utiliser le terminal ?",
- "Note2_1": "Tu peux, dans le terminal, via",
- "Note2_2": "commande, obtenir l'adresse IP de cette machine",
- "Note3": "est un chemin optionnel, son ajout permettra d'obtenir les informations géographiques de l'IP",
- "Note4": "est votre clé API IPCheck.ing",
- "getIPv4": "Obtenir l'adresse IPv4 de la machine locale",
- "getIPv6": "Obtenir l'adresse IPv6 de la machine locale",
- "get6and4": "Obtenir l'adresse IP de sortie de réseau préférée de la machine locale",
- "notAvailable": "Cette fonctionnalité n'est pas encore disponible"
+ "Benefits": {
+ "Title": "Avantages Utilisateurs",
+ "Benefit": "Avantage",
+ "Note1": "En tant que produit open-source, l'utilisation de IPCheck.ing est gratuite.",
+ "Note2": "Cependant, afin de prévenir les abus, nous limitons certaines fonctionnalités. En vous connectant, vous obtiendrez les avantages suivants :",
+ "Benefit1": "Lorsque vous utilisez IPCheck.ing comme source de données IP, tous les champs sont affichés intégralement.",
+ "Benefit2": "Peut utiliser le test d'invisibilité.",
+ "Benefit3": "Peut voir les badges de réussite qu'il a obtenus",
+ "Benefit4": "Réduit les restrictions d'accès à certaines fonctionnalités.",
+ "FootNote": "D'autres avantages sont en cours de développement..."
},
- "browserinfo": {
- "Title": "Informations du Navigateur",
- "Note": "Cette page affiche deux types d'informations sur le navigateur : les informations de base extraites de l'agent utilisateur du navigateur et une empreinte numérique du navigateur calculée à travers diverses métriques de données. Les empreintes numériques du navigateur sont similaires aux empreintes palmaires ; plus votre navigateur expose d'informations, plus votre unicité sur les sites web est élevée, ce qui vous rend plus facilement traçable. Parfois, même en passant en mode privé ou en changeant de navigateur, l'empreinte peut ne pas changer.",
- "Note2": "Les méthodes de calcul des empreintes numériques des navigateurs sont variées, et différentes approches techniques peuvent conduire à des résultats incohérents. Ici, nous utilisons une méthode relativement simple pour le calcul.",
- "browser": {
- "Infos": "Informations du Navigateur",
- "browserName": "Nom du Navigateur",
- "browserVersion": "Version",
- "engineName": "Moteur",
- "engineVersion": "Version",
- "osName": "Système d'Exploitation",
- "osVersion": "Version",
- "deviceModel": "Modèle",
- "deviceVendor": "Fabricant",
- "cpuArchitecture": "Architecture CPU",
- "gpu": "GPU",
- "cpuCores": "Cœurs CPU",
- "language": "Code Langue",
- "cookieEnabled": "Cookies Activés",
- "cookieEnabledTrue": "Oui",
- "cookieEnabledFalse": "Non"
+ "Achievements": {
+ "Title": "Succès",
+ "Note": "En utilisant IPCheck.ing, vous pouvez déclencher certains succès. Ici, vous pouvez voir tous vos succès.",
+ "Get": "obtenus",
+ "GetCount": "Succès obtenus:",
+ "NotGet": "non obtenus",
+ "NotGetCount": "Succès non obtenus",
+ "FooterNote": "Parfois, il peut y avoir des succès limités dans le temps.",
+ "Congrats": "🎉 Félicitations",
+ "CongratsMessage": "Vous avez obtenu un nouvel accomplissement !",
+ "NewAchievementIs": "Le nouvel accomplissement est :",
+ "Type": {
+ "IAmHuman": {
+ "Title": "Je suis humain",
+ "Meet": "Utiliser IPCheck.ing après s'être connecté"
},
- "fingerprint": {
- "Infos": "Informations sur l'Empreinte",
- "fingerprint": "Code d'Empreinte",
- "changeOption": "Vous pouvez essayer de modifier les données utilisées pour calculer l'empreinte du navigateur afin d'observer les variations (n'oubliez pas de vérifier en mode privé).",
- "browserTips": "Certains navigateurs, comme Safari, protègent les utilisateurs contre le pistage en générant des valeurs d'empreinte différentes à chaque calcul, même lorsque les mêmes données sont sélectionnées."
+ "BarelyEnough": {
+ "Title": "Tout juste suffisant",
+ "Meet": "Vitesse de téléchargement supérieure à 100 Mb/s"
},
- "options": {
- "audio": "Audio",
- "canvas": "Canvas",
- "fonts": "Polices",
- "hardware": "Matériel",
- "locales": "Langues",
- "permissions": "Permissions",
- "plugins": "Plugins",
- "screen": "Écran",
- "system": "Version du Navigateur",
- "webgl": "WebGL",
- "math": "Mathématiques"
+ "RapidPace": {
+ "Title": "Allure rapide",
+ "Meet": "Vitesse de téléchargement supérieure à 500 Mb/s"
},
- "calError": "Échec du calcul des informations du navigateur, veuillez rafraîchir et réessayer.",
- "calculating": "Calcul en cours..."
- },
- "invisibilitytest": {
- "Title": "Test d'invisibilité",
- "Note": "Lorsque vous utilisez un proxy ou un VPN, les sites que vous visitez ne savent-ils vraiment pas que vous utilisez un proxy ? Êtes-vous réellement invisible ? Nous utiliserons plusieurs méthodes pour essayer de détecter les failles de votre anonymat et trouver des preuves de l'utilisation d'un proxy. Bien que certains résultats de test puissent ne pas être entièrement précis, ce test reste très instructif.",
- "Note2": "Après avoir cliqué sur Exécuter, le système exécutera un script qui terminera généralement tous les tests en moins de 10 secondes. Pendant ce processus, vos informations IP, les informations de votre navigateur, etc. seront collectées et analysées en arrière-plan.",
- "Run": "Exécuter le test",
- "fetchError": "Impossible de récupérer les résultats du test",
- "yourIP": "Votre adresse IP principale est",
- "scoreProxy": "Pourcentage de proxy",
- "scoreVPN": "Pourcentage de VPN",
- "isProxy": "Vous utilisez probablement un proxy.",
- "notProxy": "Aucune preuve d'utilisation d'un proxy n'a été trouvée.",
- "isVPN": "Vous utilisez probablement un VPN.",
- "notVPN": "Aucune preuve d'utilisation d'un VPN n'a été trouvée.",
- "itemName": "Élément de test",
- "itemProxyResult": "Résultat du test",
- "itemComment": "Analyse",
- "agreement": "J'accepte",
- "blocklist": {
- "proxy": {
- "title": "Liste de Proxys",
- "positive": "Votre IP est dans la liste des proxys.",
- "negative": "Votre IP n'est pas dans la liste des proxys."
- },
- "vpn": {
- "title": "Liste de VPNs",
- "positive": "Votre IP est dans la liste des VPNs.",
- "negative": "Votre IP n'est pas dans la liste des VPNs."
- },
- "vpnExitNode": {
- "title": "Liste des Noeuds de Sortie VPN",
- "positive": "Votre IP est dans la liste des nœuds de sortie VPN.",
- "negative": "Votre IP n'est pas dans la liste des nœuds de sortie VPN."
- }
+ "TorrentFlow": {
+ "Title": "Flux torrentiel",
+ "Meet": "Vitesse de téléchargement supérieure à 1000 Mb/s"
+ },
+ "SteadyGoing": {
+ "Title": "Débit constant",
+ "Meet": "Vitesse d'envoi supérieure à 50 Mb/s"
},
- "tor": {
- "title": "Noeud de Sortie TOR",
- "positive": "Votre IP est dans la liste des noeuds de sortie TOR.",
- "negative": "Votre IP n'est pas dans la liste des noeuds de sortie TOR."
+ "TooFastTooSimple": {
+ "Title": "Trop rapide, trop simple",
+ "Meet": "Vitesse d'envoi supérieure à 200 Mb/s"
},
- "headers": {
- "title": "En-têtes HTTP",
- "positive": "Vos en-têtes HTTP contiennent des informations de proxy, indiquant que vous utilisez peut-être un proxy.",
- "negative": "Vos en-têtes HTTP ne contiennent pas d'informations de proxy."
+ "SwiftAscent": {
+ "Title": "Ascension rapide",
+ "Meet": "Vitesse d'envoi supérieure à 1000 Mb/s"
},
- "datacenter": {
- "title": "IP de Centre de Données",
- "positive": "Votre IP est une IP de centre de données, ce qui n'est généralement pas utilisé par les utilisateurs réguliers.",
- "negative": "Votre IP n'est pas une IP de centre de données."
+ "SurfaceCheck": {
+ "Title": "Vérification superficielle",
+ "Meet": "Terminer un élément de la liste de contrôle de sécurité"
},
- "tcp": {
- "title": "Empreinte Digitale TCP",
- "positive": "Le système auquel vous vous connectez est différent de votre système informatique, indiquant que vous utilisez peut-être un proxy. Bien que le jugement du système puisse ne pas être précis, il est certain que les deux systèmes sont différents.",
- "computer": "Votre système informatique est : ",
- "server": "Le système auquel vous vous connectez pourrait être : ",
- "negative": "Le système auquel vous vous connectez est le même que votre système informatique."
+ "HalfwayThere": {
+ "Title": "À mi-chemin",
+ "Meet": "Terminer 50 % de la liste de contrôle de sécurité"
},
- "timezone": {
- "title": "Différence de Fuseau Horaire",
- "positive": "Votre fuseau horaire ne correspond pas au fuseau horaire de géolocalisation de votre IP, indiquant que vous utilisez peut-être un proxy.",
- "computer": "Votre fuseau horaire est : ",
- "server": "Le fuseau horaire de géolocalisation de votre IP est : ",
- "negative": "Votre fuseau horaire correspond au fuseau horaire de géolocalisation de votre IP."
+ "FullySecured": {
+ "Title": "Sécurisé à 100%",
+ "Meet": "Terminer toute la liste de contrôle de sécurité"
},
- "net": {
- "title": "Comportement Réseau",
- "positive": "D'après le comportement du réseau client, il a été constaté que vous utilisez peut-être un proxy ou un VPN.",
- "negative": "D'après le comportement du réseau client, il a été constaté que vous n'utilisez pas de proxy ou de VPN."
+ "JustInCase": {
+ "Title": "Au cas où",
+ "Meet": "Effectuer un test de furtivité"
},
- "webrtc": {
- "title": "Détection WebRTC",
- "positive": "WebRTC a détecté plusieurs adresses IP provenant de régions différentes, indiquant que vous utilisez peut-être un proxy ou un VPN.",
- "ipsAre": "Les adresses IP sont : ",
- "negative": "Aucune preuve de multiples adresses IP provenant de régions différentes n'a été trouvée lors de la détection WebRTC."
+ "HiddenWell": {
+ "Title": "Bien caché",
+ "Meet": "La probabilité de proxy et de VPN est de 0 dans le test de furtivité"
},
- "flow": {
- "title": "Caractéristiques du Trafic",
- "positive": "D'après les caractéristiques du trafic TCP/IP, il a été constaté que vous utilisez peut-être un proxy ou un VPN.",
- "negative": "D'après les caractéristiques du trafic TCP/IP, il a été constaté que vous n'utilisez pas de proxy ou de VPN."
+ "SlipUp": {
+ "Title": "Gaffe",
+ "Meet": "La probabilité de proxy ou de VPN est supérieure à 50 % dans le test de furtivité"
},
- "latencyVSWS": {
- "title": "Latence TCP vs WebSocket",
- "positive": "La différence entre la latence TCP et WebSocket est importante, indiquant que vous utilisez peut-être un proxy ou un VPN.",
- "fromTCP": "Valeur de latence TCP : ",
- "fromWS": "Valeur de latence WebSocket : ",
- "negative": "La différence entre la latence TCP et WebSocket n'est pas importante, indiquant que vous n'utilisez peut-être pas de proxy ou de VPN."
+ "CleverTrickery": {
+ "Title": "Ruse ingénieuse",
+ "Meet": "Avoir consulté tous les raccourcis clavier"
},
- "latencyVSPing": {
- "title": "Latence TCP vs Ping",
- "positive": "La différence entre la latence TCP et le Ping est importante, indiquant que vous utilisez peut-être un proxy ou un VPN.",
- "negative": "La différence entre la latence TCP et le Ping n'est pas importante, indiquant que vous n'utilisez peut-être pas de proxy ou de VPN."
+ "EnergySaver": {
+ "Title": "Économe en énergie",
+ "Meet": "Configurer le programme pour qu'il ne s'exécute pas automatiquement"
},
- "highlatency": {
- "title": "Analyse de Haute Latence",
- "positive": "L'analyse de haute latence indique que vous utilisez peut-être un proxy ou un VPN.",
- "negative": "Aucune preuve de votre utilisation d'un proxy ou d'un VPN n'a été trouvée lors de l'analyse de haute latence."
+ "ResourceHog": {
+ "Title": "Gourmand en ressources",
+ "Meet": "Configurer plusieurs rafraîchissements pour la disponibilité"
+ },
+ "MakingBigNews": {
+ "Title": "Faire les gros titres",
+ "Meet": "Les appels de fonctions avancées dépassent 1000 fois"
+ },
+ "GenerousDonor": {
+ "Title": "Généreux donateur",
+ "Meet": "Avoir fait un don au projet IPCheck.ing"
+ },
+ "ItIsOpen": {
+ "Title": "C'est ouvert",
+ "Meet": "Le test de censure a trouvé un site bloqué"
+ },
+ "CuriousCat": {
+ "Title": "Chat curieux",
+ "Meet": "Rechercher les informations de IPCheck.ing dans la recherche Whois"
+ },
+ "CrossingTheWall": {
+ "Title": "Huit personnes traversent la muraille",
+ "Meet": "Toutes les 8 adresses IP de test sont différentes dans le test de règles"
}
+ }
+ }
+ },
+ "nav": {
+ "id": "nav",
+ "Title": "IPCheck.ing",
+ "Navigation": "Navigation",
+ "IPInfo": "Infos IP",
+ "Connectivity": "Connectivité",
+ "WebRTC": "Test WebRTC",
+ "DNSLeakTest": "Test de fuite DNS",
+ "SpeedTest": "Test de vitesse",
+ "PingTest": "Latence mondiale",
+ "MTRTest": "Test MTR",
+ "RuleTest": "Test de règles",
+ "AdvancedTools": "Outils avancés",
+ "preferences": {
+ "title": "Préférences",
+ "preferenceTips": "Ces paramètres sont enregistrés dans votre navigateur pour une utilisation ultérieure. Certains paramètres nécessitent un rafraîchissement de la page pour prendre effet.",
+ "colorScheme": "Schéma de Couleurs",
+ "systemAuto": "Système",
+ "colorLight": "Jour",
+ "colorDark": "Nuit",
+ "ipSourcesToCheck": "Serveurs pour vérifier les adresses IP",
+ "ipSourcesToCheckTips": "Sélectionnez le nombre de serveurs pour vérifier votre adresse IP. Plus vous en sélectionnez, plus cela prendra de temps pour terminer la vérification.",
+ "appSettings": "Paramètres de l'App",
+ "autoRun": "Exécution Automatique",
+ "autoRunTips": "Si désactivé, l'appli vérifiera seulement l'IP local et n'exécutera pas de tests automatiquement.",
+ "simpleMode": "Mode Simple",
+ "simpleModeTips": "Réduit les informations affichées sur les cartes IP. Effectif uniquement sur les appareils mobiles.",
+ "connectivityAutoRefresh": "Rafraîchissements Multiples de Connectivité",
+ "connectivityAutoRefreshTips": "Activé, l'appli effectue cinq vérifications au démarrage et affiche le délai le plus bas.",
+ "popupConnectivityNotifications": "Alertes de Connectivité Pop-up",
+ "popupConnectivityNotificationsTips": "Activé, les résultats de la première vérification sont affichés sous forme d'alerte pop-up.",
+ "ipDB": "Base de données de géolocalisation IP",
+ "ipDBTips": "Vous pouvez sélectionner la source de données de géolocalisation IP par défaut. Si la source sélectionnée n'est pas disponible, le système utilisera les sources suivantes.",
+ "language": "Paramètres de langue",
+ "languageTips": "Rafraîchissement du navigateur pour prendre effet."
+ }
+ },
+ "securitychecklist": {
+ "Title": "Liste de vérification de sécurité",
+ "Note": "Ceci est une liste de vérification de cybersécurité très complète, couvrant des aspects tels que la sécurité des mots de passe, la sécurité de navigation, et la sécurité des dispositifs mobiles. Dans l'environnement actuel, une fuite d'informations peut entraîner des pertes significatives, il est donc nécessaire de s'assurer que nous protégeons notre vie privée et augmentons la sécurité de nos accès lors de la connexion à Internet.",
+ "Note2": "Cette liste contient de nombreux éléments; vous n'avez pas besoin de tout vérifier en une seule fois. Les progrès seront sauvegardés dans le navigateur, et vous pouvez revenir à tout moment pour continuer les vérifications.",
+ "Progress": "Progression des vérifications",
+ "Item": "Élément",
+ "Items": "Élément(s) ",
+ "Priority": "Priorité",
+ "Ignore": "Ignorer",
+ "alert-total": "La vérification de sécurité a un total de",
+ "alert-checked": "Vous avez complété",
+ "alert-ignored": "Ignoré",
+ "alert-unchecked": "Non vérifié.",
+ "Checked": "Vérifié",
+ "Ignored": "Ignoré",
+ "Unchecked": "Non vérifié",
+ "Basic": "De base",
+ "Optional": "En option",
+ "Essential": "Essentiel",
+ "Advanced": "Avancé",
+ "Reset": "Réinitialiser",
+ "ShowAll": "Afficher tout",
+ "ShowUnchecked": "Afficher les éléments non cochés",
+ "ShowIgnored": "Afficher les éléments ignorés",
+ "ShowChecked": "Afficher les éléments cochés",
+ "Loading": "Chargement..."
+ },
+ "curl": {
+ "Title": "API de ligne de commande",
+ "Note1": "Eh bien, il s'avère que toi aussi tu aimes utiliser le terminal ?",
+ "Note2_1": "Tu peux, dans le terminal, via",
+ "Note2_2": "commande, obtenir l'adresse IP de cette machine",
+ "Note3": "est un chemin optionnel, son ajout permettra d'obtenir les informations géographiques de l'IP",
+ "Note4": "est votre clé API IPCheck.ing",
+ "getIPv4": "Obtenir l'adresse IPv4 de la machine locale",
+ "getIPv6": "Obtenir l'adresse IPv6 de la machine locale",
+ "get6and4": "Obtenir l'adresse IP de sortie de réseau préférée de la machine locale",
+ "notAvailable": "Cette fonctionnalité n'est pas encore disponible"
+ },
+ "browserinfo": {
+ "Title": "Informations du Navigateur",
+ "Note": "Cette page affiche deux types d'informations sur le navigateur : les informations de base extraites de l'agent utilisateur du navigateur et une empreinte numérique du navigateur calculée à travers diverses métriques de données. Les empreintes numériques du navigateur sont similaires aux empreintes palmaires ; plus votre navigateur expose d'informations, plus votre unicité sur les sites web est élevée, ce qui vous rend plus facilement traçable. Parfois, même en passant en mode privé ou en changeant de navigateur, l'empreinte peut ne pas changer.",
+ "Note2": "Les méthodes de calcul des empreintes numériques des navigateurs sont variées, et différentes approches techniques peuvent conduire à des résultats incohérents. Ici, nous utilisons une méthode relativement simple pour le calcul.",
+ "browser": {
+ "Infos": "Informations du Navigateur",
+ "browserName": "Nom du Navigateur",
+ "browserVersion": "Version",
+ "engineName": "Moteur",
+ "engineVersion": "Version",
+ "osName": "Système d'Exploitation",
+ "osVersion": "Version",
+ "deviceModel": "Modèle",
+ "deviceVendor": "Fabricant",
+ "cpuArchitecture": "Architecture CPU",
+ "gpu": "GPU",
+ "cpuCores": "Cœurs CPU",
+ "language": "Code Langue",
+ "cookieEnabled": "Cookies Activés",
+ "cookieEnabledTrue": "Oui",
+ "cookieEnabledFalse": "Non"
},
- "censorshipcheck": {
- "Title": "Test de censorship",
- "Note": "Vérifie la disponibilité des sites cibles dans quatre régions connues pour une censure internet rigoureuse, incluant : la Chine continentale, l'Arabie Saoudite, la Russie, et la Turquie. Des tests sont également réalisés depuis des régions où l'internet est relativement libre, servant de groupe témoin pour la vérification. Certaines régions disposent de dispositions légales claires sur la censure internet, tandis que d'autres sont plus vagues.",
- "Note2": "Veuillez entrer une URL ou un nom de domaine pour commencer le test de censure :",
- "Note3": "Un site est considéré comme bloqué uniquement si aucun serveur dans le même pays ne peut y accéder.",
- "Run": "Lancer le Test",
- "Placeholder": "URL ou Nom de Domaine",
- "Country": "Région",
- "Status": "Statut",
- "City": "Ville",
- "Network": "Réseau",
- "invalidURL": "URL ou Nom de Domaine invalide",
- "fetchError": "Impossible de récupérer les résultats des tests",
- "isBlocked": "Ce site semble être bloqué dans certains pays, veuillez vous référer aux résultats des tests ci-dessus pour une détermination finale.",
- "notBlocked": "Ce site ne semble pas être bloqué, veuillez vous référer aux résultats des tests ci-dessus pour une détermination finale.",
- "isDown": "Il est difficile de déterminer si ce site est bloqué, car il semble inaccessible de nombreux endroits dans le monde. Si l'adresse que vous avez entrée est correcte, il est possible que le site lui-même rencontre des problèmes et ne soit pas accessible.",
- "Timeout": "Délai d'Attente du Test",
- "TestGroup": "Groupe de Test",
- "ControlGroup": "Groupe Témoin"
+ "fingerprint": {
+ "Infos": "Informations sur l'Empreinte",
+ "fingerprint": "Code d'Empreinte",
+ "changeOption": "Vous pouvez essayer de modifier les données utilisées pour calculer l'empreinte du navigateur afin d'observer les variations (n'oubliez pas de vérifier en mode privé).",
+ "browserTips": "Certains navigateurs, comme Safari, protègent les utilisateurs contre le pistage en générant des valeurs d'empreinte différentes à chaque calcul, même lorsque les mêmes données sont sélectionnées."
},
- "advancedtools": {
- "Title": "Outils avancés",
- "Note": "Certains outils sont utilisés relativement rarement, mais sont très utiles lors des tests de réseaux.",
- "PingTestNote": "Test de la valeur Ping mondiale",
- "MTRTestNote": "Test de route MTR mondial",
- "DNSResolverNote": "Résolution DNS multi-canal en temps réel",
- "RuleTestNote": "Vérifiez les paramètres de règles du logiciel de proxy",
- "CensorshipCheck": "Vérifier si un site est bloqué dans certains pays",
- "Whois": "Recherche d'informations sur l'enregistrement de domaine/IP",
- "InvisibilityTest": "Vérifiez si vous utilisez un proxy ou un VPN",
- "MacChecker": "Requête d'informations d'une adresse physique",
- "BrowserInfo": "Vérifier les informations du navigateur et l'empreinte digitale",
- "SecurityChecklist": "Guide pour sécuriser votre vie numérique"
+ "options": {
+ "audio": "Audio",
+ "canvas": "Canvas",
+ "fonts": "Polices",
+ "hardware": "Matériel",
+ "locales": "Langues",
+ "permissions": "Permissions",
+ "plugins": "Plugins",
+ "screen": "Écran",
+ "system": "Version du Navigateur",
+ "webgl": "WebGL",
+ "math": "Mathématiques"
},
- "macchecker": {
- "Title": "Recherche MAC",
- "Note": "Interroger le fabricant d'une adresse physique (adresse MAC), s'il s'agit d'une adresse unicast/multicast, globale/locale, etc. Prend en charge la requête avec une adresse complète de 12 chiffres ou juste le préfixe. Vous pouvez également utiliser cet outil pour vérifier si l'adresse physique que vous avez générée répond à vos besoins.",
- "Note2": "Veuillez saisir une adresse physique pour commencer la requête:",
- "Run": "Interroger",
- "Placeholder": "F0:2F:4B:01:0A:AA",
- "invalidMAC": "Adresse physique invalide",
- "fetchError": "Impossible de récupérer les résultats de la requête",
- "company": "Fabricant",
- "macPrefix": "Préfixe d'adresse physique",
- "address": "Adresse enregistrée",
- "country": "Pays/région enregistré",
- "blockStart": "Bloc de départ",
- "blockEnd": "Bloc de fin",
- "blockSize": "Taille du bloc",
- "blockType": "Type de bloc",
- "blockRange": "Plage du bloc",
- "isRand": "Adresse aléatoire",
- "isPrivate": "Données privées",
- "isMulticast": "Adresse multicast",
- "isUnicast": "Adresse unicast",
- "isGlobal": "Adresse mondiale",
- "isLocal": "Adresse locale",
- "property": "Propriété de l'adresse",
- "value": "Valeur",
- "manufacturer": "Détails du fabricant"
+ "calError": "Échec du calcul des informations du navigateur, veuillez rafraîchir et réessayer.",
+ "calculating": "Calcul en cours..."
+ },
+ "invisibilitytest": {
+ "Title": "Test d'invisibilité",
+ "Note": "Lorsque vous utilisez un proxy ou un VPN, les sites que vous visitez ne savent-ils vraiment pas que vous utilisez un proxy ? Êtes-vous réellement invisible ? Nous utiliserons plusieurs méthodes pour essayer de détecter les failles de votre anonymat et trouver des preuves de l'utilisation d'un proxy. Bien que certains résultats de test puissent ne pas être entièrement précis, ce test reste très instructif.",
+ "Note2": "Après avoir cliqué sur Exécuter, le système exécutera un script qui terminera généralement tous les tests en moins de 10 secondes. Pendant ce processus, vos informations IP, les informations de votre navigateur, etc. seront collectées et analysées en arrière-plan.",
+ "fetchError": "Impossible de récupérer les résultats du test",
+ "yourIP": "Votre adresse IP principale est",
+ "scoreProxy": "Pourcentage de proxy",
+ "scoreVPN": "Pourcentage de VPN",
+ "isProxy": "Vous utilisez probablement un proxy.",
+ "notProxy": "Aucune preuve d'utilisation d'un proxy n'a été trouvée.",
+ "isVPN": "Vous utilisez probablement un VPN.",
+ "notVPN": "Aucune preuve d'utilisation d'un VPN n'a été trouvée.",
+ "itemName": "Élément de test",
+ "itemProxyResult": "Résultat du test",
+ "itemComment": "Analyse",
+ "agreement": "J'accepte",
+ "blocklist": {
+ "proxy": {
+ "title": "Liste de Proxys",
+ "positive": "Votre IP est dans la liste des proxys.",
+ "negative": "Votre IP n'est pas dans la liste des proxys."
+ },
+ "vpn": {
+ "title": "Liste de VPNs",
+ "positive": "Votre IP est dans la liste des VPNs.",
+ "negative": "Votre IP n'est pas dans la liste des VPNs."
+ },
+ "vpnExitNode": {
+ "title": "Liste des Noeuds de Sortie VPN",
+ "positive": "Votre IP est dans la liste des nœuds de sortie VPN.",
+ "negative": "Votre IP n'est pas dans la liste des nœuds de sortie VPN."
+ }
},
- "whois": {
- "Title": "Recherche Whois",
- "Note": "La recherche Whois est un service utilisé pour récupérer des informations sur l'enregistrement d'un domaine. En entrant un nom de domaine ou une adresse IP, vous pouvez obtenir des informations telles que les détails d'enregistrement du domaine, le registraire, la date d'enregistrement, la date d'expiration, et plus encore. Les informations Whois pour les adresses IP et les noms de domaine peuvent avoir des champs différents. De plus, certains domaines de premier niveau (TLD) moins courants peuvent ne pas avoir d'informations disponibles pour les requêtes Whois.",
- "Note2": "Veuillez entrer un nom de domaine ou une adresse IP pour démarrer la requête :",
- "Note3": "Whois informations contient plusieurs types de champs, voici le texte brut original",
- "Placeholder": "Nom de domaine ou IP",
- "Run": "Rechercher",
- "invalidURL": "Nom de domaine ou IP invalide",
- "fetchError": "Impossible de récupérer les résultats de la requête ou les résultats de la requête sont vides",
- "Provider": "Fournisseur d'informations"
+ "tor": {
+ "title": "Noeud de Sortie TOR",
+ "positive": "Votre IP est dans la liste des noeuds de sortie TOR.",
+ "negative": "Votre IP n'est pas dans la liste des noeuds de sortie TOR."
},
- "dnsresolver": {
- "Title": "Résolution DNS",
- "Note": "Dans certaines régions, pour des raisons politiques ou commerciales, certains opérateurs peuvent contaminer certains noms de domaine, entraînant des résultats incorrects lorsqu'ils sont accédés directement. L'utilisation de vérifications de résolution DNS vous aidera à inspecter les résultats de résolution de noms de domaine auprès de fournisseurs DNS renommés dans le monde entier. Parmi les tests DNS intégrés, certains fournisseurs sont originaires de Chine, dont les résultats de résolution DNS peuvent être contaminés. Veuillez faire preuve de discernement.",
- "Note2": "Veuillez entrer une URL ou un nom de domaine pour commencer la résolution :",
- "Placeholder": "URL ou Nom de Domaine",
- "Run": "Exécuter",
- "invalidURL": "URL ou Nom de Domaine invalide",
- "fetchError": "Impossible de récupérer les résultats de résolution",
- "Provider": "Fournisseur DNS",
- "Result": "Résultat de la Résolution",
- "Record": "Enregistrement"
+ "headers": {
+ "title": "En-têtes HTTP",
+ "positive": "Vos en-têtes HTTP contiennent des informations de proxy, indiquant que vous utilisez peut-être un proxy.",
+ "negative": "Vos en-têtes HTTP ne contiennent pas d'informations de proxy."
},
- "ruletest": {
- "Title": "Test de règles",
- "Name": "Test",
- "Note": "Le test de règles est utilisé pour déterminer si les paramètres de règles basées sur le nom de domaine de votre logiciel proxy sont corrects. Avant de procéder au test, veuillez vous référer à la carte ci-dessous et configurer des règles de redirection de domaine différentes pour les 8 URL différentes d'IPCheck.ing dans votre logiciel proxy.",
- "StatusWait": "En attente du test ou erreur de connexion",
- "StatusError": "Erreur de test",
- "Country": "Région de proxy",
- "RefreshAll": "Actualiser tout"
+ "datacenter": {
+ "title": "IP de Centre de Données",
+ "positive": "Votre IP est une IP de centre de données, ce qui n'est généralement pas utilisé par les utilisateurs réguliers.",
+ "negative": "Votre IP n'est pas une IP de centre de données."
},
- "Tooltips": {
- "RefreshIPCard": "Actualiser la carte IP",
- "RefreshConnectivityTests": "Actualiser les tests de connectivité",
- "RefreshWebRTC": "Actualiser le test WebRTC",
- "RefreshDNSLeakTest": "Actualiser le test de fuite DNS",
- "SpeedTestButton": "Démarrer/Pause le test de vitesse",
- "ToggleMaps": "Afficher/Masquer les cartes",
- "SourceSelect": "Sélectionner la source de géolocalisation IP",
- "ShowASNInfo": "Afficher les détails AS",
- "CopyIP": "Copier l'adresse IP",
- "InfoMask": "Masquer les informations IP",
- "QueryIP": "Interroger l'adresse IP",
- "GithubLink": "Voir le code source sur GitHub",
- "RefreshRuleTests": "Actualiser les tests de règles",
- "qualityScoreExplain": "Le score de qualité IP est calculé sur la base de plusieurs facteurs pondérés, incluant le type d'IP, si c'est un proxy/VPN, et le nombre d'événements d'attaque récemment détectés provenant de cette IP. Un score plus élevé indique une meilleure qualité de l'IP, réduisant la probabilité d'être bloqué par le contrôle de risques sur certains sites."
+ "tcp": {
+ "title": "Empreinte Digitale TCP",
+ "positive": "Le système auquel vous vous connectez est différent de votre système informatique, indiquant que vous utilisez peut-être un proxy. Bien que le jugement du système puisse ne pas être précis, il est certain que les deux systèmes sont différents.",
+ "computer": "Votre système informatique est : ",
+ "server": "Le système auquel vous vous connectez pourrait être : ",
+ "negative": "Le système auquel vous vous connectez est le même que votre système informatique."
},
- "ipInfos": {
- "id": "ipinfos",
- "database": "Données",
- "Title": "Infos IP",
- "Notes": "Le programme vérifie d'abord votre adresse IP à partir des sources différentes (y compris IPv4 et IPv6), puis interroge les données géographiques correspondantes à partir de la source d'informations de localisation IP que vous avez sélectionnée. Si vous n'avez qu'une seule pile IP active, les sources de données non disponibles seront affichées comme vides.",
- "Simple": "Simple",
- "Map": "Carte",
- "MapUnavailable": "Carte non disponible",
- "Source": "Source IP",
- "IP": "IP",
- "Country": "Région",
- "Region": "État",
- "City": "Ville",
- "ISP": "ISP",
- "ASN": "ASN",
- "IPv4Error": "Échec de récupération ou pas d'adresse IPv4",
- "IPv6Error": "Échec de récupération ou pas d'adresse IPv6",
- "SelectSource": "Source de géolocalisation IP",
- "type": "Type",
- "isProxy": "Proxy",
- "qualityScore": "Qualité IP",
- "qualityScoreUnknown": "Score inconnu",
- "ASNInfo": {
- "trafficPercentage": "Pourcentage de trafic : ",
- "note": "Données associées à cet AS : ",
- "asnName": "Nom de l'AS : ",
- "asnOrgName": "Organisation de l'AS : ",
- "asnCountryCode": "Région de l'AS : ",
- "estimatedUsers": "Nombre d'utilisateurs estimé : ",
- "IPv4_Pct": "IPv4 : ",
- "IPv6_Pct": "IPv6 : ",
- "HTTP_Pct": "HTTP : ",
- "HTTPS_Pct": "HTTPS : ",
- "Desktop_Pct": "Bureau : ",
- "Mobile_Pct": "Mobile : ",
- "Bot_Pct": "Robots : ",
- "Human_Pct": "Humain : ",
- "moreData": "Plus de données : "
- },
- "advancedData": {
- "proxyYes": "Doit être un proxy ou un VPN",
- "proxyMaybe": "Possiblement un proxy ou un VPN",
- "proxyNo": "Pas un proxy ou un VPN",
- "proxyUnknown": "Type inconnu",
- "proxyUnknownProtocol": "Protocole inconnu",
- "type": {
- "Residential": "Résidentiel",
- "Wireless": "Sans fil",
- "Business": "Entreprise",
- "Hosting": "Hébergement",
- "unknownType": "Type inconnu"
- },
- "Nativeness": "Nativité",
- "NativeIPYes": "C'est un IP natif",
- "NativeIPNo": "Ce n'est pas un IP natif"
- }
+ "timezone": {
+ "title": "Différence de Fuseau Horaire",
+ "positive": "Votre fuseau horaire ne correspond pas au fuseau horaire de géolocalisation de votre IP, indiquant que vous utilisez peut-être un proxy.",
+ "computer": "Votre fuseau horaire est : ",
+ "server": "Le fuseau horaire de géolocalisation de votre IP est : ",
+ "negative": "Votre fuseau horaire correspond au fuseau horaire de géolocalisation de votre IP."
},
- "connectivity": {
- "id": "connectivity",
- "Title": "Connectivité réseau",
- "Note": "Tests via chargement d'images à partir des sites correspondants. Les valeurs de délai sont données à titre indicatif seulement et seront plus petites en réalité.",
- "StatusWait": "En attente du test",
- "StatusAvailable": "OK",
- "StatusUnavailable": "Non disponible",
- "StatusTimeout": "Délai dépassé",
- "checking": "Vérification en cours...",
- "minTestTime": "Minimal: ",
- "RefreshThisTest": "Rafraîchir ce test"
+ "net": {
+ "title": "Comportement Réseau",
+ "positive": "D'après le comportement du réseau client, il a été constaté que vous utilisez peut-être un proxy ou un VPN.",
+ "negative": "D'après le comportement du réseau client, il a été constaté que vous n'utilisez pas de proxy ou de VPN."
},
"webrtc": {
- "id": "webrtc",
- "Title": "Test WebRTC",
- "Note": "WebRTC établit souvent des connexions directes via UDP. Si le test renvoie votre véritable adresse IP, cela signifie que vos paramètres de proxy ne couvrent pas ces connexions. En plus de détecter l'adresse IP que vous utilisez lors de la connexion à WebRTC, nous détectons également votre type de NAT. Cependant, la détection du type de NAT n'est pas précise à 100% et est fournie à titre indicatif uniquement.",
- "StatusWait": "En attente du test ou erreur de connexion",
- "StatusError": "Erreur de test",
- "NATType": {
- "srflx": "Port Restricted Cone ou Symmetric",
- "prflx": "Port Restricted Cone",
- "relay": "Symmetric",
- "host": "Full Cone",
- "unknown": "Type de inconnu"
- }
- },
- "dnsleaktest": {
- "id": "dnsleaktest",
- "Name": "Test",
- "Title": "Test de fuite DNS",
- "Note": "Une fuite DNS signifie que lorsque vous êtes connecté à un VPN/proxy, vos résolutions de noms de domaine sont toujours effectuées via votre fournisseur d'accès Internet local, ce qui pose un risque de fuite DNS.",
- "Note2": "La méthode de test des fuites DNS consiste à accéder à un nom de domaine nouvellement généré pour détecter la région DNS de sortie à laquelle vous effectuez une résolution. Si la région de l'extrémité renvoyée correspond à la région de votre fournisseur de services local, il y a un risque de fuite DNS. Dans ce cas, vous devrez peut-être modifier vos paramètres VPN/proxy.",
- "Endpoint": "Point de terminaison DNS",
- "EndpointCountry": "Région de l'extrémité",
- "StatusWait": "En attente du test",
- "StatusError": "Erreur de test"
- },
- "speedtest": {
- "id": "speedtest",
- "Title": "Test de vitesse",
- "Note": "Le test de vitesse sera effectué via le réseau de bordure de Cloudflare, ce qui peut prendre beaucoup de temps. Si votre réseau est situé en Chine continentale, les données peuvent être biaisées. Les résultats du test de vitesse sont donnés à titre indicatif, la vitesse réelle sera plus rapide. Vous pouvez choisir la taille des paquets pour les tests de téléchargement et d'upload. Par défaut, le test de vitesse effectuera 4 tours de téléchargements et d'uploads de paquets, veuillez faire attention à la consommation de données.",
- "Download": "Téléchargement",
- "Upload": "Téléversement",
- "Latency": "Latence",
- "Jitter": "Gigue",
- "Unit": "Mbps",
- "StatusWait": "--",
- "StatusError": "Erreur de test",
- "videoStreaming": "Streaming vidéo : ",
- "gaming": ", Jeu : ",
- "rtc": ", Chat vidéo : ",
- "score": "Sur la base du test de vitesse, voici les scores de qualité suivants :",
- "resultNote": ".",
- "connectionFrom": "Test de vitesse terminé depuis votre machine, IP: ",
- "connectionTo": " vers le serveur de test:",
- "connectionEnd": " .",
- "quality": {
- "Good": "Bon",
- "Medium": "Moyen",
- "Bad": "Mauvais"
- }
- },
- "pingtest": {
- "id": "pingtest",
- "Title": "Test de latence mondiale",
- "Note": "Le test de ping est un outil réseau utilisé pour mesurer le temps aller-retour des paquets de données de votre appareil vers des cibles spécifiques (dans ce cas, nos serveurs situés sur différents continents et régions). Il s'agit d'une mesure clé pour évaluer les performances du réseau.",
- "Note2": "Dans ce processus, IPCheck.ing envoie de petits paquets de données depuis des serveurs du monde entier vers votre adresse IP et mesure le temps qu'il faut à ces paquets pour voyager du serveur à votre appareil et vice versa. Grâce à ces tests de ping depuis différentes localisations géographiques, vous pouvez obtenir une vue complète de la vitesse et de la stabilité de la connexion de votre appareil au réseau mondial.",
- "Note3": "Veuillez sélectionner votre adresse IP pour le test.",
- "SelectIP": "Choisissez un IP",
- "Region": "Région",
- "MinDelay": "Délai minimum (ms)",
- "MaxDelay": "Délai maximum (ms)",
- "AvgDelay": "Délai moyen (ms)",
- "TotalPackets": "Paquets totaux",
- "PacketLoss": "Perte de paquets",
- "ReceivedPackets": "Reçus",
- "DroppedPackets": "Perdus",
- "Run": "Démarrez",
- "Error": "Échec du test, il semble que votre IP ne soit pas autorisée à effectuer le test de ping."
+ "title": "Détection WebRTC",
+ "positive": "WebRTC a détecté plusieurs adresses IP provenant de régions différentes, indiquant que vous utilisez peut-être un proxy ou un VPN.",
+ "ipsAre": "Les adresses IP sont : ",
+ "negative": "Aucune preuve de multiples adresses IP provenant de régions différentes n'a été trouvée lors de la détection WebRTC."
},
- "mtrtest": {
- "id": "mtrtest",
- "Title": "Test MTR",
- "Note": "Le test MTR (My Traceroute) effectue une traçabilité détaillée de votre adresse IP à partir de serveurs situés sur différents continents et régions du monde. Le test MTR combine les fonctionnalités des commandes de traceroute traditionnelles et de ping pour diagnostiquer la qualité et les performances des connexions réseau en temps réel.",
- "Note2": "Ce processus couvre le chemin complet depuis différentes localisations géographiques jusqu'à votre environnement réseau, fournissant des informations sur la latence et la perte de paquets pour chaque saut. Qu'il s'agisse de congestion dans le chemin de routage, de problèmes de latence à un nœud spécifique ou de perte de paquets pendant la transmission, le test MTR fournit des informations de diagnostic essentielles.",
- "Note3": "Veuillez sélectionner votre adresse IP pour le test.",
- "SelectIP": "Choisissez un IP",
- "Region": "Région",
- "Run": "Démarrez",
- "Error": "Échec du test, il semble que votre IP ne soit pas autorisée à effectuer le test MTR."
+ "flow": {
+ "title": "Caractéristiques du Trafic",
+ "positive": "D'après les caractéristiques du trafic TCP/IP, il a été constaté que vous utilisez peut-être un proxy ou un VPN.",
+ "negative": "D'après les caractéristiques du trafic TCP/IP, il a été constaté que vous n'utilisez pas de proxy ou de VPN."
},
- "ipcheck": {
- "id": "ipcheck",
- "Title": "Vérification IP",
- "Placeholder": "Veuillez entrer une adresse IP",
- "Button": "Vérifier",
- "Error": "Veuillez entrer une adresse IPv4 ou IPv6 valide."
+ "latencyVSWS": {
+ "title": "Latence TCP vs WebSocket",
+ "positive": "La différence entre la latence TCP et WebSocket est importante, indiquant que vous utilisez peut-être un proxy ou un VPN.",
+ "fromTCP": "Valeur de latence TCP : ",
+ "fromWS": "Valeur de latence WebSocket : ",
+ "negative": "La différence entre la latence TCP et WebSocket n'est pas importante, indiquant que vous n'utilisez peut-être pas de proxy ou de VPN."
},
- "alert": {
- "id": "alert",
- "refreshEverythingMessage": "Actualisation de toutes les données, veuillez patienter...",
- "refreshEverythingTitle": "Actualisation",
- "OhNo": "Oh non !",
- "Congrats": "Félicitations !",
- "OhNo_Message": "Le test de connectivité a échoué, certains sites web ne sont pas accessibles.",
- "Congrats_Message": "Tous les tests de connectivité ont réussi, vous pouvez accéder à tous les sites web.",
- "maskedInfoTitle_1": "IP masquée",
- "maskedInfoMessage_1": "Les informations sur l'adresse IP ont été masquées, veuillez faire attention lorsque vous prenez des captures d'écran.",
- "maskedInfoTitle": "Toutes les infos masquées",
- "maskedInfoMessage": "Toutes les informations ont été masquées, vous pouvez maintenant prendre des captures d'écran en toute sécurité.",
- "unmaskedInfoTitle": "Infos démasquées",
- "unmaskedInfoMessage": "Les informations ont été démasquées, veuillez faire attention lorsque vous prenez des captures d'écran.",
- "SignInFailed": "Echec de connexion",
- "SignInFailedReason": "Raison"
+ "latencyVSPing": {
+ "title": "Latence TCP vs Ping",
+ "positive": "La différence entre la latence TCP et le Ping est importante, indiquant que vous utilisez peut-être un proxy ou un VPN.",
+ "negative": "La différence entre la latence TCP et le Ping n'est pas importante, indiquant que vous n'utilisez peut-être pas de proxy ou de VPN."
},
- "shortcutKeys": {
- "id": "shortcutKeys",
- "GoToTop": "Aller en haut",
- "GoToBottom": "Aller en bas",
- "ToggleDarkMode": "Activer/désactiver le mode sombre",
- "RefreshEverything": "Actualiser tout",
- "RefreshIPCard": "Actualiser la carte IP",
- "RefreshConnectivityTests": "Actualiser les tests de connectivité",
- "RefreshWebRTC": "Actualiser le test WebRTC",
- "RefreshDNSLeakTest": "Actualiser le test de fuite DNS",
- "SpeedTestButton": "Démarrer/Pause le test de vitesse",
- "PingTest": "Ouvrir le Test de latence mondial",
- "MTRTest": "Ouvrir le Test MTR",
- "RuleTest": "Ouvrir le Test de régles",
- "DNSResolver": "Ouvrir le Résolution DNS",
- "ToggleMaps": "Activer/désactiver les cartes",
- "IPCheck": "Vérification IP",
- "ToggleInfoMask": "Masquer/Démasquer les informations",
- "Help": "Afficher les raccourcis clavier",
- "HelpNote": "Les personnes qui utilisent des raccourcis clavier sont vraiment géniales !",
- "GoNext": "Carte suivante",
- "GoPrevious": "Carte précédente",
- "RefreshRuleTests": "Actualiser les tests de règles",
- "CensorshipCheck": "Ouvrir le Test de censorship",
- "Preferences": "Ouvrir les Préférences",
- "About": "Ouvrir À propos",
- "Whois": "Ouvrir la Recherche Whois",
- "InvisibilityTest": "Ouvrir le Test d'invisibilité",
- "MacChecker": "Ouvrir le Recherche de MAC",
- "BrowserInfo": "Ouvrir l'Info du navigateur",
- "fullScreenAdvancedTools": "Outils avancés en plein écran",
- "Curl": "Ouvrir le Shell",
- "SecurityChecklist": "Ouvrir la Liste de sécurité"
- },
- "page": {
- "title": "IPCheck.ing - Vérifier mon adresse IP et géolocalisation - Vérifier l'adresse IP de connexion WebRTC - Test de fuite DNS - Test de vitesse - Jason Ng Open Source",
- "description": "Une boîte à outils IP meilleure et open source. Facile à vérifier vos adresses IP, informations IP, vérifier les fuites DNS, examiner les connexions WebRTC, tester la disponibilité des sites web, rechercher des enregistrements DNS, rechercher des informations Whois et tester la latence dans le monde entier.",
- "keywords": "MonIP, Outil IP, Mon IP, Vérification IP, Recherche IP, Test de fuite DNS, Test WebRTC, Test de vitesse, Recherche DNS, Recherche Whois, Test de ping, Test de confidentialité",
- "footerLink": "https://github.com/jason5ng32/MyIP",
- "copyRightName": "Originalement de ",
- "copyRightLink": "https://ipcheck.ing",
- "copyRightLinkName": "IPCheck.ing"
- },
- "helpModal": {
- "Title": "Raccourcis"
- },
- "about": {
- "Title": "À propos",
- "product1": "IPCheck.ing est une boîte à outils IP gratuite qui vous aide à vérifier vos informations IP, tester la disponibilité des sites web, examiner les informations de sortie DNS, effectuer des tests de vitesse, des tests de latence mondiale, des tests MTR, et plus encore.",
- "product2": "Il s'agit d'un projet open-source, et vous pouvez consulter le code source en cliquant sur l'icône GitHub en bas de la page.",
- "product3": "Au départ, il s'agissait d'un projet personnel pour moi afin d'apprendre Vue.js et comment écrire du code en utilisant ChatGPT. Au fil du temps, il a gagné en popularité sur GitHub, j'ai donc effectué beaucoup de refactoring et ajouté de nombreuses fonctionnalités utiles. J'espère que vous l'apprécierez.",
- "meTitle": "À propos de moi",
- "me1": "Je m'appelle Jason Ng, également connu sous le nom d'Achán en ligne. Je ne suis pas un programmeur professionnel, mais j'adore coder, l'open-source et le partage.",
- "me2": "La plupart du temps, je travaille en tant que chef de produit, blogueur, motard et geek.",
- "me3": "Vous pouvez trouver une présentation plus détaillée à mon sujet dans le lien suivant :",
- "contactTitle": "Contactez-moi",
- "contact": "Si vous avez des questions ou des suggestions, veuillez me contacter par email : jason[AT]kenengba.com.",
- "personal": "Site personnel",
- "blog": "Mon blog",
- "retiremoney": "Planificateur futur",
- "twitter": "Twitter",
- "Sponsor": "Sponsor"
- },
- "specialthanks": {
- "Title": "Merci spécial",
- "Note1": "Ce projet n'aurait pas pu être achevé sans le soutien et l'aide de certaines personnes et organisations enthousiastes, ainsi que de ceux qui ont fourni l'inspiration ou partagé leur code en open-source. Un grand merci à eux :"
+ "highlatency": {
+ "title": "Analyse de Haute Latence",
+ "positive": "L'analyse de haute latence indique que vous utilisez peut-être un proxy ou un VPN.",
+ "negative": "Aucune preuve de votre utilisation d'un proxy ou d'un VPN n'a été trouvée lors de l'analyse de haute latence."
+ }
+ },
+ "censorshipcheck": {
+ "Title": "Test de censorship",
+ "Note": "Vérifie la disponibilité des sites cibles dans quatre régions connues pour une censure internet rigoureuse, incluant : la Chine continentale, l'Arabie Saoudite, la Russie, et la Turquie. Des tests sont également réalisés depuis des régions où l'internet est relativement libre, servant de groupe témoin pour la vérification. Certaines régions disposent de dispositions légales claires sur la censure internet, tandis que d'autres sont plus vagues.",
+ "Note2": "Veuillez entrer une URL ou un nom de domaine pour commencer le test de censure :",
+ "Note3": "Un site est considéré comme bloqué uniquement si aucun serveur dans le même pays ne peut y accéder.",
+ "Placeholder": "URL ou Nom de Domaine",
+ "Country": "Région",
+ "Status": "Statut",
+ "City": "Ville",
+ "Network": "Réseau",
+ "invalidURL": "URL ou Nom de Domaine invalide",
+ "fetchError": "Impossible de récupérer les résultats des tests",
+ "isBlocked": "Ce site semble être bloqué dans certains pays, veuillez vous référer aux résultats des tests ci-dessus pour une détermination finale.",
+ "notBlocked": "Ce site ne semble pas être bloqué, veuillez vous référer aux résultats des tests ci-dessus pour une détermination finale.",
+ "isDown": "Il est difficile de déterminer si ce site est bloqué, car il semble inaccessible de nombreux endroits dans le monde. Si l'adresse que vous avez entrée est correcte, il est possible que le site lui-même rencontre des problèmes et ne soit pas accessible.",
+ "Timeout": "Délai d'Attente du Test",
+ "TestGroup": "Groupe de Test",
+ "ControlGroup": "Groupe Témoin"
+ },
+ "advancedtools": {
+ "Title": "Outils avancés",
+ "Note": "Certains outils sont utilisés relativement rarement, mais sont très utiles lors des tests de réseaux.",
+ "PingTestNote": "Test de la valeur Ping mondiale",
+ "MTRTestNote": "Test de route MTR mondial",
+ "DNSResolverNote": "Résolution DNS multi-canal en temps réel",
+ "RuleTestNote": "Vérifiez les paramètres de règles du logiciel de proxy",
+ "CensorshipCheck": "Vérifier si un site est bloqué dans certains pays",
+ "Whois": "Recherche d'informations sur l'enregistrement de domaine/IP",
+ "InvisibilityTest": "Vérifiez si vous utilisez un proxy ou un VPN",
+ "MacChecker": "Requête d'informations d'une adresse physique",
+ "BrowserInfo": "Vérifier les informations du navigateur et l'empreinte digitale",
+ "SecurityChecklist": "Guide pour sécuriser votre vie numérique"
+ },
+ "macchecker": {
+ "Title": "Recherche MAC",
+ "Note": "Interroger le fabricant d'une adresse physique (adresse MAC), s'il s'agit d'une adresse unicast/multicast, globale/locale, etc. Prend en charge la requête avec une adresse complète de 12 chiffres ou juste le préfixe. Vous pouvez également utiliser cet outil pour vérifier si l'adresse physique que vous avez générée répond à vos besoins.",
+ "Note2": "Veuillez saisir une adresse physique pour commencer la requête:",
+ "Placeholder": "F0:2F:4B:01:0A:AA",
+ "invalidMAC": "Adresse physique invalide",
+ "fetchError": "Impossible de récupérer les résultats de la requête",
+ "company": "Fabricant",
+ "macPrefix": "Préfixe d'adresse physique",
+ "address": "Adresse enregistrée",
+ "country": "Pays/région enregistré",
+ "blockStart": "Bloc de départ",
+ "blockEnd": "Bloc de fin",
+ "blockSize": "Taille du bloc",
+ "blockType": "Type de bloc",
+ "blockRange": "Plage du bloc",
+ "isRand": "Adresse aléatoire",
+ "isPrivate": "Données privées",
+ "isMulticast": "Adresse multicast",
+ "isUnicast": "Adresse unicast",
+ "isGlobal": "Adresse mondiale",
+ "isLocal": "Adresse locale",
+ "property": "Propriété de l'adresse",
+ "value": "Valeur",
+ "manufacturer": "Détails du fabricant"
+ },
+ "whois": {
+ "Title": "Recherche Whois",
+ "Note": "La recherche Whois est un service utilisé pour récupérer des informations sur l'enregistrement d'un domaine. En entrant un nom de domaine ou une adresse IP, vous pouvez obtenir des informations telles que les détails d'enregistrement du domaine, le registraire, la date d'enregistrement, la date d'expiration, et plus encore. Les informations Whois pour les adresses IP et les noms de domaine peuvent avoir des champs différents. De plus, certains domaines de premier niveau (TLD) moins courants peuvent ne pas avoir d'informations disponibles pour les requêtes Whois.",
+ "Note2": "Veuillez entrer un nom de domaine ou une adresse IP pour démarrer la requête :",
+ "Note3": "Whois informations contient plusieurs types de champs, voici le texte brut original",
+ "Placeholder": "Nom de domaine ou IP",
+ "invalidURL": "Nom de domaine ou IP invalide",
+ "fetchError": "Impossible de récupérer les résultats de la requête ou les résultats de la requête sont vides",
+ "Provider": "Fournisseur d'informations"
+ },
+ "dnsresolver": {
+ "Title": "Résolution DNS",
+ "Note": "Dans certaines régions, pour des raisons politiques ou commerciales, certains opérateurs peuvent contaminer certains noms de domaine, entraînant des résultats incorrects lorsqu'ils sont accédés directement. L'utilisation de vérifications de résolution DNS vous aidera à inspecter les résultats de résolution de noms de domaine auprès de fournisseurs DNS renommés dans le monde entier. Parmi les tests DNS intégrés, certains fournisseurs sont originaires de Chine, dont les résultats de résolution DNS peuvent être contaminés. Veuillez faire preuve de discernement.",
+ "Note2": "Veuillez entrer une URL ou un nom de domaine pour commencer la résolution :",
+ "Placeholder": "URL ou Nom de Domaine",
+ "invalidURL": "URL ou Nom de Domaine invalide",
+ "fetchError": "Impossible de récupérer les résultats de résolution",
+ "Provider": "Fournisseur DNS",
+ "Result": "Résultat de la Résolution",
+ "Record": "Enregistrement"
+ },
+ "ruletest": {
+ "Title": "Test de règles",
+ "Name": "Test",
+ "Note": "Le test de règles est utilisé pour déterminer si les paramètres de règles basées sur le nom de domaine de votre logiciel proxy sont corrects. Avant de procéder au test, veuillez vous référer à la carte ci-dessous et configurer des règles de redirection de domaine différentes pour les 8 URL différentes d'IPCheck.ing dans votre logiciel proxy. Généralement, les paramètres de règles peuvent utiliser un format comme : DOMAIN, ptest-3.ipcheck.ing, POLICY. Le format spécifique peut varier en fonction du logiciel proxy que vous utilisez.",
+ "StatusWait": "En attente du test ou erreur de connexion",
+ "StatusError": "Erreur de test",
+ "Country": "Région de proxy",
+ "RefreshAll": "Actualiser tout"
+ },
+ "Tooltips": {
+ "RefreshIPCard": "Actualiser la carte IP",
+ "RefreshConnectivityTests": "Actualiser les tests de connectivité",
+ "RefreshWebRTC": "Actualiser le test WebRTC",
+ "RefreshDNSLeakTest": "Actualiser le test de fuite DNS",
+ "SpeedTestButton": "Démarrer/Pause le test de vitesse",
+ "SourceSelect": "Sélectionner la source de géolocalisation IP",
+ "ShowASNInfo": "Afficher les détails AS",
+ "CopyIP": "Copier l'adresse IP",
+ "ViewOnMap": "Voir l'emplacement sur la carte",
+ "InfoMask": "Masquer les informations IP",
+ "QueryIP": "Interroger l'adresse IP",
+ "GithubLink": "Voir le code source sur GitHub",
+ "RefreshRuleTests": "Actualiser les tests de règles",
+ "qualityScoreExplain": "Le score de qualité IP est calculé sur la base de plusieurs facteurs pondérés, incluant le type d'IP, si c'est un proxy/VPN, et le nombre d'événements d'attaque récemment détectés provenant de cette IP. Un score plus élevé indique une meilleure qualité de l'IP, réduisant la probabilité d'être bloqué par le contrôle de risques sur certains sites."
+ },
+ "ipInfos": {
+ "id": "ipinfos",
+ "database": "Données",
+ "Title": "Infos IP",
+ "Notes": "Le programme vérifie d'abord votre adresse IP à partir des sources différentes (y compris IPv4 et IPv6), puis interroge les données géographiques correspondantes à partir de la source d'informations de localisation IP que vous avez sélectionnée. Si vous n'avez qu'une seule pile IP active, les sources de données non disponibles seront affichées comme vides.",
+ "Simple": "Simple",
+ "Map": "Carte",
+ "MapUnavailable": "Carte non disponible",
+ "Source": "Source IP",
+ "IP": "IP",
+ "Country": "Région",
+ "Region": "État",
+ "City": "Ville",
+ "ISP": "ISP",
+ "ASN": "ASN",
+ "IPv4Error": "Échec de récupération ou pas d'adresse IPv4",
+ "IPv6Error": "Échec de récupération ou pas d'adresse IPv6",
+ "SelectSource": "Source de géolocalisation IP",
+ "type": "Type",
+ "isProxy": "Proxy",
+ "qualityScore": "Qualité IP",
+ "qualityScoreUnknown": "Score inconnu",
+ "advancedUnlockCta": "Pour éviter l'abus, connectez-vous pour voir les informations suivantes",
+ "ASNInfo": {
+ "trafficPercentage": "Pourcentage de trafic : ",
+ "note": "Données associées à cet AS : ",
+ "asnName": "Nom de l'AS : ",
+ "asnOrgName": "Organisation de l'AS : ",
+ "asnCountryCode": "Région de l'AS : ",
+ "estimatedUsers": "Nombre d'utilisateurs estimé : ",
+ "IPv4_Pct": "IPv4 : ",
+ "IPv6_Pct": "IPv6 : ",
+ "HTTP_Pct": "HTTP : ",
+ "HTTPS_Pct": "HTTPS : ",
+ "Desktop_Pct": "Bureau : ",
+ "Mobile_Pct": "Mobile : ",
+ "Bot_Pct": "Robots : ",
+ "Human_Pct": "Humain : ",
+ "moreData": "Plus de données : "
},
- "changelog": {
- "Title": "Modifs",
- "add": "Ajouté",
- "improve": "Amélioré",
- "fix": "Corrigé",
- "versions": [
- {
- "version": "v1.0",
- "date": "Nov 06, 2020",
- "content": [
- {
- "type": "add",
- "change": "Affichage des informations IP de l'utilisateur"
- },
- {
- "type": "add",
- "change": "Affichage des informations IP avant et après le proxy"
- },
- {
- "type": "add",
- "change": "Vérification de la disponibilité des sites web"
- }
- ]
- },
- {
- "version": "v2.0",
- "date": "Nov 24, 2023",
- "content": [
- {
- "type": "add",
- "change": "Refonte complète du projet en utilisant Vue2"
- },
- {
- "type": "improve",
- "change": "Refonte de l'interface utilisateur en utilisant Bootstrap v5"
- }
- ]
- },
- {
- "version": "v2.1",
- "date": "Nov 25, 2023",
- "content": [
- {
- "type": "add",
- "change": "Ajout du test WebRTC"
- },
- {
- "type": "improve",
- "change": "Optimisation de la logique du programme"
- }
- ]
- },
- {
- "version": "v2.2",
- "date": "Nov 26, 2023",
- "content": [
- {
- "type": "add",
- "change": "Ajout du test de fuite DNS"
- },
- {
- "type": "add",
- "change": "Prise en charge de l'affichage des cartes Bing dans l'interface"
- },
- {
- "type": "improve",
- "change": "Multiples optimisations de la logique"
- }
- ]
- },
- {
- "version": "v2.3",
- "date": "Nov 27, 2023 ",
- "content": [
- {
- "type": "add",
- "change": "Ajout du mode sombre"
- },
- {
- "type": "add",
- "change": "Ajout du mode minimaliste pour mobile"
- },
- {
- "type": "improve",
- "change": "Optimisation de la structure des fichiers"
- }
- ]
- },
- {
- "version": "v2.4",
- "date": "Dec 1, 2023",
- "content": [
- {
- "type": "add",
- "change": "Prise en charge de la langue anglaise"
- },
- {
- "type": "add",
- "change": "Ajout de la fonctionnalité de masquage des informations"
- },
- {
- "type": "add",
- "change": "Prise en charge de PWA, peut être installé sur mobile et ordinateur de bureau"
- }
- ]
- },
- {
- "version": "v2.5",
- "date": "Dec 20, 2023",
- "content": [
- {
- "type": "add",
- "change": "Prise en charge des raccourcis clavier"
- },
- {
- "type": "add",
- "change": "Ajout de la fonctionnalité de test de vitesse des sites web"
- },
- {
- "type": "improve",
- "change": "Prise en charge du déploiement à l'aide de Docker"
- },
- {
- "type": "improve",
- "change": "Prise en charge de la récupération des informations de géolocalisation IP à partir de plusieurs sources"
- }
- ]
- },
- {
- "version": "v3.0",
- "date": "Jan 28, 2024",
- "content": [
- {
- "type": "add",
- "change": "Refonte complète du projet en utilisant Vite + Vue3"
- },
- {
- "type": "add",
- "change": "Ajout de la fonctionnalité de test de latence mondiale"
- },
- {
- "type": "add",
- "change": "Ajout de la fonctionnalité de test MTR"
- },
- {
- "type": "improve",
- "change": "Multiples optimisations de performance et d'expérience utilisateur"
- }
- ]
- },
- {
- "version": "v3.1",
- "date": "Jan 30, 2024",
- "content": [
- {
- "type": "add",
- "change": "Ajout de la prise en charge d'une nouvelle langue : français"
- },
- {
- "type": "add",
- "change": "Ajout d'une animation de chargement des données"
- },
- {
- "type": "improve",
- "change": "Optimisation de la stratégie de cache"
- },
- {
- "type": "improve",
- "change": "Ajustement du style du mode sombre"
- },
- {
- "type": "fix",
- "change": "Correction de quelques problèmes mineurs"
- }
- ]
- },
- {
- "version": "v3.2",
- "date": "Feb 3, 2024",
- "content": [
- {
- "type": "add",
- "change": "Ajout de la détection du type NAT"
- },
- {
- "type": "improve",
- "change": "Optimisation de l'expérience de l'application PWA"
- },
- {
- "type": "improve",
- "change": "Amélioration de la sécurité du script backend"
- }
- ]
- },
- {
- "version": "v3.3",
- "date": "Feb 6, 2024",
- "content": [
- {
- "type": "add",
- "change": "Prise en charge de l'utilisation de différentes sources d'informations de géolocalisation IP"
- },
- {
- "type": "improve",
- "change": "Amélioration de l'expérience utilisateur de la détection de disponibilité de connexion"
- },
- {
- "type": "improve",
- "change": "Amélioration de l'expérience utilisateur de l'interface utilisateur"
- }
- ]
- },
- {
- "version": "v3.4",
- "date": "Feb 17, 2024",
- "content": [
- {
- "type": "add",
- "change": "Ajout d'un visualiseur de détails ASN"
- },
- {
- "type": "add",
- "change": "Ajout de la détection de proxy"
- },
- {
- "type": "improve",
- "change": "Optimisation de l'interface utilisateur pour l'affichage des informations IP"
- }
- ]
- },
- {
- "version": "v3.5",
- "date": "Mar 3, 2024",
- "content": [
- {
- "type": "add",
- "change": "Ajout du test de règles"
- },
- {
- "type": "improve",
- "change": "Quelques améliorations"
- }
- ]
- },
- {
- "version": "v3.6",
- "date": "Mar 10, 2024",
- "content": [
- {
- "type": "add",
- "change": "Ajout de la fonction de résolution DNS"
- },
- {
- "type": "improve",
- "change": "Optimisation de la structure de la page d'accueil, les fonctionnalités avancées sont désormais repliables"
- },
- {
- "type": "improve",
- "change": "Optimisation de la logique du programme"
- }
- ]
- },
- {
- "version": "v3.7",
- "date": "Apr 26, 2024",
- "content": [
- {
- "type": "add",
- "change": "Fonctionnalité de test de censure ajoutée"
- },
- {
- "type": "add",
- "change": "Le test de vitesse réseau permet maintenant de personnaliser la taille des paquets"
- },
- {
- "type": "improve",
- "change": "Optimisation de certaines logiques fonctionnelles"
- }
- ]
- },
- {
- "version": "v3.8",
- "date": "May 4, 2024",
- "content": [
- {
- "type": "add",
- "change": "Ajout du panneau de préférences pour enregistrer les paramètres localement"
- },
- {
- "type": "add",
- "change": "Permettre la personnalisation de plusieurs comportements par défaut lors du deuxième lancement du programme"
- },
- {
- "type": "improve",
- "change": "Optimisation significative de la logique du programme"
- },
- {
- "type": "fix",
- "change": "Correction de quelques problèmes mineurs"
- }
- ]
- },
- {
- "version": "v3.9",
- "date": "May 8, 2024",
- "content": [
- {
- "type": "add",
- "change": "Ajout de la fonction de recherche Whois"
- },
- {
- "type": "improve",
- "change": "Optimisation de l'affichage et des effets d'animation pour les outils avancés"
- },
- {
- "type": "fix",
- "change": "Correction de quelques problèmes mineurs"
- }
- ]
- },
- {
- "version": "v4.0",
- "date": "May 13, 2024",
- "content": [
- {
- "type": "add",
- "change": "Refonte complète du projet en utilisant la Composition API de Vue 3"
- },
- {
- "type": "add",
- "change": "Découpage du frontend en plusieurs modules pour améliorer la maintenabilité du programme"
- },
- {
- "type": "add",
- "change": "Ajout de la Test d'invisibilité (bêta)"
- },
- {
- "type": "improve",
- "change": "Optimisation de la structure des dépendances du backend"
- },
- {
- "type": "improve",
- "change": "Optimisation de nombreux détails"
- }
- ]
- },
- {
- "version": "v4.1",
- "date": "July 11, 2024",
- "content": [
- {
- "type": "add",
- "change": "Ajout de la fonction de recherche MAC"
- },
- {
- "type": "improve",
- "change": "Optimisation de nombreux détails"
- }
- ]
- },
- {
- "version": "v4.2",
- "date": "Sept 25, 2024",
- "content": [
- {
- "type": "add",
- "change": "Ajout de la fonction de requête d'informations du navigateur"
- },
- {
- "type": "add",
- "change": "Ajout de la base de données géographique MaxMind"
- },
- {
- "type": "improve",
- "change": "Améliorations multiples de l'expérience"
- }
- ]
- },
- {
- "version": "v4.3",
- "date": "Oct 30, 2024",
- "content": [
- {
- "type": "add",
- "change": "Ajout de la fonctionnalité API en ligne de commande"
- },
- {
- "type": "improve",
- "change": "Le test WebRTC peut maintenant afficher des informations régionales"
- },
- {
- "type": "improve",
- "change": "Le test de fuite DNS peut maintenant afficher des informations régionales"
- }
- ]
- },
- {
- "version": "v4.4",
- "date": "Dec 7, 2024",
- "content": [
- {
- "type": "add",
- "change": "Préférences de langue"
- },
- {
- "type": "improve",
- "change": "Fournisseur de carte changé en Google"
- },
- {
- "type": "improve",
- "change": "Autres optimisations générales"
- }
- ]
- },
- {
- "version": "v4.5",
- "date": "Dec 25, 2024",
- "content": [
- {
- "type": "add",
- "change": "Liste de vérification de sécurité"
- },
- {
- "type": "improve",
- "change": "Autres optimisations générales"
- }
- ]
- },
- {
- "version": "v5.0",
- "date": "Jan 31, 2025",
- "content": [
- {
- "type": "add",
- "change": "Ajout de la système d'utilisateur"
- },
- {
- "type": "add",
- "change": "Ajout de la système de réussite utilisateur"
- },
- {
- "type": "add",
- "change": "Ajout de la version Lite"
- },
- {
- "type": "add",
- "change": "Le test de vitesse peut maintenant afficher des graphiques de données"
- },
- {
- "type": "improve",
- "change": "Optimisation de la performance du code"
- }
- ]
- },
- {
- "version": "v5.1",
- "date": "Nov 12, 2025",
- "content": [
- {
- "type": "add",
- "change": "Ajout de la prise en charge de la langue turque"
- },
- {
- "type": "improve",
- "change": "Optimisation de l'efficacité du code"
- }
- ]
- },
- {
- "version": "v5.2",
- "date": "Jan 05, 2026",
- "content": [
- {
- "type": "add",
- "change": "Amélioration de la richesse des informations ASN"
- },
- {
- "type": "add",
- "change": "Affichage de la qualité IP"
- },
- {
- "type": "improve",
- "change": "Optimisation de l'efficacité du code"
- }
- ]
- },
- {
- "version": "v5.3",
- "date": "Apr 14, 2026",
- "content": [
- {
- "type": "add",
- "change": "Mise à jour automatique de la base de données géographique MaxMind"
- },
- {
- "type": "improve",
- "change": "Optimisation de la stratégie de cache"
- },
- {
- "type": "improve",
- "change": "Amélioration significative de la vitesse de construction"
- }
- ]
- }
- ]
+ "advancedData": {
+ "proxyYes": "Doit être un proxy ou un VPN",
+ "proxyMaybe": "Possiblement un proxy ou un VPN",
+ "proxyNo": "Pas un proxy ou un VPN",
+ "proxyUnknown": "Type inconnu",
+ "proxyUnknownProtocol": "Protocole inconnu",
+ "type": {
+ "Residential": "Résidentiel",
+ "Wireless": "Sans fil",
+ "Business": "Entreprise",
+ "Hosting": "Hébergement",
+ "unknownType": "Type inconnu"
+ },
+ "Nativeness": "Nativité",
+ "NativeIPYes": "C'est un IP natif",
+ "NativeIPNo": "Ce n'est pas un IP natif"
+ }
+ },
+ "connectivity": {
+ "id": "connectivity",
+ "Title": "Connectivité réseau",
+ "Note": "Tests via chargement d'images à partir des sites correspondants. Les valeurs de délai sont données à titre indicatif seulement et seront plus petites en réalité.",
+ "StatusWait": "En attente du test",
+ "StatusAvailable": "OK",
+ "StatusUnavailable": "Non disponible",
+ "StatusTimeout": "Délai dépassé",
+ "checking": "Vérification en cours...",
+ "minTestTime": "Minimal: ",
+ "RefreshThisTest": "Rafraîchir ce test"
+ },
+ "webrtc": {
+ "id": "webrtc",
+ "Title": "Test WebRTC",
+ "Note": "WebRTC établit souvent des connexions directes via UDP. Si le test renvoie votre véritable adresse IP, cela signifie que vos paramètres de proxy ne couvrent pas ces connexions. En plus de détecter l'adresse IP que vous utilisez lors de la connexion à WebRTC, nous détectons également votre type de NAT. Cependant, la détection du type de NAT n'est pas précise à 100% et est fournie à titre indicatif uniquement.",
+ "StatusWait": "En attente du test",
+ "StatusError": "Erreur de connexion",
+ "NATType": {
+ "srflx": "Port Restricted Cone ou Symmetric",
+ "prflx": "Port Restricted Cone",
+ "relay": "Symmetric",
+ "host": "Full Cone",
+ "unknown": "Type de inconnu"
+ }
+ },
+ "dnsleaktest": {
+ "id": "dnsleaktest",
+ "Name": "Test de point de DNS",
+ "Title": "Test de fuite DNS",
+ "Note": "Une fuite DNS signifie que lorsque vous êtes connecté à un VPN/proxy, vos résolutions de noms de domaine sont toujours effectuées via votre fournisseur d'accès Internet local, ce qui pose un risque de fuite DNS.",
+ "Note2": "La méthode de test des fuites DNS consiste à accéder à un nom de domaine nouvellement généré pour détecter la région DNS de sortie à laquelle vous effectuez une résolution. Si la région de l'extrémité renvoyée correspond à la région de votre fournisseur de services local, il y a un risque de fuite DNS. Dans ce cas, vous devrez peut-être modifier vos paramètres VPN/proxy.",
+ "EndpointCountry": "Région de l'extrémité",
+ "StatusWait": "En attente du test",
+ "StatusError": "Erreur de test"
+ },
+ "speedtest": {
+ "id": "speedtest",
+ "Title": "Test de vitesse",
+ "Note": "Le test de vitesse sera effectué via le réseau de bordure de Cloudflare, ce qui peut prendre beaucoup de temps. Si votre réseau est situé en Chine continentale, les données peuvent être biaisées. Les résultats du test de vitesse sont donnés à titre indicatif, la vitesse réelle sera plus rapide. Vous pouvez choisir la taille des paquets pour les tests de téléchargement et d'upload. Par défaut, le test de vitesse effectuera 4 tours de téléchargements et d'uploads de paquets, veuillez faire attention à la consommation de données.",
+ "Download": "Téléchargement",
+ "Upload": "Téléversement",
+ "Latency": "Latence",
+ "Jitter": "Gigue",
+ "Unit": "Mbps",
+ "StatusWait": "--",
+ "StatusError": "Erreur de test",
+ "videoStreaming": "Streaming vidéo : ",
+ "gaming": ", Jeu : ",
+ "rtc": ", Chat vidéo : ",
+ "score": "Sur la base du test de vitesse, voici les scores de qualité suivants :",
+ "resultNote": ".",
+ "connectionFrom": "Test de vitesse terminé depuis votre machine, IP: ",
+ "connectionTo": " vers le serveur de test:",
+ "connectionEnd": " .",
+ "quality": {
+ "Good": "Bon",
+ "Medium": "Moyen",
+ "Bad": "Mauvais"
}
-}
\ No newline at end of file
+ },
+ "pingtest": {
+ "id": "pingtest",
+ "Title": "Test de latence mondiale",
+ "Note": "Le test de ping est un outil réseau utilisé pour mesurer le temps aller-retour des paquets de données de votre appareil vers des cibles spécifiques (dans ce cas, nos serveurs situés sur différents continents et régions). Il s'agit d'une mesure clé pour évaluer les performances du réseau.",
+ "Note2": "Dans ce processus, IPCheck.ing envoie de petits paquets de données depuis des serveurs du monde entier vers votre adresse IP et mesure le temps qu'il faut à ces paquets pour voyager du serveur à votre appareil et vice versa. Grâce à ces tests de ping depuis différentes localisations géographiques, vous pouvez obtenir une vue complète de la vitesse et de la stabilité de la connexion de votre appareil au réseau mondial.",
+ "Note3": "Veuillez sélectionner votre adresse IP pour le test.",
+ "SelectIP": "Choisissez un IP",
+ "Region": "Région",
+ "MinDelay": "Délai minimum (ms)",
+ "MaxDelay": "Délai maximum (ms)",
+ "AvgDelay": "Délai moyen (ms)",
+ "TotalPackets": "Paquets totaux",
+ "PacketLoss": "Perte de paquets",
+ "ReceivedPackets": "Reçus",
+ "DroppedPackets": "Perdus",
+ "Error": "Échec du test, il semble que votre IP ne soit pas autorisée à effectuer le test de ping."
+ },
+ "mtrtest": {
+ "id": "mtrtest",
+ "Title": "Test MTR",
+ "Note": "Le test MTR (My Traceroute) effectue une traçabilité détaillée de votre adresse IP à partir de serveurs situés sur différents continents et régions du monde. Le test MTR combine les fonctionnalités des commandes de traceroute traditionnelles et de ping pour diagnostiquer la qualité et les performances des connexions réseau en temps réel.",
+ "Note2": "Ce processus couvre le chemin complet depuis différentes localisations géographiques jusqu'à votre environnement réseau, fournissant des informations sur la latence et la perte de paquets pour chaque saut. Qu'il s'agisse de congestion dans le chemin de routage, de problèmes de latence à un nœud spécifique ou de perte de paquets pendant la transmission, le test MTR fournit des informations de diagnostic essentielles.",
+ "Note3": "Veuillez sélectionner votre adresse IP pour le test.",
+ "SelectIP": "Choisissez un IP",
+ "Region": "Région",
+ "Error": "Échec du test, il semble que votre IP ne soit pas autorisée à effectuer le test MTR."
+ },
+ "ipcheck": {
+ "id": "ipcheck",
+ "Title": "Vérification IP",
+ "Placeholder": "Veuillez entrer une adresse IP",
+ "Error": "Veuillez entrer une adresse IPv4 ou IPv6 valide."
+ },
+ "alert": {
+ "id": "alert",
+ "refreshEverythingMessage": "Actualisation de toutes les données, veuillez patienter...",
+ "refreshEverythingTitle": "Actualisation",
+ "OhNo": "Oh non !",
+ "Congrats": "Félicitations !",
+ "OhNo_Message": "Le test de connectivité a échoué, certains sites web ne sont pas accessibles.",
+ "Congrats_Message": "Tous les tests de connectivité ont réussi, vous pouvez accéder à tous les sites web.",
+ "maskedInfoTitle_1": "IP masquée",
+ "maskedInfoMessage_1": "Les informations sur l'adresse IP ont été masquées, veuillez faire attention lorsque vous prenez des captures d'écran.",
+ "maskedInfoTitle": "Toutes les infos masquées",
+ "maskedInfoMessage": "Toutes les informations ont été masquées, vous pouvez maintenant prendre des captures d'écran en toute sécurité.",
+ "unmaskedInfoTitle": "Infos démasquées",
+ "unmaskedInfoMessage": "Les informations ont été démasquées, veuillez faire attention lorsque vous prenez des captures d'écran.",
+ "SignInFailed": "Echec de connexion",
+ "SignInFailedReason": "Raison"
+ },
+ "shortcutKeys": {
+ "id": "shortcutKeys",
+ "GoToTop": "Aller en haut",
+ "GoToBottom": "Aller en bas",
+ "ToggleDarkMode": "Activer/désactiver le mode sombre",
+ "RefreshEverything": "Actualiser tout",
+ "RefreshIPCard": "Actualiser la carte IP",
+ "RefreshConnectivityTests": "Actualiser les tests de connectivité",
+ "RefreshWebRTC": "Actualiser le test WebRTC",
+ "RefreshDNSLeakTest": "Actualiser le test de fuite DNS",
+ "SpeedTestButton": "Démarrer/Pause le test de vitesse",
+ "PingTest": "Ouvrir le Test de latence mondial",
+ "MTRTest": "Ouvrir le Test MTR",
+ "RuleTest": "Ouvrir le Test de régles",
+ "DNSResolver": "Ouvrir le Résolution DNS",
+ "IPCheck": "Vérification IP",
+ "ToggleInfoMask": "Masquer/Démasquer les informations",
+ "Help": "Afficher les raccourcis clavier",
+ "HelpNote": "Les personnes qui utilisent des raccourcis clavier sont vraiment géniales !",
+ "GoNext": "Carte suivante",
+ "GoPrevious": "Carte précédente",
+ "OpenHighlightedTool": "Ouvrir l'outil avancé sélectionné",
+ "RefreshRuleTests": "Actualiser les tests de règles",
+ "CensorshipCheck": "Ouvrir le Test de censorship",
+ "Preferences": "Ouvrir les Préférences",
+ "About": "Ouvrir À propos",
+ "Whois": "Ouvrir la Recherche Whois",
+ "InvisibilityTest": "Ouvrir le Test d'invisibilité",
+ "MacChecker": "Ouvrir le Recherche de MAC",
+ "BrowserInfo": "Ouvrir l'Info du navigateur",
+ "fullScreenAdvancedTools": "Outils avancés en plein écran",
+ "Curl": "Ouvrir le Shell",
+ "SecurityChecklist": "Ouvrir la Liste de sécurité"
+ },
+ "page": {
+ "title": "IPCheck.ing - Vérifier mon adresse IP et géolocalisation - Vérifier l'adresse IP de connexion WebRTC - Test de fuite DNS - Test de vitesse - Jason Ng Open Source",
+ "description": "Une boîte à outils IP meilleure et open source. Facile à vérifier vos adresses IP, informations IP, vérifier les fuites DNS, examiner les connexions WebRTC, tester la disponibilité des sites web, rechercher des enregistrements DNS, rechercher des informations Whois et tester la latence dans le monde entier.",
+ "keywords": "MonIP, Outil IP, Mon IP, Vérification IP, Recherche IP, Test de fuite DNS, Test WebRTC, Test de vitesse, Recherche DNS, Recherche Whois, Test de ping, Test de confidentialité",
+ "footerLink": "https://github.com/jason5ng32/MyIP",
+ "copyRightName": "Originalement de ",
+ "copyRightLink": "https://ipcheck.ing",
+ "copyRightLinkName": "IPCheck.ing"
+ },
+ "helpModal": {
+ "Title": "Raccourcis"
+ },
+ "about": {
+ "Title": "À propos",
+ "product1": "IPCheck.ing est une boîte à outils IP gratuite qui vous aide à vérifier vos informations IP, tester la disponibilité des sites web, examiner les informations de sortie DNS, effectuer des tests de vitesse, des tests de latence mondiale, des tests MTR, et plus encore.",
+ "product2": "Il s'agit d'un projet open-source, et vous pouvez consulter le code source en cliquant sur l'icône GitHub en bas de la page.",
+ "product3": "Au départ, il s'agissait d'un projet personnel pour moi afin d'apprendre Vue.js et comment écrire du code en utilisant AI. Au fil du temps, il a gagné en popularité sur GitHub, j'ai donc effectué beaucoup de refactoring et ajouté de nombreuses fonctionnalités utiles. J'espère que vous l'apprécierez.",
+ "meTitle": "À propos de moi",
+ "me1": "Je m'appelle Jason Ng, également connu sous le nom d'Achán en ligne. Je ne suis pas un programmeur professionnel, mais j'adore coder, l'open-source et le partage.",
+ "me2": "La plupart du temps, je travaille en tant que chef de produit, blogueur, motard et geek.",
+ "me3": "Vous pouvez trouver une présentation plus détaillée à mon sujet dans le lien suivant :",
+ "contactTitle": "Contactez-moi",
+ "contact": "Si vous avez des questions ou des suggestions, veuillez me contacter par email : jason[AT]kenengba.com.",
+ "personal": "Site personnel",
+ "blog": "Mon blog",
+ "retiremoney": "Planificateur futur",
+ "twitter": "Twitter",
+ "Sponsor": "Sponsor"
+ },
+ "specialthanks": {
+ "Title": "Merci spécial",
+ "Note1": "Ce projet n'aurait pas pu être achevé sans le soutien et l'aide de certaines personnes et organisations enthousiastes, ainsi que de ceux qui ont fourni l'inspiration ou partagé leur code en open-source. Un grand merci à eux :"
+ },
+ "changelog": {
+ "Title": "Modifs",
+ "add": "Ajouté",
+ "improve": "Amélioré",
+ "fix": "Corrigé"
+ }
+}
diff --git a/frontend/locales/i18n.js b/frontend/locales/i18n.js
index faf6329c0..846a997bd 100644
--- a/frontend/locales/i18n.js
+++ b/frontend/locales/i18n.js
@@ -1,14 +1,15 @@
import { createI18n } from 'vue-i18n';
// 引入语言文件
-import en from './en.json';
-import zh from './zh.json';
-import fr from './fr.json';
-import tr from './tr.json';
-import enSecurity from './security-checklist/en.json';
-import zhSecurity from './security-checklist/zh.json';
-import frSecurity from './security-checklist/fr.json';
-import trSecurity from './security-checklist/tr.json';
+// Node ESM 必须显式声明 JSON 导入属性;Vite 也支持这种写法,前后端一致
+import en from './en.json' with { type: 'json' };
+import zh from './zh.json' with { type: 'json' };
+import fr from './fr.json' with { type: 'json' };
+import tr from './tr.json' with { type: 'json' };
+import enSecurity from './security-checklist/en.json' with { type: 'json' };
+import zhSecurity from './security-checklist/zh.json' with { type: 'json' };
+import frSecurity from './security-checklist/fr.json' with { type: 'json' };
+import trSecurity from './security-checklist/tr.json' with { type: 'json' };
const messages = { en, zh, fr, tr };
diff --git a/frontend/locales/security-checklist/en.json b/frontend/locales/security-checklist/en.json
index 356fb8253..d2ae49966 100644
--- a/frontend/locales/security-checklist/en.json
+++ b/frontend/locales/security-checklist/en.json
@@ -3,7 +3,6 @@
"title": "Authentication",
"slug": "authentication",
"description": "Securing your online account login credentials",
- "icon": "bi-key-fill",
"intro": "Most reported data breaches are caused by the use of weak, default or stolen passwords (according to [this Verizon report](http://www.verizonenterprise.com/resources/reports/rp_dbir-2016-executive-summary_xg_en.pdf)). Use long, strong and unique passwords, manage them in a secure password manager, enable 2-factor authentication, keep on top of breaches and take care while logging into your accounts.",
"checklist": [
{
@@ -138,7 +137,6 @@
"title": "Web Browsing",
"slug": "web-browsing",
"description": "Avoiding tracking, censorship, and data collection online",
- "icon": "bi-browser-safari",
"intro": "Most websites on the internet will use some form of tracking, often to gain insight into their users behaviour and preferences. This data can be incredibly detailed, and so is extremely valuable to corporations, governments and intellectual property thieves. Data breaches and leaks are common, and deanonymizing users web activity is often a trivial task.\n\nThere are two primary methods of tracking; stateful (cookie-based), and stateless (fingerprint-based). Cookies are small pieces of information, stored in your browser with a unique ID that is used to identify you. Browser fingerprinting is a highly accurate way to identify and track users wherever they go online. The information collected is quite comprehensive, and often includes browser details, OS, screen resolution, supported fonts, plugins, time zone, language and font preferences, and even hardware configurations.\n\nThis section outlines the steps you can take, to be better protected from threats, minimise online tracking and improve privacy.",
"checklist": [
{
@@ -381,7 +379,6 @@
"title": "Email",
"slug": "email",
"description": "Protecting the gateway to your online accounts",
- "icon": "bi-envelope-fill",
"intro": "Nearly 50 years since the first email was sent, it's still very much a big part of our day-to-day life, and will continue to be for the near future. So considering how much trust we put in them, it's surprising how fundamentally insecure this infrastructure is. Email-related fraud [is on the up](https://www.csoonline.com/article/3247670/email/email-security-in-2018.html), and without taking basic measures you could be at risk.\n\nIf a hacker gets access to your emails, it provides a gateway for your other accounts to be compromised (through password resets), therefore email security is paramount for your digital safety.\n\nThe big companies providing \"free\" email service, don't have a good reputation for respecting users privacy: Gmail was caught giving [third parties full access](https://www.wsj.com/articles/techs-dirty-secret-the-app-developers-sifting-through-your-gmail-1530544442) to user emails and also [tracking all of your purchases](https://www.cnbc.com/2019/05/17/google-gmail-tracks-purchase-history-how-to-delete-it.html). Yahoo was also caught scanning emails in real-time [for US surveillance agencies](http://news.trust.org/item/20161004170601-99f8c) Advertisers [were granted access](https://thenextweb.com/insider/2018/08/29/both-yahoo-and-aol-are-scanning-customer-emails-to-attract-advertisers) to Yahoo and AOL users messages to “identify and segment potential customers by picking up on contextual buying signals, and past purchases.”",
"checklist": [
{
@@ -516,7 +513,6 @@
"title": "Messaging",
"slug": "messaging",
"description": "Keeping your communications private and secure",
- "icon": "bi-chat-dots-fill",
"intro": "",
"checklist": [
{
@@ -639,7 +635,6 @@
"title": "Social Media",
"slug": "social-media",
"description": "Minimizing the risks associated with using online communities",
- "icon": "bi-people-fill",
"intro": "Online communities have existed since the invention of the internet, and give people around the world the opportunity to connect, communicate and share. Although these networks are a great way to promote social interaction and bring people together, that have a dark side - there are some serious [Privacy Concerns with Social Networking Services](https://en.wikipedia.org/wiki/Privacy_concerns_with_social_networking_services), and these social networking sites are owned by private corporations, and that they make their money by collecting data about individuals and selling that data on, often to third party advertisers.\nSecure your account, lock down your privacy settings, but know that even after doing so, all data intentionally and non-intentionally uploaded is effectively public. If possible, avoid using conventional social media networks.\n",
"checklist": [
{
@@ -738,7 +733,6 @@
"title": "Networks",
"slug": "networks",
"description": "Safeguarding your network traffic",
- "icon": "bi-shield-shaded",
"intro": "This section covers how you connect your devices to the internet securely, including configuring your router and setting up a VPN.\n",
"checklist": [
{
@@ -897,7 +891,6 @@
"title": "Mobile Devices",
"slug": "mobile-devices",
"description": "Reduce invasive tracking for cells, smartphones and tablets",
- "icon": "bi-phone-fill",
"intro": "Smart phones have revolutionized so many aspects of life and brought the world to our fingertips. For many of us, smart phones are our primary means of communication, entertainment and access to knowledge. But while they've brought convenience to whole new level, there's some ugly things going on behind the screen.\nGeo-tracking is used to trace our every move, and we have little control over who has this data- your phone is even able to [track your location without GPS](https://gizmodo.com/how-to-track-a-cellphone-without-gps-or-consent-1821125371). Over the years numerous reports that surfaced, outlining ways in which your phone's [mic can eavesdrop](https://www.independent.co.uk/life-style/gadgets-and-tech/news/smartphone-apps-listening-privacy-alphonso-shazam-advertising-pool-3d-honey-quest-a8139451.html), and the [camera can watch you](https://www.businessinsider.com/hackers-governments-smartphone-iphone-camera-wikileaks-cybersecurity-hack-privacy-webcam-2017-6)- all without your knowledge or consent. And then there's the malicious apps, lack of security patches and potential/ likely backdoors.\nUsing a smart phone generates a lot of data about you- from information you intentionally share, to data silently generated from your actions. It can be scary to see what Google, Microsoft, Apple and Facebook know about us- sometimes they know more than our closest family. It's hard to comprehend what your data will reveal, especially in conjunction with other data.\nThis data is used for [far more than just advertising](https://internethealthreport.org/2018/the-good-the-bad-and-the-ugly-sides-of-data-tracking/) - more often it's used to rate people for finance, insurance and employment. Targeted ads can even be used for fine-grained surveillance (see [ADINT](https://adint.cs.washington.edu))\nMore of us are concerned about how [governments use collect and use our smart phone data](https://www.statista.com/statistics/373916/global-opinion-online-monitoring-government/), and rightly so, federal agencies often [request our data from 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, and other tech companies. Sometimes requests are made in bulk, returning detailed information on everybody within a certain geo-fence, [often for innocent people](https://www.nytimes.com/interactive/2019/04/13/us/google-location-tracking-police.html). And this doesn't include all of the internet traffic that intelligence agencies around the world have unhindered access to.\n",
"checklist": [
{
@@ -1044,7 +1037,6 @@
"title": "Personal Computers",
"slug": "personal-computers",
"description": "Securing your PC's operating system, data & activity",
- "icon": "bi-laptop-fill",
"intro": "Although Windows and OS X are easy to use and convenient, they both are far from secure. Your OS provides the interface between hardware and your applications, so if compromised can have detrimental effects.\n",
"checklist": [
{
@@ -1263,7 +1255,6 @@
"title": "Smart Home",
"slug": "smart-home",
"description": "Using IoT devices without compromising your privacy",
- "icon": "bi-house-add-fill",
"intro": "Home assistants (such as Google Home, Alexa and Siri) and other internet connected devices collect large amounts of personal data (including voice samples, location data, home details and logs of all interactions). Since you have limited control on what is being collected, how it's stored, and what it will be used for, this makes it hard to recommend any consumer smart-home products to anyone who cares about privacy and security.\nSecurity vs Privacy: There are many smart devices on the market that claim to increase the security of your home while being easy and convenient to use (Such as Smart Burglar Alarms, Internet Security Cameras, Smart Locks and Remote access Doorbells to name a few). These devices may appear to make security easier, but there is a trade-off in terms of privacy: as they collect large amounts of personal data, and leave you without control over how this is stored or used. The security of these devices is also questionable, since many of them can be (and are being) hacked, allowing an intruder to bypass detection with minimum effort.\nThe most privacy-respecting option, would be to not use \"smart\" internet-connected devices in your home, and not to rely on a security device that requires an internet connection. But if you do, it is important to fully understand the risks of any given product, before buying it. Then adjust settings to increase privacy and security. The following checklist will help mitigate the risks associated with internet-connected home devices.",
"checklist": [
{
@@ -1350,7 +1341,6 @@
"title": "Personal Finance",
"slug": "personal-finance",
"description": "Protecting your funds, financial accounts and transactions",
- "icon": "bi-currency-exchange",
"intro": "Credit card fraud is the most common form of identity theft (with [133,015 reports in the US in 2017 alone](https://www.experian.com/blogs/ask-experian/identity-theft-statistics/)), and a total loss of $905 million, which was a 26% increase from the previous year. The with a median amount lost per person was $429 in 2017. It's more important than ever to take basic steps to protect yourself from falling victim\nNote about credit cards: Credit cards have technological methods in place to detect and stop some fraudulent transactions. Major payment processors implement this, by mining huge amounts of data from their card holders, in order to know a great deal about each persons spending habits. This data is used to identify fraud, but is also sold onto other data brokers. Credit cards are therefore good for security, but terrible for data privacy.",
"checklist": [
{
@@ -1419,7 +1409,6 @@
"title": "Human Aspect",
"slug": "human-aspect",
"description": "Avoiding social engineering security risks",
- "icon": "bi-person-bounding-box",
"intro": "Many data breaches, hacks and attacks are caused by human error. The following list contains steps you should take, to reduce the risk of this happening to you. Many of them are common sense, but it's worth takin note of.",
"checklist": [
{
@@ -1554,7 +1543,6 @@
"title": "Physical Security",
"slug": "physical-security",
"description": "Taking measures to prevent IRL security incidents",
- "icon": "bi-file-earmark-break-fill",
"intro": "Public records often include sensitive personal data (full name, date of birth, phone number, email, address, ethnicity etc), and are gathered from a range of sources (census records, birth/ death/ marriage certificates, voter registrants, marketing information, customer databases, motor vehicle records, professional/ business licenses and all court files in full detail). This sensitive personal information is [easy and legal to access](https://www.consumerreports.org/consumerist/its-creepy-but-not-illegal-for-this-website-to-provide-all-your-public-info-to-anyone/), which raises some [serious privacy concerns](https://privacyrights.org/resources/public-records-internet-privacy-dilemma) (identity theft, personal safety risks/ stalkers, destruction of reputations, dossier society)\n\nCCTV is one of the major ways that the corporations, individuals and the government tracks your movements. In London, UK the average person is caught on camera about 500 times per day. This network is continuing to grow, and in many cities around the world, facial recognition is being rolled out, meaning the state can know the identity of residents on the footage in real-time.\nStrong authentication, encrypted devices, patched software and anonymous web browsing may be of little use if someone is able to physically compromise you, your devices and your data. This section outlines some basic methods for physical security",
"checklist": [
{
diff --git a/frontend/locales/security-checklist/fr.json b/frontend/locales/security-checklist/fr.json
index 2fcd689a9..a3d1d9078 100644
--- a/frontend/locales/security-checklist/fr.json
+++ b/frontend/locales/security-checklist/fr.json
@@ -3,7 +3,6 @@
"title": "Authentification",
"slug": "authentication",
"description": "Sécuriser les identifiants de connexion de votre compte en ligne",
- "icon": "bi-key-fill",
"intro": "La plupart des violations de données signalées sont causées par l'utilisation de mots de passe faibles, par défaut ou volés (selon [ce rapport Verizon](http://www.verizonenterprise.com/resources/reports/rp_dbir-2016-executive-summary_xg_en.pdf)). Utilisez des mots de passe longs, forts et uniques, gérez-les dans un gestionnaire de mots de passe sécurisé, activez l'authentification à 2 facteurs, restez au courant des violations et faites attention lorsque vous vous connectez à vos comptes.",
"checklist": [
{
@@ -138,7 +137,6 @@
"title": "Navigation Web",
"slug": "web-browsing",
"description": "Éviter le suivi, la censure et la collecte de données en ligne",
- "icon": "bi-browser-safari",
"intro": "La plupart des sites Web sur Internet utilisent une forme de suivi, souvent pour obtenir un aperçu du comportement et des préférences de leurs utilisateurs. Ces données peuvent être incroyablement détaillées et sont donc extrêmement précieuses pour les entreprises, les gouvernements et les voleurs de propriété intellectuelle. Les violations de données et les fuites sont courantes, et la désanonymisation de l'activité Web des utilisateurs est souvent une tâche triviale.\n\nIl existe deux principales méthodes de suivi : avec état (basée sur les cookies) et sans état (basée sur l'empreinte digitale). Les cookies sont de petits éléments d'information, stockés dans votre navigateur avec un identifiant unique qui est utilisé pour vous identifier. L'empreinte digitale du navigateur est un moyen très précis d'identifier et de suivre les utilisateurs où qu'ils aillent en ligne. Les informations collectées sont assez complètes et incluent souvent les détails du navigateur, le système d'exploitation, la résolution de l'écran, les polices prises en charge, les plugins, le fuseau horaire, la langue et les préférences de police, et même les configurations matérielles.\n\nCette section décrit les étapes que vous pouvez suivre pour être mieux protégé contre les menaces, minimiser le suivi en ligne et améliorer la confidentialité.",
"checklist": [
{
@@ -381,7 +379,6 @@
"title": "Email",
"slug": "email",
"description": "Protéger la passerelle vers vos comptes en ligne",
- "icon": "bi-envelope-fill",
"intro": "Près de 50 ans après l'envoi du premier e-mail, il occupe toujours une place importante dans notre vie quotidienne et continuera de l'être dans un avenir proche. Donc, compte tenu de la confiance que nous leur accordons, il est surprenant de constater à quel point cette infrastructure est fondamentalement non sécurisée. La fraude liée aux e-mails [est en augmentation](https://www.csoonline.com/article/3247670/email/email-security-in-2018.html), et sans prendre de mesures de base, vous pourriez être en danger.\n\nSi un pirate informatique accède à vos e-mails, cela lui donne une passerelle pour compromettre vos autres comptes (par le biais de réinitialisations de mot de passe). Par conséquent, la sécurité des e-mails est primordiale pour votre sécurité numérique.\n\nLes grandes entreprises qui fournissent un service de messagerie \"gratuit\" n'ont pas une bonne réputation en matière de respect de la vie privée des utilisateurs : Gmail a été surpris en train de donner [un accès complet à des tiers](https://www.wsj.com/articles/techs-dirty-secret-the-app-developers-sifting-through-your-gmail-1530544442) aux e-mails des utilisateurs et de [suivre tous vos achats](https://www.cnbc.com/2019/05/17/google-gmail-tracks-purchase-history-how-to-delete-it.html). Yahoo a également été surpris en train d'analyser les e-mails en temps réel [pour les agences de surveillance américaines](http://news.trust.org/item/20161004170601-99f8c). Les annonceurs [ont eu accès](https://thenextweb.com/insider/2018/08/29/both-yahoo-and-aol-are-scanning-customer-emails-to-attract-advertisers) aux messages des utilisateurs de Yahoo et d'AOL pour « identifier et segmenter les clients potentiels en repérant les signaux d'achat contextuels et les achats passés. »",
"checklist": [
{
@@ -516,7 +513,6 @@
"title": "Messagerie",
"slug": "messaging",
"description": "Garder vos communications privées et sécurisées",
- "icon": "bi-chat-dots-fill",
"intro": "",
"checklist": [
{
@@ -639,7 +635,6 @@
"title": "Médias sociaux",
"slug": "social-media",
"description": "Minimiser les risques associés à l'utilisation des communautés en ligne",
- "icon": "bi-people-fill",
"intro": "Les communautés en ligne existent depuis l'invention d'Internet et donnent aux gens du monde entier la possibilité de se connecter, de communiquer et de partager. Bien que ces réseaux soient un excellent moyen de promouvoir l'interaction sociale et de rassembler les gens, ils ont un côté sombre - il existe de sérieuses [préoccupations en matière de confidentialité avec les services de réseaux sociaux](https://en.wikipedia.org/wiki/Privacy_concerns_with_social_networking_services), et ces sites de réseaux sociaux appartiennent à des sociétés privées, et qu'ils gagnent leur argent en collectant des données sur les individus et en vendant ces données, souvent à des annonceurs tiers.\nSécurisez votre compte, verrouillez vos paramètres de confidentialité, mais sachez que même après l'avoir fait, toutes les données téléchargées intentionnellement et non intentionnellement sont effectivement publiques. Si possible, évitez d'utiliser les réseaux de médias sociaux conventionnels.\n",
"checklist": [
{
@@ -738,7 +733,6 @@
"title": "Réseaux",
"slug": "networks",
"description": "Protéger votre trafic réseau",
- "icon": "bi-shield-shaded",
"intro": "Cette section couvre la manière de connecter vos appareils à Internet en toute sécurité, y compris la configuration de votre routeur et la mise en place d'un VPN.\n",
"checklist": [
{
@@ -897,7 +891,6 @@
"title": "Appareils Mobiles",
"slug": "mobile-devices",
"description": "Réduire le suivi invasif pour les téléphones portables, les smartphones et les tablettes",
- "icon": "bi-phone-fill",
"intro": "Les smartphones ont révolutionné de nombreux aspects de la vie et ont mis le monde à portée de main. Pour beaucoup d'entre nous, les smartphones sont notre principal moyen de communication, de divertissement et d'accès à la connaissance. Mais s'ils ont apporté un niveau de commodité inégalé, il y a des choses laides qui se passent derrière l'écran.\nLe géotracking est utilisé pour tracer chacun de nos mouvements, et nous avons peu de contrôle sur qui a ces données - votre téléphone est même capable de [suivre votre position sans GPS](https://gizmodo.com/how-to-track-a-cellphone-without-gps-or-consent-1821125371). Au fil des ans, de nombreux rapports ont fait surface, décrivant les façons dont le [micro de votre téléphone peut écouter](https://www.independent.co.uk/life-style/gadgets-and-tech/news/smartphone-apps-listening-privacy-alphonso-shazam-advertising-pool-3d-honey-quest-a8139451.html), et la [caméra peut vous regarder](https://www.businessinsider.com/hackers-governments-smartphone-iphone-camera-wikileaks-cybersecurity-hack-privacy-webcam-2017-6) - le tout à votre insu et sans votre consentement. Et puis il y a les applications malveillantes, le manque de correctifs de sécurité et les portes dérobées potentielles/probables.\nL'utilisation d'un smartphone génère beaucoup de données vous concernant - des informations que vous partagez intentionnellement aux données générées silencieusement par vos actions. Il peut être effrayant de voir ce que Google, Microsoft, Apple et Facebook savent de nous - parfois ils en savent plus que notre famille la plus proche. Il est difficile de comprendre ce que vos données révéleront, surtout en conjonction avec d'autres données.\nCes données sont utilisées pour [bien plus que de la simple publicité](https://internethealthreport.org/2018/the-good-the-bad-and-the-ugly-sides-of-data-tracking/) - le plus souvent, elles sont utilisées pour évaluer les gens pour la finance, l'assurance et l'emploi. Les publicités ciblées peuvent même être utilisées pour une surveillance fine (voir [ADINT](https://adint.cs.washington.edu))\nNous sommes de plus en plus nombreux à nous préoccuper de la manière dont [les gouvernements utilisent, collectent et utilisent les données de nos smartphones](https://www.statista.com/statistics/373916/global-opinion-online-monitoring-government/), et à juste titre, les agences fédérales [demandent souvent nos données à 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 et d'autres entreprises technologiques. Parfois, les demandes sont faites en masse, renvoyant des informations détaillées sur tout le monde dans une certaine zone géographique, [souvent pour des personnes innocentes](https://www.nytimes.com/interactive/2019/04/13/us/google-location-tracking-police.html). Et cela n'inclut pas tout le trafic Internet auquel les agences de renseignement du monde entier ont un accès illimité.\n",
"checklist": [
{
@@ -1044,7 +1037,6 @@
"title": "Ordinateurs personnels",
"slug": "personal-computers",
"description": "Sécurisation du système d'exploitation, des données et de l'activité de votre PC",
- "icon": "bi-laptop-fill",
"intro": "Bien que Windows et OS X soient faciles à utiliser et pratiques, ils sont loin d'être sécurisés. Votre système d'exploitation fournit l'interface entre le matériel et vos applications, donc s'il est compromis, cela peut avoir des effets néfastes.\n",
"checklist": [
{
@@ -1263,7 +1255,6 @@
"title": "Maison intelligente",
"slug": "smart-home",
"description": "Utiliser les appareils IoT sans compromettre votre vie privée",
- "icon": "bi-house-add-fill",
"intro": "Les assistants domestiques (tels que Google Home, Alexa et Siri) et autres appareils connectés à Internet collectent de grandes quantités de données personnelles (y compris des échantillons de voix, des données de localisation, des détails sur la maison et des journaux de toutes les interactions). Étant donné que vous avez un contrôle limité sur ce qui est collecté, comment il est stocké et à quoi il servira, il est difficile de recommander des produits de domotique grand public à quiconque se soucie de la confidentialité et de la sécurité.\nSécurité vs Confidentialité : Il existe de nombreux appareils intelligents sur le marché qui prétendent augmenter la sécurité de votre maison tout en étant faciles et pratiques à utiliser (tels que les alarmes anti-intrusion intelligentes, les caméras de sécurité Internet, les serrures intelligentes et les sonnettes d'accès à distance pour n'en nommer que quelques-uns). Ces appareils peuvent sembler faciliter la sécurité, mais il y a un compromis en termes de confidentialité : comme ils collectent de grandes quantités de données personnelles, et vous laissent sans contrôle sur la façon dont elles sont stockées ou utilisées. La sécurité de ces appareils est également discutable, car beaucoup d'entre eux peuvent être (et sont) piratés, permettant à un intrus de contourner la détection avec un minimum d'effort.\nL'option la plus respectueuse de la vie privée serait de ne pas utiliser d'appareils \"intelligents\" connectés à Internet dans votre maison, et de ne pas compter sur un appareil de sécurité qui nécessite une connexion Internet. Mais si vous le faites, il est important de bien comprendre les risques de tout produit donné, avant de l'acheter. Ajustez ensuite les paramètres pour augmenter la confidentialité et la sécurité. La liste de contrôle suivante vous aidera à atténuer les risques associés aux appareils domestiques connectés à Internet.",
"checklist": [
{
@@ -1350,7 +1341,6 @@
"title": "Finances personnelles",
"slug": "personal-finance",
"description": "Protéger vos fonds, vos comptes financiers et vos transactions",
- "icon": "bi-currency-exchange",
"intro": "La fraude à la carte de crédit est la forme la plus courante de vol d'identité (avec [133 015 signalements aux États-Unis en 2017 seulement](https://www.experian.com/blogs/ask-experian/identity-theft-statistics/)), et une perte totale de 905 millions de dollars, ce qui représente une augmentation de 26 % par rapport à l'année précédente. Le montant médian perdu par personne était de 429 $ en 2017. Il est plus important que jamais de prendre des mesures de base pour vous protéger contre les victimes.\nRemarque sur les cartes de crédit : les cartes de crédit disposent de méthodes technologiques pour détecter et arrêter certaines transactions frauduleuses. Les principaux processeurs de paiement mettent cela en œuvre, en exploitant d'énormes quantités de données de leurs titulaires de cartes, afin de connaître en détail les habitudes de dépenses de chaque personne. Ces données sont utilisées pour identifier la fraude, mais sont également vendues à d'autres courtiers en données. Les cartes de crédit sont donc bonnes pour la sécurité, mais terribles pour la confidentialité des données.",
"checklist": [
{
@@ -1419,7 +1409,6 @@
"title": "Aspect Humain",
"slug": "human-aspect",
"description": "Éviter les risques de sécurité liés à l'ingénierie sociale",
- "icon": "bi-person-bounding-box",
"intro": "De nombreuses violations de données, piratages et attaques sont causés par une erreur humaine. La liste suivante contient les étapes que vous devriez suivre pour réduire le risque que cela ne vous arrive. Beaucoup d'entre elles relèvent du bon sens, mais il est important d'en prendre note.",
"checklist": [
{
@@ -1554,7 +1543,6 @@
"title": "Sécurité physique",
"slug": "physical-security",
"description": "Prendre des mesures pour prévenir les incidents de sécurité IRL",
- "icon": "bi-file-earmark-break-fill",
"intro": "Les registres publics comprennent souvent des données personnelles sensibles (nom complet, date de naissance, numéro de téléphone, e-mail, adresse, origine ethnique, etc.) et sont recueillies à partir de diverses sources (registres de recensement, certificats de naissance/décès/mariage, registres d'électeurs, informations marketing, bases de données clients, registres de véhicules à moteur, permis professionnels/commerciaux et tous les dossiers judiciaires en détail). Ces informations personnelles sensibles sont [faciles et légales d'accès](https://www.consumerreports.org/consumerist/its-creepy-but-not-illegal-for-this-website-to-provide-all-your-public-info-to-anyone/), ce qui soulève de [sérieuses préoccupations en matière de confidentialité](https://privacyrights.org/resources/public-records-internet-privacy-dilemma) (vol d'identité, risques pour la sécurité personnelle/harceleurs, destruction de réputations, société de dossiers).\n\nLa vidéosurveillance est l'un des principaux moyens par lesquels les entreprises, les particuliers et le gouvernement suivent vos mouvements. À Londres, au Royaume-Uni, une personne moyenne est filmée environ 500 fois par jour. Ce réseau continue de croître, et dans de nombreuses villes du monde, la reconnaissance faciale est en cours de déploiement, ce qui signifie que l'État peut connaître l'identité des résidents sur les images en temps réel.\nUne authentification forte, des appareils chiffrés, des logiciels corrigés et une navigation Web anonyme peuvent être de peu d'utilité si quelqu'un est capable de vous compromettre physiquement, vous, vos appareils et vos données. Cette section décrit certaines méthodes de base pour la sécurité physique.",
"checklist": [
{
diff --git a/frontend/locales/security-checklist/tr.json b/frontend/locales/security-checklist/tr.json
index c77f4fd5f..54fe42830 100644
--- a/frontend/locales/security-checklist/tr.json
+++ b/frontend/locales/security-checklist/tr.json
@@ -3,7 +3,6 @@
"title": "Kimlik Doğrulama",
"slug": "authentication",
"description": "Çevrimiçi hesap giriş kimlik bilgilerinizin güvenliğini sağlama",
- "icon": "bi-key-fill",
"intro": "Rapor edilen veri ihlallerinin çoğu, zayıf, varsayılan veya çalınmış parolaların kullanılması nedeniyle meydana gelir (bu [Verizon raporuna](http://www.verizonenterprise.com/resources/reports/rp_dbir-2016-executive-summary_xg_en.pdf) göre). Uzun, güçlü ve benzersiz parolalar kullanın, bunları güvenli bir parola yöneticisinde saklayın, 2 faktörlü kimlik doğrulamayı etkinleştirin, ihlallerden haberdar olun ve hesaplarınıza giriş yaparken dikkatli olun.",
"checklist": [
{
@@ -138,7 +137,6 @@
"title": "Web Tarama",
"slug": "web-browsing",
"description": "Çevrimiçi izlenme, sansür ve veri toplanmasından kaçınma",
- "icon": "bi-browser-safari",
"intro": "İnternetteki çoğu web sitesi, genellikle kullanıcıların davranışları ve tercihleri hakkında bilgi edinmek için bir tür izleme kullanır. Bu veriler son derece ayrıntılı olabilir ve bu nedenle şirketler, hükümetler ve fikri mülkiyet hırsızları için çok değerlidir. Veri sızıntıları yaygındır ve kullanıcıların web etkinliklerinin kimliklerinin açığa çıkarılması çoğu zaman basit bir görevdir.\n\nİzlemenin iki ana yöntemi vardır: durumlu (çerez tabanlı) ve durumsuz (parmak izi tabanlı). Çerezler, tarayıcınızda saklanan ve sizi tanımlamak için kullanılan benzersiz kimlik içeren küçük bilgilerdir. Tarayıcı parmak izi alma, kullanıcıları gittikleri her yerde tanımlamanın çok hassas bir yoludur. Toplanan bilgiler kapsamlıdır; tarayıcı ayrıntıları, işletim sistemi, ekran çözünürlüğü, desteklenen yazı tipleri, eklentiler, zaman dilimi, dil tercihleri ve hatta donanım yapılandırmaları dahil olabilir.\n\nBu bölüm, tehditlerden daha iyi korunmak, çevrimiçi takibi en aza indirmek ve gizliliği artırmak için atabileceğiniz adımları özetler.",
"checklist": [
{
@@ -381,7 +379,6 @@
"title": "E-posta",
"slug": "email",
"description": "Çevrimiçi hesaplara açılan kapının korunması",
- "icon": "bi-envelope-fill",
"intro": "İlk e-postanın gönderilmesinden yaklaşık 50 yıl sonra bile e-posta günlük hayatımızın büyük bir parçası olmaya devam ediyor ve bu yakın gelecekte de değişmeyecek. Bu kadar güven duyduğumuz bir altyapının ne kadar temel olarak güvensiz olduğu şaşırtıcı. E-posta ile ilgili dolandırıcılıklar artıyor ve temel önlemler alınmazsa risk altında olabilirsiniz.\n\nBir hacker e-postalarınıza erişirse, bu diğer hesaplarınızın ele geçirilmesi için bir kapı sağlar (parola sıfırlama yoluyla), bu yüzden e-posta güvenliği dijital güvenliğiniz için çok önemlidir.\n\nBüyük şirketler ücretsiz e-posta hizmeti sağlarken kullanıcı gizliliğine iyi davranmakla anılmıyor: Gmail'in üçüncü taraflara kullanıcı maillerine tam erişim verdiği ve satın alımlarınızı izlediği durumlar raporlandı. Yahoo da e-postaları gerçek zamanlı olarak gözetlemek için kullanıldığı iddialarıyla gündeme gelmişti.",
"checklist": [
{
@@ -516,7 +513,6 @@
"title": "Mesajlaşma",
"slug": "messaging",
"description": "İletişimlerinizi gizli ve güvenli tutma",
- "icon": "bi-chat-dots-fill",
"intro": "",
"checklist": [
{
@@ -639,7 +635,6 @@
"title": "Sosyal Medya",
"slug": "social-media",
"description": "Çevrimiçi toplulukların kullanımıyla ilgili riskleri en aza indirme",
- "icon": "bi-people-fill",
"intro": "Çevrimiçi topluluklar internetin icadından beri var ve insanlara dünya çapında bağlantı, iletişim ve paylaşım fırsatı sunar. Bu ağlar sosyal etkileşimi teşvik ederken karanlık tarafları da vardır — sosyal ağ hizmetleriyle ilgili ciddi gizlilik endişeleri bulunmaktadır. Bu sosyal ağlar özel şirketler tarafından işletilir ve gelirlerini genellikle bireyler hakkında veri toplayıp satmaktan sağlarlar.\nHesabınızı güvence altına alın, gizlilik ayarlarınızı sıkılaştırın; ancak bunları yapsanız bile yüklediğiniz tüm verilerin (kasıtlı veya istemeden) fiilen herkese açık olabileceğini unutmayın. Mümkünse geleneksel sosyal medyadan kaçının.",
"checklist": [
{
@@ -738,7 +733,6 @@
"title": "Ağlar",
"slug": "networks",
"description": "Ağ trafiğinizi koruma",
- "icon": "bi-shield-shaded",
"intro": "Bu bölüm, cihazlarınızı internete güvenli şekilde bağlama, yönlendiricinizi yapılandırma ve VPN kurulumu hakkında bilgi verir.",
"checklist": [
{
@@ -897,7 +891,6 @@
"title": "Mobil Cihazlar",
"slug": "mobile-devices",
"description": "Cep telefonları, akıllı telefonlar ve tabletler için izlemeyi azaltma",
- "icon": "bi-phone-fill",
"intro": "Akıllı telefonlar hayatın birçok yönünü değiştirdi ve dünyayı parmaklarımızın ucuna getirdi. Birçoğumuz için telefonlar iletişim, eğlence ve bilgiye erişimin birincil aracıdır. Ancak ekran arkasında pek çok sorun vardır.\nGeo-takip, her hareketimizi izlemek için kullanılır ve bu verinin kimde olduğu üzerinde çok az kontrolümüz vardır; telefonunuz GPS olmadan bile konumunuzu izleyebilir. Yıllar içinde birçok rapor, telefonunuzun mikrofonunun dinleyebildiğini veya kameranın sizi izleyebildiğini ve bunun fark edilmeden gerçekleşebileceğini göstermiştir. Ayrıca kötü amaçlı uygulamalar, güncelleme eksikliği ve potansiyel arka kapılar da endişe kaynağıdır.\nAkıllı telefon kullanımı size ait veriler üretir — bilerek paylaştığınız bilgilerden eylemlerinizden sessizce oluşturulan verilere kadar. Google, Microsoft, Apple ve Facebook'un bizler hakkında ne bildiğini görmek ürkütücü olabilir — bazen ailemizden daha fazlasını bilirler. Bu veriler sadece reklamlardan fazlası için kullanılır; finans, sigorta ve istihdam için puanlama gibi işlemlerde de kullanılabilir.\nBirçok kişi hükümetlerin akıllı telefon verilerini nasıl kullandığından endişe duyuyor ve haklılar; yetkililer sıklıkla Google, Facebook, Apple, Microsoft, Amazon ve diğer teknoloji şirketlerinden veri talep ediyor. Bu talepler bazen geniş çaplı olup masum insanları da kapsıyor. Bu, barındırdığınız veya kullandığınız verilerin genel bir gözetim altında olabileceği anlamına gelir.",
"checklist": [
{
@@ -1044,7 +1037,6 @@
"title": "Kişisel Bilgisayarlar",
"slug": "personal-computers",
"description": "PC işletim sistemi, veriler ve etkinliklerinizi güvence altına alma",
- "icon": "bi-laptop-fill",
"intro": "Windows ve macOS kullanımı kolay olsa da, her ikisi de güvenlik açısından kusursuz değildir. İşletim sisteminiz donanım ve uygulamalar arasındaki arayüzü sağlar; bu katman ele geçirilirse ciddi sonuçlar doğurabilir.",
"checklist": [
{
@@ -1263,7 +1255,6 @@
"title": "Smart Home",
"slug": "smart-home",
"description": "Using IoT devices without compromising your privacy",
- "icon": "bi-house-add-fill",
"intro": "Home assistants (such as Google Home, Alexa and Siri) and other internet connected devices collect large amounts of personal data (including voice samples, location data, home details and logs of all interactions). Since you have limited control on what is being collected, how it's stored, and what it will be used for, this makes it hard to recommend any consumer smart-home products to anyone who cares about privacy and security.\nSecurity vs Privacy: There are many smart devices on the market that claim to increase the security of your home while being easy and convenient to use (Such as Smart Burglar Alarms, Internet Security Cameras, Smart Locks and Remote access Doorbells to name a few). These devices may appear to make security easier, but there is a trade-off in terms of privacy: as they collect large amounts of personal data, and leave you without control over how this is stored or used. The security of these devices is also questionable, since many of them can be (and are being) hacked, allowing an intruder to bypass detection with minimum effort.\nThe most privacy-respecting option, would be to not use \"smart\" internet-connected devices in your home, and not to rely on a security device that requires an internet connection. But if you do, it is important to fully understand the risks of any given product, before buying it. Then adjust settings to increase privacy and security. The following checklist will help mitigate the risks associated with internet-connected home devices.",
"checklist": [
{
@@ -1296,7 +1287,6 @@
"title": "Personal Finance",
"slug": "personal-finance",
"description": "Protecting your funds, financial accounts and transactions",
- "icon": "bi-currency-exchange",
"intro": "Credit card fraud is the most common form of identity theft (with [133,015 reports in the US in 2017 alone](https://www.experian.com/blogs/ask-experian/identity-theft-statistics/)), and a total loss of $905 million, which was a 26% increase from the previous year. The with a median amount lost per person was $429 in 2017. It's more important than ever to take basic steps to protect yourself from falling victim\nNote about credit cards: Credit cards have technological methods in place to detect and stop some fraudulent transactions. Major payment processors implement this, by mining huge amounts of data from their card holders, in order to know a great deal about each persons spending habits. This data is used to identify fraud, but is also sold onto other data brokers. Credit cards are therefore good for security, but terrible for data privacy.",
"checklist": [
{
@@ -1365,7 +1355,6 @@
"title": "Human Aspect",
"slug": "human-aspect",
"description": "Avoiding social engineering security risks",
- "icon": "bi-person-bounding-box",
"intro": "Many data breaches, hacks and attacks are caused by human error. The following list contains steps you should take, to reduce the risk of this happening to you. Many of them are common sense, but it's worth takin note of.",
"checklist": [
{
@@ -1500,7 +1489,6 @@
"title": "Physical Security",
"slug": "physical-security",
"description": "Taking measures to prevent IRL security incidents",
- "icon": "bi-file-earmark-break-fill",
"intro": "Public records often include sensitive personal data (full name, date of birth, phone number, email, address, ethnicity etc), and are gathered from a range of sources (census records, birth/ death/ marriage certificates, voter registrants, marketing information, customer databases, motor vehicle records, professional/ business licenses and all court files in full detail). This sensitive personal information is [easy and legal to access](https://www.consumerreports.org/consumerist/its-creepy-but-not-illegal-for-this-website-to-provide-all-your-public-info-to-anyone/), which raises some [serious privacy concerns](https://privacyrights.org/resources/public-records-internet-privacy-dilemma) (identity theft, personal safety risks/ stalkers, destruction of reputations, dossier society)\n\nCCTV is one of the major ways that the corporations, individuals and the government tracks your movements. In London, UK the average person is caught on camera about 500 times per day. This network is continuing to grow, and in many cities around the world, facial recognition is being rolled out, meaning the state can know the identity of residents on the footage in real-time.\nStrong authentication, encrypted devices, patched software and anonymous web browsing may be of little use if someone is able to physically compromise you, your devices and your data. This section outlines some basic methods for physical security",
"checklist": [
{
diff --git a/frontend/locales/security-checklist/zh.json b/frontend/locales/security-checklist/zh.json
index 361e5373e..9500f8384 100644
--- a/frontend/locales/security-checklist/zh.json
+++ b/frontend/locales/security-checklist/zh.json
@@ -3,7 +3,6 @@
"title": "身份验证",
"slug": "authentication",
"description": "保护您的在线账户登录凭据",
- "icon": "bi-key-fill",
"intro": "根据 [Verizon 的这份报告](http://www.verizonenterprise.com/resources/reports/rp_dbir-2016-executive-summary_xg_en.pdf),大多数已报告的数据泄露是由于使用弱、默认或被盗密码造成的。请使用长而强且唯一的密码,将它们存储在安全的密码管理器中,启用双因素身份验证,关注数据泄露情况,并在登录账户时小心谨慎。",
"checklist": [
{
@@ -138,7 +137,6 @@
"title": "网页浏览",
"slug": "web-browsing",
"description": "避免在线跟踪、审查和数据收集",
- "icon": "bi-browser-safari",
"intro": "互联网上的大多数网站都会使用某种形式的跟踪,通常是为了深入了解用户的行为和偏好。这些数据可能非常详细,因此对企业、政府和知识产权窃贼来说非常有价值。数据泄露和泄漏很常见,而对用户的网络活动进行去匿名化通常是一项微不足道的任务。\n\n有两种主要的跟踪方法:有状态(基于 cookie)和无状态(基于指纹)。Cookie 是存储在浏览器中的一小段信息,具有用于识别您的唯一 ID。浏览器指纹是一种高度准确的方法,可以识别和跟踪用户在网上任何地方的行踪。收集的信息非常全面,通常包括浏览器详细信息、操作系统、屏幕分辨率、支持的字体、插件、时区、语言和字体偏好,甚至硬件配置。\n\n本节概述了您可以采取的步骤,以更好地保护自己免受威胁,最大程度地减少在线跟踪并提高隐私性。",
"checklist": [
{
@@ -381,7 +379,6 @@
"title": "电子邮件",
"slug": "email",
"description": "保护您在线帐户的入口",
- "icon": "bi-envelope-fill",
"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)。雅虎还被发现实时扫描电子邮件[以供美国监视机构使用](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)雅虎和 AOL 用户邮件,以“通过获取上下文购买信号和过去的购买来识别和细分潜在客户”。",
"checklist": [
{
@@ -516,7 +513,6 @@
"title": "即时通讯",
"slug": "messaging",
"description": "确保您的通信私密和安全",
- "icon": "bi-chat-dots-fill",
"intro": "",
"checklist": [
{
@@ -639,7 +635,6 @@
"title": "社交媒体",
"slug": "social-media",
"description": "最小化使用在线社区的风险",
- "icon": "bi-people-fill",
"intro": "自互联网发明以来,在线社区就已存在,它为世界各地的人们提供了联系、交流和分享的机会。虽然这些网络是促进社交互动和将人们聚集在一起的好方法,但它们也有黑暗的一面 - 存在一些严重的[社交网络服务隐私问题](https://en.wikipedia.org/wiki/Privacy_concerns_with_social_networking_services),而且这些社交网站归私营公司所有,它们通过收集个人数据并将这些数据出售(通常是出售给第三方广告商)来赚钱。\n保护您的帐户,锁定您的隐私设置,但要知道,即使这样做之后,所有有意和无意上传的数据实际上都是公开的。如果可能,请避免使用传统的社交媒体网络。\n",
"checklist": [
{
@@ -738,7 +733,6 @@
"title": "网络设备",
"slug": "networks",
"description": "保护您的网络流量",
- "icon": "bi-shield-shaded",
"intro": "本节介绍如何将您的设备安全地连接到互联网,包括配置您的路由器和设置 VPN。\n",
"checklist": [
{
@@ -897,7 +891,6 @@
"title": "移动设备",
"slug": "mobile-devices",
"description": "减少对手机、智能手机和平板电脑的侵入性跟踪",
- "icon": "bi-phone-fill",
"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使用智能手机会产生大量关于您的数据 - 从您有意共享的信息到从您的行为中默默生成的数据。看到谷歌、微软、苹果和 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/),这是理所当然的,联邦机构经常[向谷歌](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/)、苹果、微软、亚马逊和其他科技公司索取我们的数据。有时会批量提出请求,返回某个地理围栏内每个人的详细信息,[通常是针对无辜的人](https://www.nytimes.com/interactive/2019/04/13/us/google-location-tracking-police.html)。这还不包括世界各地的情报机构可以不受阻碍地访问的所有互联网流量。\n",
"checklist": [
{
@@ -1044,7 +1037,6 @@
"title": "个人电脑",
"slug": "personal-computers",
"description": "保护您的 PC 操作系统、数据和活动",
- "icon": "bi-laptop-fill",
"intro": "尽管 Windows 和 OS X 易于使用且方便,但它们都远非安全。您的操作系统提供了硬件和应用程序之间的接口,因此如果受到威胁,可能会产生不利影响。\n",
"checklist": [
{
@@ -1263,7 +1255,6 @@
"title": "智能家居",
"slug": "smart-home",
"description": "使用物联网设备而不损害您的隐私",
- "icon": "bi-house-add-fill",
"intro": "家庭助手(例如 Google Home、Alexa 和 Siri)和其他互联网连接设备收集大量个人数据(包括语音样本、位置数据、家庭详细信息和所有交互的日志)。由于您对收集的内容、存储方式以及用途的控制有限,因此很难向任何关心隐私和安全的人推荐任何消费者智能家居产品。\n安全与隐私:市场上有许多智能设备声称可以提高您家庭的安全性,同时使用起来简单方便(例如智能防盗警报器、互联网安全摄像头、智能锁和远程访问门铃等等)。这些设备可能看起来使安全性更容易,但在隐私方面需要权衡:因为它们收集大量个人数据,并且让您无法控制如何存储或使用这些数据。这些设备的安全性也值得怀疑,因为其中许多设备可以(并且正在)被黑客入侵,从而使入侵者能够以最小的努力绕过检测。\n最尊重隐私的选择是不在您的家中使用“智能”互联网连接设备,并且不依赖需要互联网连接的安全设备。但如果您这样做,在购买之前充分了解任何给定产品的风险非常重要。然后调整设置以提高隐私和安全性。以下清单将帮助您减轻与互联网连接的家庭设备相关的风险。",
"checklist": [
{
@@ -1350,7 +1341,6 @@
"title": "个人财务",
"slug": "personal-finance",
"description": "保护您的资金、金融账户和交易",
- "icon": "bi-currency-exchange",
"intro": "信用卡欺诈是最常见的身份盗窃形式([仅在 2017 年美国就有 133,015 起报告](https://www.experian.com/blogs/ask-experian/identity-theft-statistics/)),总损失达 9.05 亿美元,比上一年增加了 26%。每人损失的中位数为 429 美元(2017 年)。采取基本步骤保护自己免受侵害比以往任何时候都更重要。\n关于信用卡的注意事项:信用卡采用技术手段来检测和阻止某些欺诈性交易。主要的支付处理商通过挖掘其持卡人的大量数据来实现这一点,以便深入了解每个人的消费习惯。这些数据用于识别欺诈,但也出售给其他数据代理商。因此,信用卡有利于安全性,但不利于数据隐私。",
"checklist": [
{
@@ -1419,7 +1409,6 @@
"title": "人为因素",
"slug": "human-aspect",
"description": "避免社会工程学安全风险",
- "icon": "bi-person-bounding-box",
"intro": "许多数据泄露、黑客攻击和攻击都是由人为错误引起的。以下列表包含您应该采取的步骤,以减少发生在您身上的风险。其中许多是常识,但值得注意。",
"checklist": [
{
@@ -1554,7 +1543,6 @@
"title": "物理安全",
"slug": "physical-security",
"description": "采取措施防止现实生活中的安全事件",
- "icon": "bi-file-earmark-break-fill",
"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": [
{
diff --git a/frontend/locales/tr.json b/frontend/locales/tr.json
index 8f346b371..1fbbd0793 100644
--- a/frontend/locales/tr.json
+++ b/frontend/locales/tr.json
@@ -159,8 +159,6 @@
"appSettings": "Program Ayarları",
"autoRun": "Otomatik Çalıştır",
"autoRunTips": "Devre dışı bırakılırsa, uygulama yalnızca yerel IP'yi kontrol eder ve testleri otomatik olarak çalıştırmaz.",
- "showMap": "Haritayı Göster",
- "showMapTips": "IP bilgi kartında bir harita görüntüler.",
"simpleMode": "Basit Mod",
"simpleModeTips": "IP kartlarında görüntülenen bilgiyi azaltır. Yalnızca mobil cihazlarda etkilidir.",
"connectivityAutoRefresh": "Çoklu Bağlantı Yenilemeleri",
@@ -261,7 +259,6 @@
"Note": "Çin Anakarası, Suudi Arabistan, Rusya ve Türkiye dahil olmak üzere sıkı internet sansürüyle bilinen dört bölgede hedef web sitelerinin kullanılabilirliğini kontrol eder. Testler ayrıca doğrulama için bir kontrol grubu olarak nispeten özgür internete sahip bölgelerden de yapılır. Bazı bölgelerde internet sansürü için net yasal hükümler varken, diğerleri daha belirsizdir.",
"Note2": "Sansür testini başlatmak için lütfen bir URL veya alan adı girin:",
"Note3": "Bir web sitesi, yalnızca aynı ülke içindeki tüm sunuculardan erişilemiyorsa engellenmiş sayılır.",
- "Run": "Testi Çalıştır",
"Placeholder": "URL veya Alan Adı",
"Country": "Bölge",
"Status": "Durum",
@@ -280,7 +277,6 @@
"Title": "Görünmezlik Testi",
"Note": "Bir proxy veya VPN kullandığınızda, ziyaret ettiğiniz web siteleri gerçekten bir proxy kullandığınızı bilmiyor mu? Gerçekten görünmez misiniz? Kılığınızdaki açıkları hesaplamak ve bir proxy kullandığınıza dair kanıt bulmak için çeşitli yöntemler kullanacağız. Bazı test sonuçları tamamen doğru olmasa da, bu test yine de oldukça bilgilendiricidir.",
"Note2": "Çalıştır'a tıkladıktan sonra, sistem genellikle tüm testleri 10 saniye içinde tamamlayan bir komut dosyası çalıştıracaktır. Bu süreçte IP bilgileriniz, tarayıcı bilgileriniz vb. toplanacak ve arka planda analiz edilecektir.",
- "Run": "Testi Çalıştır",
"fetchError": "Test sonuçları alınamadı",
"yourIP": "Ana test IP'niz",
"proxyScore": "Proxy Yüzdesi",
@@ -391,7 +387,6 @@
"Title": "MAC Arama",
"Note": "Bir fiziksel adresin (MAC adresi) üreticisini, tekli/çoklu yayın (unicast/multicast), global/yerel olup olmadığını vb. sorgulayın. Tam 12 haneli adresle veya sadece önekle sorgulamayı destekler. Bu aracı, oluşturduğunuz fiziksel adresin ihtiyaçlarınızı karşılayıp karşılamadığını doğrulamak için de kullanabilirsiniz.",
"Note2": "Sorgulamayı başlatmak için lütfen bir fiziksel adres girin:",
- "Run": "Sorgula",
"Placeholder": "F0:2F:4B:01:0A:AA",
"invalidMAC": "Geçersiz fiziksel adres",
"fetchError": "Sorgu sonuçları alınamadı",
@@ -420,7 +415,6 @@
"Note2": "Sorgulamayı başlatmak için lütfen bir alan adı veya IP adresi girin:",
"Note3": "Whois bilgileri çeşitli türde alanlar içerir. Aşağıda ham metin bilgisi bulunmaktadır",
"Placeholder": "Alan Adı veya IP",
- "Run": "Sorgula",
"invalidURL": "Geçersiz alan adı veya IP",
"fetchError": "Sorgu sonuçları alınamadı veya sorgu sonuçları boş"
},
@@ -429,7 +423,6 @@
"Note": "Bazı bölgelerde, politik veya ticari nedenlerle, bazı operatörler belirli alan adlarını kirletebilir, bu da doğrudan erişildiğinde yanlış sonuçlara yol açar. DNS çözümlemesi kontrollerini kullanmak, dünyanın dört bir yanındaki iyi bilinen DNS sağlayıcılarından alan adlarının çözümleme sonuçlarını incelemenize yardımcı olacaktır. Dahili DNS testleri arasında, bazı sağlayıcılar Çin'dendir ve DNS çözümleme sonuçları kirletilmiş olabilir. Lütfen ayırt edici olun.",
"Note2": "Çözümlemeyi başlatmak için lütfen bir URL veya alan adı girin:",
"Placeholder": "URL veya Alan Adı",
- "Run": "Çalıştır",
"invalidURL": "Geçersiz URL veya Alan Adı",
"fetchError": "Çözümleme sonuçları alınamadı",
"Provider": "DNS Sağlayıcısı",
@@ -439,7 +432,7 @@
"ruletest": {
"Title": "Kural Testi",
"Name": "Test",
- "Note": "Kural testi, proxy yazılımının alan adı tabanlı kurallarının doğru ayarlanıp ayarlanmadığını belirlemek için kullanılır. Testi yapmadan önce, aşağıdaki karta başvurmanız ve proxy yazılımınızda IPCheck.ing'in 8 farklı URL'si için farklı alan adı tabanlı yönlendirme kuralları ayarlamanız gerekir.",
+ "Note": "Kural testi, proxy yazılımının alan adı tabanlı kurallarının doğru ayarlanıp ayarlanmadığını belirlemek için kullanılır. Testi yapmadan önce, aşağıdaki karta başvurmanız ve proxy yazılımınızda IPCheck.ing'in 8 farklı URL'si için farklı alan adı tabanlı yönlendirme kuralları ayarlamanız gerekir. Genellikle, kuralları ayarlamak için DOMAIN, ptest-3.ipcheck.ing, POLICY gibi formatlar kullanılabilir. Bu formatlar, kullandığınız proxy yazılımına göre farklılık gösterebilir.",
"StatusWait": "Test Bekleniyor veya Test Hatası",
"StatusError": "Test Hatası",
"Country": "Proxy bölgesi",
@@ -451,10 +444,10 @@
"RefreshWebRTC": "WebRTC Testini Yenile",
"RefreshDNSLeakTest": "DNS Sızıntı Testini Yenile",
"SpeedTestButton": "Hız Testini Başlat/Duraklat",
- "ToggleMaps": "Haritaları Göster/Gizle",
"SourceSelect": "IP Coğrafi Konum Kaynağını Seç",
"ShowASNInfo": "AS Detaylarını Göster",
"CopyIP": "IP Adresini Kopyala",
+ "ViewOnMap": "Konumu haritada görüntüle",
"InfoMask": "IP Bilgilerini Gizle",
"QueryIP": "IP Adresini Sorgula",
"GithubLink": "Kaynak Kodunu GitHub'da Görüntüle",
@@ -483,6 +476,7 @@
"isProxy": "Proxy",
"qualityScore": "IP Kalitesi",
"qualityScoreUnknown": "Puan Bilinmiyor",
+ "advancedUnlockCta": "Kötüye kullanımı önlemek için, bu alanları görüntülemek için giriş yapın",
"ASNInfo": {
"trafficPercentage": "Trafik Yüzdesi : ",
"note": "Bu AS için ilgili veriler : ",
@@ -534,8 +528,8 @@
"id": "webrtc",
"Title": "WebRTC Testi",
"Note": "WebRTC genellikle doğrudan UDP üzerinden bağlantı kurar. Test gerçek IP'nizi döndürürse, bu, proxy ayarlarınızın bu bağlantıları kapsamadığı anlamına gelir. WebRTC'ye bağlanırken kullandığınız IP'yi tespit etmenin yanı sıra, NAT türünüzü de tespit ediyoruz. Ancak, NAT türü tespiti %100 doğru değildir ve yalnızca referans amaçlıdır.",
- "StatusWait": "Test Bekleniyor veya Bağlantı Hatası",
- "StatusError": "Test Hatası",
+ "StatusWait": "Test Bekleniyor",
+ "StatusError": "Bağlantı Hatası",
"NATType": {
"srflx": "Port Kısıtlı Koni veya Simetrik",
"prflx": "Port Kısıtlı Koni",
@@ -546,11 +540,10 @@
},
"dnsleaktest": {
"id": "dnsleaktest",
- "Name": "Test",
+ "Name": "DNS Uç Noktası Testi",
"Title": "DNS Sızıntı Testi",
"Note": "DNS sızıntısı, bir VPN/proxy'ye bağlıyken alan adı çözümlemelerinizin hala yerel İSS'niz aracılığıyla yapılması anlamına gelir, bu da DNS sızıntısı riski oluşturur.",
"Note2": "DNS sızıntılarını test etme yöntemi, hangi bölgesel DNS çıkışı üzerinden çözümleme yaptığınızı tespit etmek için yeni oluşturulmuş bir alan adına erişmeyi içerir. Dönen uç nokta bölgesi, yerel hizmet sağlayıcınızın bölgesiyle eşleşirse, DNS sızıntısı riski vardır. Bu durumda, VPN/proxy ayarlarınızı değiştirmeniz gerekebilir.",
- "Endpoint": "DNS Uç Noktası",
"EndpointCountry": "Uç Nokta Bölgesi",
"StatusWait": "Test Bekleniyor",
"StatusError": "Test Hatası"
@@ -595,7 +588,6 @@
"PacketLoss": "Paket Kaybı",
"ReceivedPackets": "Alınan",
"DroppedPackets": "Düşen",
- "Run": "Testi Çalıştır",
"Error": "Test başarısız oldu, görünüşe göre IP'nizin Ping testi yapmasına izin verilmiyor."
},
"mtrtest": {
@@ -606,14 +598,12 @@
"Note3": "Lütfen test için IP adresinizi seçin.",
"SelectIP": "Bir IP Adresi Seçin",
"Region": "Bölge",
- "Run": "Testi Çalıştır",
"Error": "Test başarısız oldu, görünüşe göre IP'nizin MTR testi yapmasına izin verilmiyor."
},
"ipcheck": {
"id": "ipcheck",
"Title": "IP Kontrolü",
"Placeholder": "Lütfen bir IP adresi girin",
- "Button": "Kontrol Et",
"Error": "Lütfen geçerli bir IPv4 veya IPv6 adresi girin."
},
"alert": {
@@ -648,13 +638,13 @@
"MTRTest": "MTR Testi panelini aç",
"RuleTest": "Kural Testi panelini aç",
"DNSResolver": "DNS Çözümlemesi panelini aç",
- "ToggleMaps": "Haritaları Değiştir",
"IPCheck": "IP Adresini Sorgula",
"ToggleInfoMask": "Bilgi Gizlemeyi Değiştir",
"Help": "Klavye Kısayollarını Göster",
"HelpNote": "Kısayolları kullanan insanlar gerçekten harika!",
"GoNext": "Sonraki Kart",
"GoPrevious": "Önceki Kart",
+ "OpenHighlightedTool": "Seçili Gelişmiş Aracı Aç",
"RefreshRuleTests": "Kural Testlerini Yenile",
"CensorshipCheck": "Sansür Kontrolü panelini aç",
"Preferences": "Tercihleri Aç",
@@ -683,7 +673,7 @@
"Title": "Hakkında",
"product1": "IPCheck.ing, IP bilgilerinizi kontrol etmenize, web sitesi kullanılabilirliğini test etmenize, DNS çıkış bilgilerini incelemenize, hız testleri, global gecikme testleri, MTR testleri ve daha fazlasını yapmanıza yardımcı olan ücretsiz bir IP araç kutusudur.",
"product2": "Bu açık kaynaklı bir projedir ve kaynak kodunu sayfanın altındaki GitHub simgesine tıklayarak görüntüleyebilirsiniz.",
- "product3": "Başlangıçta bu, Vue.js öğrenmem ve ChatGPT kullanarak nasıl kod yazacağımı öğrenmem için kişisel bir projeydi. Zamanla GitHub'da daha fazla yıldız kazandı, bu yüzden çok fazla yeniden düzenleme yaptım ve birçok faydalı özellik ekledim. Umarım beğenirsiniz.",
+ "product3": "Başlangıçta bu, Vue.js öğrenmem ve AI kullanarak nasıl kod yazacağımı öğrenmem için kişisel bir projeydi. Zamanla GitHub'da daha fazla yıldız kazandı, bu yüzden çok fazla yeniden düzenleme yaptım ve birçok faydalı özellik ekledim. Umarım beğenirsiniz.",
"meTitle": "Hakkımda",
"me1": "Benim adım Jason Ng, internette Achán olarak da bilinirim. Profesyonel bir programcı değilim ama kodlamayı, açık kaynağı ve paylaşmayı seviyorum.",
"me2": "Çoğu zaman bir ürün yöneticisi, blog yazarı, motosiklet sürücüsü ve bir 'geek' olarak çalışıyorum.",
@@ -704,506 +694,6 @@
"Title": "Değişiklik Günlüğü",
"add": "Eklendi",
"improve": "Geliştirildi",
- "fix": "Düzeltildi",
- "versions": [
- {
- "version": "v1.0",
- "date": "Kas 06, 2020",
- "content": [
- {
- "type": "add",
- "change": "Kullanıcının IP bilgilerini görüntüleme"
- },
- {
- "type": "add",
- "change": "Proxy öncesi ve sonrası IP bilgilerini görüntüleme"
- },
- {
- "type": "add",
- "change": "Web sitesi kullanılabilirliğini kontrol etme"
- }
- ]
- },
- {
- "version": "v2.0",
- "date": "Kas 24, 2023",
- "content": [
- {
- "type": "add",
- "change": "Tüm proje Vue2 kullanılarak yeniden yazıldı"
- },
- {
- "type": "improve",
- "change": "UI Bootstrap v5 kullanılarak yeniden düzenlendi"
- }
- ]
- },
- {
- "version": "v2.1",
- "date": "Kas 25, 2023",
- "content": [
- {
- "type": "add",
- "change": "WebRTC testi eklendi"
- },
- {
- "type": "improve",
- "change": "Program mantığı optimize edildi"
- }
- ]
- },
- {
- "version": "v2.2",
- "date": "Kas 26, 2023",
- "content": [
- {
- "type": "add",
- "change": "DNS sızıntı testi eklendi"
- },
- {
- "type": "add",
- "change": "Ön yüzde Bing haritalarını görüntüleme desteği eklendi"
- },
- {
- "type": "improve",
- "change": "Çoklu mantık optimizasyonları"
- }
- ]
- },
- {
- "version": "v2.3",
- "date": "Kas 27, 2023 ",
- "content": [
- {
- "type": "add",
- "change": "Karanlık mod eklendi"
- },
- {
- "type": "add",
- "change": "Mobil için minimalist mod eklendi"
- },
- {
- "type": "improve",
- "change": "Dosya yapısı optimize edildi"
- }
- ]
- },
- {
- "version": "v2.4",
- "date": "Ara 1, 2023",
- "content": [
- {
- "type": "add",
- "change": "İngilizce dil desteği eklendi"
- },
- {
- "type": "add",
- "change": "Bilgi gizleme özelliği eklendi"
- },
- {
- "type": "add",
- "change": "PWA desteği, mobil ve masaüstüne kurulabilir"
- }
- ]
- },
- {
- "version": "v2.5",
- "date": "Ara 20, 2023",
- "content": [
- {
- "type": "add",
- "change": "Klavye kısayolları desteği eklendi"
- },
- {
- "type": "add",
- "change": "Web sitesi hız testi özelliği eklendi"
- },
- {
- "type": "improve",
- "change": "Docker kullanarak dağıtım desteği"
- },
- {
- "type": "improve",
- "change": "Birden fazla kaynaktan IP coğrafi konum bilgisi alma desteği"
- }
- ]
- },
- {
- "version": "v3.0",
- "date": "Oca 28, 2024",
- "content": [
- {
- "type": "add",
- "change": "Tüm proje Vite + Vue3 kullanılarak yeniden yazıldı"
- },
- {
- "type": "add",
- "change": "Global gecikme testi özelliği eklendi"
- },
- {
- "type": "add",
- "change": "MTR testi özelliği eklendi"
- },
- {
- "type": "improve",
- "change": "Çoklu performans ve kullanıcı deneyimi optimizasyonları"
- }
- ]
- },
- {
- "version": "v3.1",
- "date": "Oca 30, 2024",
- "content": [
- {
- "type": "add",
- "change": "Yeni bir dil desteği eklendi: Fransızca"
- },
- {
- "type": "add",
- "change": "Yükleme animasyonu eklendi"
- },
- {
- "type": "improve",
- "change": "Önbellekleme stratejisi optimize edildi"
- },
- {
- "type": "improve",
- "change": "Karanlık mod stilleri ayarlandı"
- },
- {
- "type": "fix",
- "change": "Bazı küçük sorunlar düzeltildi"
- }
- ]
- },
- {
- "version": "v3.2",
- "date": "Şub 3, 2024",
- "content": [
- {
- "type": "add",
- "change": "NAT türü tespiti eklendi"
- },
- {
- "type": "improve",
- "change": "PWA uygulama deneyimi optimize edildi"
- },
- {
- "type": "improve",
- "change": "Arka uç komut dosyası güvenliği artırıldı"
- }
- ]
- },
- {
- "version": "v3.3",
- "date": "Şub 6, 2024",
- "content": [
- {
- "type": "add",
- "change": "Farklı IP coğrafi konum kaynaklarını kullanma desteği eklendi"
- },
- {
- "type": "improve",
- "change": "Bağlantı kullanılabilirlik tespiti için kullanıcı deneyimi iyileştirildi"
- },
- {
- "type": "improve",
- "change": "UI deneyimi optimize edildi"
- }
- ]
- },
- {
- "version": "v3.4",
- "date": "Şub 17, 2024",
- "content": [
- {
- "type": "add",
- "change": "ASN detayları görüntüleyici eklendi"
- },
- {
- "type": "add",
- "change": "Proxy tespiti özelliği eklendi"
- },
- {
- "type": "improve",
- "change": "IP bilgilerini görüntüleme arayüzü optimize edildi"
- }
- ]
- },
- {
- "version": "v3.5",
- "date": "Mar 3, 2024",
- "content": [
- {
- "type": "add",
- "change": "Kural testi özelliği eklendi"
- },
- {
- "type": "improve",
- "change": "Bazı İyileştirmeler"
- }
- ]
- },
- {
- "version": "v3.6",
- "date": "Mar 10, 2024",
- "content": [
- {
- "type": "add",
- "change": "DNS çözümlemesi özelliği eklendi"
- },
- {
- "type": "improve",
- "change": "Ana sayfa yapısı optimize edildi, gelişmiş özellikler artık daraltılabilir"
- },
- {
- "type": "improve",
- "change": "Program mantığı optimize edildi"
- }
- ]
- },
- {
- "version": "v3.7",
- "date": "Nis 26, 2024",
- "content": [
- {
- "type": "add",
- "change": "Sansür testi özelliği eklendi"
- },
- {
- "type": "add",
- "change": "Ağ hız testi artık özel paket boyutuna izin veriyor"
- },
- {
- "type": "improve",
- "change": "Bazı fonksiyonel mantıklar optimize edildi"
- }
- ]
- },
- {
- "version": "v3.8",
- "date": "May 4, 2024",
- "content": [
- {
- "type": "add",
- "change": "Ayarları yerel olarak kaydetmek için tercihler paneli eklendi"
- },
- {
- "type": "add",
- "change": "İkinci program açılışında birden fazla varsayılan davranışı özelleştirmeye izin ver"
- },
- {
- "type": "improve",
- "change": "Program mantığı önemli ölçüde optimize edildi"
- },
- {
- "type": "fix",
- "change": "Bazı küçük sorunlar düzeltildi"
- }
- ]
- },
- {
- "version": "v3.9",
- "date": "May 8, 2024",
- "content": [
- {
- "type": "add",
- "change": "Whois arama özelliği eklendi"
- },
- {
- "type": "improve",
- "change": "Gelişmiş araçlar için görüntüleme ve animasyon efektleri optimize edildi"
- },
- {
- "type": "fix",
- "change": "Bazı küçük sorunlar düzeltildi"
- }
- ]
- },
- {
- "version": "v4.0",
- "date": "May 13, 2024",
- "content": [
- {
- "type": "add",
- "change": "Tüm proje Vue 3'ün Composition API'si kullanılarak yeniden yazıldı"
- },
- {
- "type": "add",
- "change": "Bakım kolaylığını artırmak için ön yüz birden fazla modüle bölündü"
- },
- {
- "type": "add",
- "change": "Görünmezlik Testi özelliği eklendi (Beta)"
- },
- {
- "type": "improve",
- "change": "Arka uç program bağımlılıkları optimize edildi"
- },
- {
- "type": "improve",
- "change": "Çok sayıda detay optimize edildi"
- }
- ]
- },
- {
- "version": "v4.1",
- "date": "Tem 11, 2024",
- "content": [
- {
- "type": "add",
- "change": "MAC adresi arama özelliği eklendi"
- },
- {
- "type": "improve",
- "change": "Çok sayıda detay optimize edildi"
- }
- ]
- },
- {
- "version": "v4.2",
- "date": "Eyl 25, 2024",
- "content": [
- {
- "type": "add",
- "change": "Tarayıcı bilgisi sorgulama özelliği eklendi"
- },
- {
- "type": "add",
- "change": "MaxMind GeoIP veritabanı eklendi"
- },
- {
- "type": "improve",
- "change": "Çoklu deneyim geliştirmeleri"
- }
- ]
- },
- {
- "version": "v4.3",
- "date": "Eki 30, 2024",
- "content": [
- {
- "type": "add",
- "change": "Komut satırı API özelliği eklendi"
- },
- {
- "type": "improve",
- "change": "WebRTC testi artık bölgesel bilgileri görüntüleyebiliyor"
- },
- {
- "type": "improve",
- "change": "DNS sızıntı testi artık bölgesel bilgileri görüntüleyebiliyor"
- }
- ]
- },
- {
- "version": "v4.4",
- "date": "Ara 7, 2024",
- "content": [
- {
- "type": "add",
- "change": "Dil tercihleri"
- },
- {
- "type": "improve",
- "change": "Harita sağlayıcısı Google olarak değiştirildi"
- },
- {
- "type": "improve",
- "change": "Diğer genel optimizasyonlar"
- }
- ]
- },
- {
- "version": "v4.5",
- "date": "Ara 25, 2024",
- "content": [
- {
- "type": "add",
- "change": "Güvenlik Kontrol Listesi Eklendi"
- },
- {
- "type": "improve",
- "change": "Diğer genel optimizasyonlar"
- }
- ]
- },
- {
- "version": "v5.0",
- "date": "Oca 31, 2025",
- "content": [
- {
- "type": "add",
- "change": "Kullanıcı sistemi eklendi"
- },
- {
- "type": "add",
- "change": "Kullanıcı başarı sistemi eklendi"
- },
- {
- "type": "add",
- "change": "Lite sürümü eklendi"
- },
- {
- "type": "add",
- "change": "Hız testi artık veri değişim grafiklerini görüntüleyebiliyor"
- },
- {
- "type": "improve",
- "change": "Kod verimliliği optimizasyonu"
- }
- ]
- },
- {
- "version": "v5.1",
- "date": "Nov 12, 2025",
- "content": [
- {
- "type": "add",
- "change": "Türkçe dil desteği eklendi"
- },
- {
- "type": "improve",
- "change": "Kod verimliliği optimize edildi"
- }
- ]
- },
- {
- "version": "v5.2",
- "date": "Jan 05, 2026",
- "content": [
- {
- "type": "add",
- "change": "ASN bilgilerinin zenginliği artırıldı"
- },
- {
- "type": "add",
- "change": "IP kalite puanı görüntüleme"
- },
- {
- "type": "improve",
- "change": "Kod verimliliği optimize edildi"
- }
- ]
- },
- {
- "version": "v5.3",
- "date": "Apr 14, 2026",
- "content": [
- {
- "type": "add",
- "change": "MaxMind GeoIP veritabanı otomatik güncelleme"
- },
- {
- "type": "improve",
- "change": "Önbellek stratejisi optimize edildi"
- },
- {
- "type": "improve",
- "change": "Kod verimliliği optimize edildi, yapı hızı büyük ölçüde artırıldı"
- }
- ]
- }
- ]
+ "fix": "Düzeltildi"
}
-}
\ No newline at end of file
+}
diff --git a/frontend/locales/zh.json b/frontend/locales/zh.json
index 9a6619cd4..0b4159ccd 100644
--- a/frontend/locales/zh.json
+++ b/frontend/locales/zh.json
@@ -159,8 +159,6 @@
"appSettings": "程序设置",
"autoRun": "自动运行",
"autoRunTips": "关闭后,打开应用将只会进行本机 IP 检测,不会自动运行其它的测试。",
- "showMap": "显示地图",
- "showMapTips": "在 IP 信息卡片上显示地图。",
"simpleMode": "简洁模式",
"simpleModeTips": "减少 IP 卡片显示的内容。仅在手机上生效。",
"connectivityAutoRefresh": "多次刷新可用性检测",
@@ -260,7 +258,6 @@
"Title": "隐身测试",
"Note": "当你挂上代理或 VPN 之后,你访问的网站真的不知道你挂着代理吗?你真的隐身了么?我们会通过多种手段,尝试计算出你伪装后的漏洞,找到你正在使用代理的证据。尽管可能部分测试结果不完全准确,但本测试依然有较高的参考意义。",
"Note2": "点击运行后,系统将会运行一个脚本,通常在 10s 内将会完成所有的测试,在这个过程中,你的 IP 信息、浏览器信息等将会被收集并在后台进行分析。",
- "Run": "运行测试",
"fetchError": "无法获取测试结果",
"yourIP": "你的主测 IP 是",
"proxyScore": "代理概率",
@@ -360,7 +357,6 @@
"Note": "检查目标网站在全球互联网审查较为严重的 4 个地区的可用性,包括:中国大陆、沙特阿拉伯、俄罗斯、土耳其。检查时会同时从互联网相对自由的地区进行相同的测试,以作为对照组进行校验。在一些地区,互联网审查有较为明确的法律条文,有些则相对含糊。",
"Note2": "请输入 URL 或域名,开始封锁测试:",
"Note3": "只有当同一个国家的所有服务器都无法访问时,才会判断为被封锁",
- "Run": "运行测试",
"Placeholder": "URL 或域名",
"Country": "地区",
"Status": "状态",
@@ -393,7 +389,6 @@
"Title": "MAC 地址查询",
"Note": "查询一个物理地址(MAC 地址)所属的制造商、是否单播/多播、是否广域/区域等信息。支持使用完整的 12 位进行查询,也支持前缀查询。当然,你也可以用本查询工具来验证你生成的物理地址是否符合自己的需求。",
"Note2": "请输入一个物理地址,开始查询:",
- "Run": "查询",
"Placeholder": "F0:2F:4B:01:0A:AA",
"invalidMAC": "无效的物理地址",
"fetchError": "无法获取查询结果",
@@ -422,7 +417,6 @@
"Note2": "请输入域名或 IP,开始进行查询:",
"Note3": "Whois 信息包含多种类型的字段,以下为原始文本信息",
"Placeholder": "域名或 IP",
- "Run": "查询",
"invalidURL": "无效的域名或 IP",
"fetchError": "无法获取查询结果或查询结果为空",
"Provider": "信息服务商"
@@ -432,7 +426,6 @@
"Note": "在一些地区,某些运营商可能会因为政治原因或者商业原因,对一些域名进行污染,以至于直接进行访问的时候,无法返回正确的结果。使用 DNS 解析检查,将帮助你从全球各个知名的 DNS 厂商里检查域名的解析结果。在检测内置的 DNS 中,有一部分服务商来自中国,其 DNS 解析的结果可能会受到污染。请注意鉴别。",
"Note2": "请输入 URL 或域名,开始进行解析:",
"Placeholder": "URL 或域名",
- "Run": "解析",
"invalidURL": "无效的 URL 或域名",
"fetchError": "无法获取解析结果",
"Provider": "DNS 服务商",
@@ -442,7 +435,7 @@
"ruletest": {
"Title": "分流测试",
"Name": "检测",
- "Note": "分流测试用于判断代理软件基于域名的规则设置是否正确。在进行测试之前,你需要先参考下方的卡片,在你的代理软件里对 IPCheck.ing 的 8 个不同的 URL 设置不同的域名分流规则。",
+ "Note": "分流测试用于判断代理软件基于域名的规则设置是否正确。在进行测试之前,你需要先参考下方的卡片,在你的代理软件里对 IPCheck.ing 的 8 个不同的 URL 设置不同的域名分流规则。通常,设置规则可能会使用类似于:DOMAIN, ptest-3.ipcheck.ing, POLICY 这样的写法,具体写法不同的代理软件可能会有所不同。",
"StatusWait": "待检测",
"StatusError": "检测出错",
"Country": "代理地区",
@@ -454,10 +447,10 @@
"RefreshWebRTC": "刷新 WebRTC 测试",
"RefreshDNSLeakTest": "刷新 DNS 泄漏测试",
"SpeedTestButton": "开始/暂停网速测试",
- "ToggleMaps": "打开/关闭地图显示",
"SourceSelect": "选择 IP 归属地数据来源",
"ShowASNInfo": "显示 AS 详细信息",
"CopyIP": "复制 IP 地址",
+ "ViewOnMap": "在地图上查看位置",
"InfoMask": "隐藏信息",
"QueryIP": "查询 IP 信息",
"GithubLink": "查看源代码",
@@ -486,6 +479,7 @@
"isProxy": "代理",
"qualityScore": "IP 质量分",
"qualityScoreUnknown": "未知分数",
+ "advancedUnlockCta": "为避免滥用,登录后可查看以下信息",
"ASNInfo": {
"trafficPercentage": "流量比例:",
"note": "此 AS 的相关数据:",
@@ -537,8 +531,8 @@
"id": "webrtc",
"Title": "WebRTC 测试",
"Note": "WebRTC 往往通过 UDP 直连进行建立,如果测试返回了真实 IP,则意味着你的代理设置没有覆盖这些连接。除了检测你连接 WebRTC 时所使用的 IP,我们还会检测你的 NAT 类型。然而,NAT 类型的检测并不是 100% 准确的,仅供参考。",
- "StatusWait": "待检测或连接错误",
- "StatusError": "测试出错",
+ "StatusWait": "待检测",
+ "StatusError": "连接错误",
"NATType": {
"srflx": "端口限制型或对称型",
"prflx": "端口限制型",
@@ -549,11 +543,10 @@
},
"dnsleaktest": {
"id": "dnsleaktest",
- "Name": "检测",
+ "Name": "DNS 出口检测",
"Title": "DNS 泄漏测试",
"Note": "DNS 泄露(DNS Leaks)的意思是,当你挂上 VPN/代理后,你解析域名时,依然通过当地的运营商进行解析,这时就有 DNS 泄露的风险。",
"Note2": "泄露测试的方法是通过访问新生成的域名,检测你是通过哪个地区的 DNS 出口进行解析,如果返回的出口区域和你当地的运营商区域相同,则有 DNS 泄露风险,你可能需要修改 VPN/代理设置。",
- "Endpoint": "DNS 出口",
"EndpointCountry": "出口地区",
"StatusWait": "待检测",
"StatusError": "测试出错"
@@ -598,7 +591,6 @@
"PacketLoss": "丢包率",
"ReceivedPackets": "收到",
"DroppedPackets": "丢失",
- "Run": "运行测试",
"Error": "测试失败,看起来你的 IP 不允许进行 Ping 测试。"
},
"mtrtest": {
@@ -609,14 +601,12 @@
"Note3": "请选取你的 IP 地址进行测试:",
"SelectIP": "选择一个 IP 地址",
"Region": "地区",
- "Run": "运行测试",
"Error": "测试失败,看起来你的 IP 不允许进行 MTR 测试。"
},
"ipcheck": {
"id": "ipcheck",
"Title": "IP 查询",
"Placeholder": "请输入 IP 地址",
- "Button": "查询",
"Error": "请输入有效的 IPv4 或 IPv6 地址。"
},
"alert": {
@@ -651,13 +641,13 @@
"MTRTest": "打开全球路由测试面板",
"RuleTest": "打开规则测试面板",
"DNSResolver": "打开 DNS 解析器面板",
- "ToggleMaps": "切换地图显示",
"IPCheck": "IP 查询",
"ToggleInfoMask": "切换信息隐藏",
"Help": "显示快捷键",
"HelpNote": "使用快捷键的人,是喜欢效率的人,你真棒!",
"GoNext": "下一张卡片",
"GoPrevious": "上一张卡片",
+ "OpenHighlightedTool": "打开选中的高级工具",
"RefreshRuleTests": "刷新规则测试",
"CensorshipCheck": "打开封锁测试面板",
"Preferences": "打开偏好设置面板",
@@ -686,13 +676,13 @@
"Title": "关于",
"product1": "IPCheck.ing 是一个免费的 IP 工具箱,可以帮助你查看自己的 IP 信息,检测网站的可用性,查看 DNS 出口信息,进行网速测试,全球延迟测试,MTR 测试等。",
"product2": "这是一个开源项目,你可以点击页面底部的 GitHub 图标查看源代码。",
- "product3": "最早的时候,这是我的一个用来学习 Vue.js 和学习如何使用 ChatGPT 写代码的练手项目,后来在 GitHub 上获得的星星数量越来越多,于是我进行了大量的重构和添加了许多非常有用的功能,希望你会喜欢。",
+ "product3": "最早的时候,这是我的一个用来学习 Vue.js 和学习如何使用 AI 写代码的练手项目,后来在 GitHub 上获得的星星数量越来越多,于是我进行了大量的重构和添加了许多非常有用的功能,希望你会喜欢。",
"meTitle": "关于我",
"me1": "我的名字叫阿禅,通常在网上使用 Jason Ng 作为英文名,我并不是一个专业的程序员,但是我喜欢编程,我喜欢开源,我喜欢分享。",
"me2": "在大多数时候,我是一名产品经理、一名博客作者、一个摩托车骑士以及一名极客。",
"me3": "你可以在下面的链接里找到我更详细的介绍:",
"contactTitle": "联系我",
- "contact": "如果你有任何问题或建议,请通过邮箱联系我: jason[AT]kenengba.com 。",
+ "contact": "如果你有任何问题或建议,请通过邮箱联系我: jason[AT]kenengba.com",
"personal": "个人网站",
"blog": "可能吧博客",
"retiremoney": "躺平计算器",
@@ -707,506 +697,6 @@
"Title": "更新日志",
"add": "新增",
"improve": "优化",
- "fix": "修复",
- "versions": [
- {
- "version": "v1.0",
- "date": "Nov 06, 2020",
- "content": [
- {
- "type": "add",
- "change": "显示用户的 IP 信息"
- },
- {
- "type": "add",
- "change": "显示代理前后的 IP 信息"
- },
- {
- "type": "add",
- "change": "检查网站可用性"
- }
- ]
- },
- {
- "version": "v2.0",
- "date": "Nov 24, 2023",
- "content": [
- {
- "type": "add",
- "change": "使用 Vue2 重构了整个项目"
- },
- {
- "type": "improve",
- "change": "使用 Bootstrap v5 重构了 UI"
- }
- ]
- },
- {
- "version": "v2.1",
- "date": "Nov 25, 2023",
- "content": [
- {
- "type": "add",
- "change": "添加了 WebRTC 测试"
- },
- {
- "type": "improve",
- "change": "优化了程序的一些逻辑"
- }
- ]
- },
- {
- "version": "v2.2",
- "date": "Nov 26, 2023",
- "content": [
- {
- "type": "add",
- "change": "添加了 DNS 泄漏测试"
- },
- {
- "type": "add",
- "change": "支持在前端显示 Bing 地图"
- },
- {
- "type": "improve",
- "change": "多个逻辑优化"
- }
- ]
- },
- {
- "version": "v2.3",
- "date": "Nov 27, 2023 ",
- "content": [
- {
- "type": "add",
- "change": "添加了黑暗模式"
- },
- {
- "type": "add",
- "change": "增加移动版简约模式"
- },
- {
- "type": "improve",
- "change": "优化了文件结构"
- }
- ]
- },
- {
- "version": "v2.4",
- "date": "Dec 1, 2023",
- "content": [
- {
- "type": "add",
- "change": "支持英文语言"
- },
- {
- "type": "add",
- "change": "添加信息遮罩功能"
- },
- {
- "type": "add",
- "change": "支持 PWA,可以安装到手机和桌面上"
- }
- ]
- },
- {
- "version": "v2.5",
- "date": "Dec 20, 2023",
- "content": [
- {
- "type": "add",
- "change": "支持快捷键操作"
- },
- {
- "type": "add",
- "change": "添加网速测试功能"
- },
- {
- "type": "improve",
- "change": "支持使用 Docker 部署"
- },
- {
- "type": "improve",
- "change": "支持从多个来源获取 IP 归属地等信息"
- }
- ]
- },
- {
- "version": "v3.0",
- "date": "Jan 28, 2024",
- "content": [
- {
- "type": "add",
- "change": "使用 Vite + Vue3 重构了整个项目"
- },
- {
- "type": "add",
- "change": "增加全球延迟测试功能"
- },
- {
- "type": "add",
- "change": "增加 MTR 测试功能"
- },
- {
- "type": "improve",
- "change": "多个性能优化和体验优化"
- }
- ]
- },
- {
- "version": "v3.1",
- "date": "Jan 30, 2024",
- "content": [
- {
- "type": "add",
- "change": "支持新的语言:法语"
- },
- {
- "type": "add",
- "change": "添加数据加载中的动画"
- },
- {
- "type": "improve",
- "change": "优化了缓存策略"
- },
- {
- "type": "improve",
- "change": "调整黑暗模式样式"
- },
- {
- "type": "fix",
- "change": "修复了一些小问题"
- }
- ]
- },
- {
- "version": "v3.2",
- "date": "Feb 3, 2024",
- "content": [
- {
- "type": "add",
- "change": "添加 NAT 类型检测"
- },
- {
- "type": "improve",
- "change": "优化 PWA 应用的体验"
- },
- {
- "type": "improve",
- "change": "提高后端脚本安全性"
- }
- ]
- },
- {
- "version": "v3.3",
- "date": "Feb 6, 2024",
- "content": [
- {
- "type": "add",
- "change": "支持使用不同的 IP 地理位置信息源"
- },
- {
- "type": "improve",
- "change": "优化连接可用性检测的用户体验"
- },
- {
- "type": "improve",
- "change": "优化 UI 体验"
- }
- ]
- },
- {
- "version": "v3.4",
- "date": "Feb 17, 2024",
- "content": [
- {
- "type": "add",
- "change": "添加 ASN 详细信息查看器"
- },
- {
- "type": "add",
- "change": "添加 IP 地址是否为代理的判断"
- },
- {
- "type": "improve",
- "change": "优化 IP 信息的展示 UI"
- }
- ]
- },
- {
- "version": "v3.5",
- "date": "Mar 3, 2024",
- "content": [
- {
- "type": "add",
- "change": "添加规则测试"
- },
- {
- "type": "improve",
- "change": "优化了部分逻辑"
- }
- ]
- },
- {
- "version": "v3.6",
- "date": "Mar 10, 2024",
- "content": [
- {
- "type": "add",
- "change": "添加 DNS 解析功能"
- },
- {
- "type": "improve",
- "change": "优化主页结构,高级功能折叠展示"
- },
- {
- "type": "improve",
- "change": "优化了程序逻辑"
- }
- ]
- },
- {
- "version": "v3.7",
- "date": "Apr 26, 2024",
- "content": [
- {
- "type": "add",
- "change": "添加封锁测试功能"
- },
- {
- "type": "add",
- "change": "网速测试可以自定义数据包大小"
- },
- {
- "type": "improve",
- "change": "优化了部分功能逻辑"
- }
- ]
- },
- {
- "version": "v3.8",
- "date": "May 4, 2024",
- "content": [
- {
- "type": "add",
- "change": "增加设置面板,可以在本地保存偏好设置"
- },
- {
- "type": "add",
- "change": "可以自定义程序在第二次启动时的多个默认行为"
- },
- {
- "type": "improve",
- "change": "大量优化了程序的逻辑"
- },
- {
- "type": "fix",
- "change": "修复了一些小问题"
- }
- ]
- },
- {
- "version": "v3.9",
- "date": "May 8, 2024",
- "content": [
- {
- "type": "add",
- "change": "增加 Whois 查询功能"
- },
- {
- "type": "improve",
- "change": "优化高级功能的展示与动画效果"
- },
- {
- "type": "fix",
- "change": "修复了一些小问题"
- }
- ]
- },
- {
- "version": "v4.0",
- "date": "May 13, 2024",
- "content": [
- {
- "type": "add",
- "change": "采用 Vue 3 的 Composition API 重构了整个项目"
- },
- {
- "type": "add",
- "change": "拆分前端多个模块,提高了程序的可维护性"
- },
- {
- "type": "add",
- "change": "增加隐身测试功能(Beta)"
- },
- {
- "type": "improve",
- "change": "优化后端程序的依赖结构"
- },
- {
- "type": "improve",
- "change": "优化了大量细节"
- }
- ]
- },
- {
- "version": "v4.1",
- "date": "July 11, 2024",
- "content": [
- {
- "type": "add",
- "change": "添加 MAC 地址查询功能"
- },
- {
- "type": "improve",
- "change": "优化了部分程序细节"
- }
- ]
- },
- {
- "version": "v4.2",
- "date": "Sept 25, 2024",
- "content": [
- {
- "type": "add",
- "change": "添加浏览器信息查询功能"
- },
- {
- "type": "add",
- "change": "添加 MaxMind 地理数据库"
- },
- {
- "type": "improve",
- "change": "多处体验优化"
- }
- ]
- },
- {
- "version": "v4.3",
- "date": "Oct 30, 2024",
- "content": [
- {
- "type": "add",
- "change": "添加命令行 API 功能"
- },
- {
- "type": "improve",
- "change": "WebRTC 测试可以展示地区信息"
- },
- {
- "type": "improve",
- "change": "DNS 泄露测试可以展示地区信息"
- }
- ]
- },
- {
- "version": "v4.4",
- "date": "Dec 7, 2024",
- "content": [
- {
- "type": "add",
- "change": "语言偏好设置"
- },
- {
- "type": "improve",
- "change": "地图展示供应商变更为 Google"
- },
- {
- "type": "improve",
- "change": "其它常规优化"
- }
- ]
- },
- {
- "version": "v4.5",
- "date": "Dec 25, 2024",
- "content": [
- {
- "type": "add",
- "change": "添加安全检查清单"
- },
- {
- "type": "improve",
- "change": "其它常规优化"
- }
- ]
- },
- {
- "version": "v5.0",
- "date": "Jan 31, 2025",
- "content": [
- {
- "type": "add",
- "change": "新增用户系统"
- },
- {
- "type": "add",
- "change": "新增用户成就系统"
- },
- {
- "type": "add",
- "change": "新增 Lite 版本"
- },
- {
- "type": "add",
- "change": "网速测试可以看到数据变化图表"
- },
- {
- "type": "improve",
- "change": "代码效率优化"
- }
- ]
- },
- {
- "version": "v5.1",
- "date": "Nov 12, 2025",
- "content": [
- {
- "type": "add",
- "change": "支持土耳其语"
- },
- {
- "type": "improve",
- "change": "代码效率优化"
- }
- ]
- },
- {
- "version": "v5.2",
- "date": "Jan 05, 2026",
- "content": [
- {
- "type": "add",
- "change": "提升 ASN 信息的丰富性"
- },
- {
- "type": "add",
- "change": "IP 质量分数显示"
- },
- {
- "type": "improve",
- "change": "代码效率优化"
- }
- ]
- },
- {
- "version": "v5.3",
- "date": "Apr 14, 2026",
- "content": [
- {
- "type": "add",
- "change": "MaxMind 地理数据库自动更新"
- },
- {
- "type": "improve",
- "change": "优化缓存策略"
- },
- {
- "type": "improve",
- "change": "大大提升构建速度"
- }
- ]
- }
- ]
+ "fix": "修复"
}
-}
\ No newline at end of file
+}
diff --git a/frontend/main.js b/frontend/main.js
index 9a2be4100..e185015cc 100644
--- a/frontend/main.js
+++ b/frontend/main.js
@@ -4,14 +4,17 @@ import { useMainStore } from './store';
import App from './App.vue'
import i18n from './locales/i18n';
import router from './router';
-import 'bootstrap';
import { analytics } from './utils/use-analytics';
import { registerServiceWorker } from './utils/register-service-worker';
-import { Tooltip } from 'bootstrap';
import { detectOS } from './utils/system-detect';
import './style/style.css'
+// Dynamic import of circle-flags collection
+import('@iconify-json/circle-flags/icons.json').then(({ default: flags }) => {
+ import('@iconify/vue').then(({ addCollection }) => addCollection(flags));
+});
+
const app = createApp(App);
const pinia = createPinia();
@@ -22,77 +25,39 @@ app.use(i18n);
app.use(router);
//
-// 初始化一系列操作
+// Initialize a series of operations
//
-// 在应用启动时设置语言
+// Set language when app starts
store.lang = i18n.global.locale;
-// 检测操作系统
+// Detect operating system
const os = detectOS();
-// 窗口大小变化处理
+// Handle window size change
function handleResize() {
store.setIsMobile(window.innerWidth < 768 || os.isAndroid || os.isIOS );
}
handleResize();
-// 监听窗口大小变化
+// Listen to window size change
window.addEventListener('resize', handleResize);
-// 启动 Google Analytics
+// Start Google Analytics
analytics.page();
-app.config.globalProperties.$analytics = analytics;
registerServiceWorker();
-// 注册全局事件跟踪函数,改造完程序后移除
-app.config.globalProperties.$trackEvent = function (category, action, label) {
- analytics.track(action, {
- category: category,
- label: label,
- });
-};
-
-// 注册全局 Tooltip 指令
-app.directive('tooltip', {
- mounted(el, binding) {
- const isMobile = store.isMobile
- if (isMobile) {
- return
- }
- let options = {
- placement: 'left',
- trigger: 'hover focus',
- }
- // 如果 binding.value 是一个字符串,将其设置为 title
- // 否则,如果是一个对象,将其与默认配置合并
- if (typeof binding.value === 'string') {
- options.title = binding.value
- } else if (typeof binding.value === 'object') {
- options = { ...options, ...binding.value } // 合并对象
- }
-
- new Tooltip(el, options)
- },
- beforeUnmount(el) {
- const tooltipInstance = Tooltip.getInstance(el)
- if (tooltipInstance) {
- tooltipInstance.dispose()
- }
- }
-})
-
-// 检查 Firebase 环境
+// Check Firebase environment
store.checkFirebaseEnv();
-// 获取后端配置和用户偏好
+// Fetch backend configs and user preferences
Promise.all([
store.isFireBaseSet ? store.initializeAuthListener() : Promise.resolve(),
- store.loadPreferences(), // 加载用户偏好设置
- store.fetchConfigs() // 获取后端配置
+ store.loadPreferences(), // Load user preferences
+ store.fetchConfigs() // Fetch backend configs
]).then(() => {
app.mount('#app');
}).catch(error => {
console.error("Failed to initialize the app properly:", error);
- app.mount('#app'); // 即使初始化中存在错误,也继续挂载应用
+ app.mount('#app'); // Even if there is an error during initialization, continue to mount the application
});
diff --git a/frontend/router/index.js b/frontend/router/index.js
index 1e0cc9df0..911bdea6f 100644
--- a/frontend/router/index.js
+++ b/frontend/router/index.js
@@ -1,8 +1,7 @@
import { createRouter, createWebHashHistory } from 'vue-router';
-import { Offcanvas } from 'bootstrap';
import { useMainStore } from '@/store';
-// 路由组件的懒加载
+// Lazy loading of route components
const MTRTest = () => import('../components/advanced-tools/MtrTest.vue');
const PingTest = () => import('../components/advanced-tools/GlobalLatencyTest.vue');
const RuleTest = () => import('../components/advanced-tools/RuleTest.vue');
@@ -42,26 +41,23 @@ const setOpenedCard = (currentPath) => {
}
};
-// 检查是否为需要触发 offcanvas 的路由
-router.afterEach((to, from) => {
- // 如果 to.path 不匹配 routes,隐藏可能存在的 offcanvas
+router.afterEach((to) => {
+ const store = useMainStore();
+
+
if (!routes.find(route => route.path === to.path)) {
- const offcanvasElement = document.getElementById('offcanvasTools');
- if (offcanvasElement) {
- const bsOffcanvas = Offcanvas.getInstance(offcanvasElement);
- bsOffcanvas.hide();
+ if (store.openSheet === 'tools') {
+ store.setOpenSheet(null);
}
return;
}
- const store = useMainStore();
store.setCurrentPath(to.path, setOpenedCard(to.path));
+
if (to.path !== '/') {
- const offcanvasElement = document.getElementById('offcanvasTools');
- if (offcanvasElement) {
- const bsOffcanvas = new Offcanvas(offcanvasElement);
- bsOffcanvas.show();
- }
+ store.setOpenSheet('tools');
+ } else if (store.openSheet === 'tools') {
+ store.setOpenSheet(null);
}
});
diff --git a/frontend/store.js b/frontend/store.js
index 0b7afbc4c..01f2b61c9 100644
--- a/frontend/store.js
+++ b/frontend/store.js
@@ -2,7 +2,11 @@
import { defineStore } from 'pinia';
import { getAuth, GoogleAuthProvider, GithubAuthProvider, signInWithPopup, signOut as firebaseSignOut, onAuthStateChanged } from "firebase/auth";
import { auth } from './firebase-init.js';
-import i18n from './locales/i18n';
+import i18n from './locales/i18n.js';
+import { createInitialAchievementsState } from './data/achievements.js';
+import { createInitialIpDBs, buildDbUrl } from './data/ip-databases.js';
+import { createDefaultPreferences } from './data/default-preferences.js';
+import { createMountingStatus, createLoadingStatus, DEFAULT_SECTION } from './data/sections.js';
const { t } = i18n.global;
export const useMainStore = defineStore('main', {
@@ -16,52 +20,20 @@ export const useMainStore = defineStore('main', {
triggerRemoteUserInfo: false,
triggerUpdateAchievements: false,
achievementToUpdate: '',
- userAchievements: {
- 'IAmHuman': { name: 'IAmHuman', achieved: false, img: 'achievements/iamhuman.webp', showDetails: false, achievedTime: null },
- 'BarelyEnough': { name: 'BarelyEnough', achieved: false, img: '/achievements/barelyenough.webp', showDetails: false, achievedTime: null },
- 'RapidPace': { name: 'RapidPace', achieved: false, img: '/achievements/rapidpace.webp', showDetails: false, achievedTime: null },
- 'TorrentFlow': { name: 'TorrentFlow', achieved: false, img: '/achievements/torrentflow.webp', showDetails: false, achievedTime: null },
- 'SteadyGoing': { name: 'SteadyGoing', achieved: false, img: '/achievements/steadygoing.webp', showDetails: false, achievedTime: null },
- 'TooFastTooSimple': { name: 'TooFastTooSimple', achieved: false, img: '/achievements/toofasttoosimple.webp', showDetails: false, achievedTime: null },
- 'SwiftAscent': { name: 'SwiftAscent', achieved: false, img: '/achievements/swiftascent.webp', showDetails: false, achievedTime: null },
- 'SurfaceCheck': { name: 'SurfaceCheck', achieved: false, img: '/achievements/surfacecheck.webp', showDetails: false, achievedTime: null },
- 'HalfwayThere': { name: 'HalfwayThere', achieved: false, img: '/achievements/halfwaythere.webp', showDetails: false, achievedTime: null },
- 'FullySecured': { name: 'FullySecured', achieved: false, img: '/achievements/fullysecured.webp', showDetails: false, achievedTime: null },
- 'JustInCase': { name: 'JustInCase', achieved: false, img: '/achievements/justincase.webp', showDetails: false, achievedTime: null },
- 'HiddenWell': { name: 'HiddenWell', achieved: false, img: '/achievements/hiddenwell.webp', showDetails: false, achievedTime: null },
- 'SlipUp': { name: 'SlipUp', achieved: false, img: '/achievements/slipup.webp', showDetails: false, achievedTime: null },
- 'CleverTrickery': { name: 'CleverTrickery', achieved: false, img: '/achievements/clevertrickery.webp', showDetails: false, achievedTime: null },
- 'EnergySaver': { name: 'EnergySaver', achieved: false, img: '/achievements/energysaver.webp', showDetails: false, achievedTime: null },
- 'ResourceHog': { name: 'ResourceHog', achieved: false, img: '/achievements/resourcehog.webp', showDetails: false, achievedTime: null },
- 'MakingBigNews': { name: 'MakingBigNews', achieved: false, img: '/achievements/makingbignews.webp', showDetails: false, achievedTime: null },
- 'GenerousDonor': { name: 'GenerousDonor', achieved: false, img: '/achievements/generousdonor.webp', showDetails: false, achievedTime: null },
- 'ItIsOpen': { name: 'ItIsOpen', achieved: false, img: '/achievements/itisopen.webp', showDetails: false, achievedTime: null },
- 'CuriousCat': { name: 'CuriousCat', achieved: false, img: '/achievements/curiouscat.webp', showDetails: false, achievedTime: null },
- 'CrossingTheWall': { name: 'CrossingTheWall', achieved: false, img: '/achievements/crossingthewall.webp', showDetails: false, achievedTime: null },
- },
+ // achievements defined in data/achievements.js; state is created by factory to avoid shared references between instances
+ userAchievements: createInitialAchievementsState(),
remoteUserInfo: {},
remoteUserInfoFetched: false,
currentPath: {},
- mountingStatus: {
- ipcheck: false,
- connectivity: false,
- webrtc: false,
- dnsleaktest: false,
- speedtest: false,
- advancedtools: false,
- },
+ mountingStatus: createMountingStatus(),
curl: {
- ipv4Domain: import.meta.env.VITE_CURL_IPV4_DOMAIN,
- ipv6Domain: import.meta.env.VITE_CURL_IPV6_DOMAIN,
- ipv64Domain: import.meta.env.VITE_CURL_IPV64_DOMAIN,
+ ipv4Domain: import.meta.env?.VITE_CURL_IPV4_DOMAIN,
+ ipv6Domain: import.meta.env?.VITE_CURL_IPV6_DOMAIN,
+ ipv64Domain: import.meta.env?.VITE_CURL_IPV64_DOMAIN,
},
isFireBaseSet: false,
- loadingStatus: {
- ipcheck: false,
- connectivity: false,
- webrtc: false,
- dnsleaktest: false,
- },
+ openSheet: null,
+ loadingStatus: createLoadingStatus(),
isDarkMode: false,
isMobile: false,
shouldRefreshEveryThing: false,
@@ -75,16 +47,8 @@ export const useMainStore = defineStore('main', {
alertTitle: "",
alertDuration: 2000,
},
- currentSection: 'IPInfo',
- ipDBs: [
- { id: 0, text: 'IPCheck.ing', url: '/api/ipchecking?ip={{ip}}&lang={{lang}}', enabled: true },
- { id: 1, text: 'IPinfo.io', url: '/api/ipinfo?ip={{ip}}', enabled: true },
- { id: 2, text: 'IP-API.com', url: '/api/ipapicom?ip={{ip}}&lang={{lang}}', enabled: true },
- { id: 3, text: 'IPAPI.is', url: '/api/ipapiis?ip={{ip}}', enabled: true },
- { id: 4, text: 'IP2Location.io', url: '/api/ip2location?ip={{ip}}', enabled: true },
- { id: 5, text: 'IP.sb', url: '/api/ipsb?ip={{ip}}', enabled: true },
- { id: 6, text: 'MaxMind', url: '/api/maxmind?ip={{ip}}&lang={{lang}}', enabled: true },
- ],
+ currentSection: DEFAULT_SECTION,
+ ipDBs: createInitialIpDBs(),
}),
getters: {
@@ -98,76 +62,73 @@ export const useMainStore = defineStore('main', {
},
actions: {
- // 设置当前 route 路径
+ // set current route path
setCurrentPath(path, id) {
this.currentPath = { path: path, id: id };
},
- // 获取数据库的URL
+ // get database URL (URL template replacement logic is extracted to buildDbUrl pure function in data/ip-databases.js)
getDbUrl(id, ip, lang) {
const db = this.ipDBs.find(d => d.id === id);
- if (!db) return null;
- return db.url.replace('{{ip}}', ip).replace('{{lang}}', lang || 'en');
+ return buildDbUrl(db, ip, lang);
},
- // 从每个组件返回启动状态
+ // return starting status from each component
setMountingStatus(key, value) {
this.mountingStatus[key] = value;
},
- // 从每个组件返回加载状态
+ // return loading status from each component
setLoadingStatus(key, value) {
this.loadingStatus[key] = value;
},
- // 设置 Toast
+ // set Toast
setAlert(alertToShow, alertStyle, alertMessage, alertTitle, alertDuration) {
this.alert = { alertToShow, alertStyle, alertMessage, alertTitle, alertDuration };
},
- // 从不同的组件收集合并 IP 数据
+ // collect and merge IP data from different components
updateAllIPs(payload) {
const uniqueIPs = new Set([...this.allIPs, ...payload]);
this.allIPs = Array.from(uniqueIPs);
},
- // 设置移动模式
+ // set mobile mode
setIsMobile(payload) {
this.isMobile = payload;
},
- // App.vue 和 Nav.vue 的通信辅助函数
+ // communication helper between App.vue and Nav.vue
setRefreshEveryThing(payload) {
this.shouldRefreshEveryThing = payload;
},
- // 设置黑暗模式
+ setOpenSheet(name) {
+ this.openSheet = name; // pass null to close all
+ },
+ toggleSheet(name) {
+ this.openSheet = (this.openSheet === name) ? null : name;
+ },
+ // set dark mode
setDarkMode(value) {
this.isDarkMode = value;
+ if (typeof document !== 'undefined') {
+ document.documentElement.classList.toggle('dark', !!value);
+ }
},
- // 设置 IP 数据库的使能状态
+ // set IP database enable status
updateIPDBs({ id, enabled }) {
const index = this.ipDBs.findIndex(db => db.id === id);
if (index !== -1) {
this.ipDBs[index].enabled = enabled;
}
},
- // 用户偏好设置
+ // set user preferences
setPreferences(userPreferences) {
this.userPreferences = userPreferences;
localStorage.setItem('userPreferences', JSON.stringify(userPreferences));
},
- // 更新用户偏好设置
+ // update user preferences
updatePreference(key, value) {
this.userPreferences[key] = value;
localStorage.setItem('userPreferences', JSON.stringify(this.userPreferences));
},
- // 从本地存储加载用户偏好设置
+ // load user preferences from local storage
loadPreferences() {
- const defaultPreferences = {
- theme: 'auto', // auto, light, dark
- connectivityAutoRefresh: false,
- showMap: false,
- simpleMode: false,
- autoStart: true,
- hideUnavailableIPStack: false,
- popupConnectivityNotifications: true,
- ipCardsToShow: 6,
- ipGeoSource: 0,
- lang: 'auto',
- };
+ const defaultPreferences = createDefaultPreferences();
const storedPreferences = localStorage.getItem('userPreferences');
let preferencesToStore;
@@ -181,7 +142,7 @@ export const useMainStore = defineStore('main', {
localStorage.setItem('userPreferences', JSON.stringify(preferencesToStore));
this.setPreferences(preferencesToStore);
},
- // 从服务器获取配置
+ // fetch configs from server
fetchConfigs() {
fetch('/api/configs')
.then(response => {
@@ -199,44 +160,45 @@ export const useMainStore = defineStore('main', {
changeSection(section) {
this.currentSection = section;
},
- // 检查 Firebase 环境
+ // check Firebase environment
checkFirebaseEnv() {
+ const env = import.meta.env ?? {};
const envConfigs = {
- key: import.meta.env.VITE_FIREBASE_API_KEY,
- domain: import.meta.env.VITE_FIREBASE_AUTH_DOMAIN,
- project: import.meta.env.VITE_FIREBASE_PROJECT_ID,
+ key: env.VITE_FIREBASE_API_KEY,
+ domain: env.VITE_FIREBASE_AUTH_DOMAIN,
+ project: env.VITE_FIREBASE_PROJECT_ID,
}
this.isFireBaseSet = !!envConfigs.key && !!envConfigs.domain && !!envConfigs.project;
},
- // 通过 Google 登录
+ // sign in with Google
async signInWithGoogle() {
const provider = new GoogleAuthProvider();
provider.addScope('email');
try {
const result = await signInWithPopup(auth, provider);
this.user = result.user;
- // 登录成功后刷新浏览器
+ // refresh browser after successful login
window.location.reload();
} catch (error) {
this.alert = { alertToShow: true, alertStyle: "text-danger", alertMessage: t('alert.SignInFailedReason') + ' : ' + error, alertTitle: t('alert.SignInFailed') };
console.error("Google sign-in failed:", error);
}
},
- // 通过 GitHub 登录
+ // sign in with GitHub
async signInWithGithub() {
const provider = new GithubAuthProvider();
provider.addScope('user:email');
try {
const result = await signInWithPopup(auth, provider);
this.user = result.user;
- // 登录成功后刷新浏览器
+ // refresh browser after successful login
window.location.reload();
} catch (error) {
this.alert = { alertToShow: true, alertStyle: "text-danger", alertMessage: t('alert.SignInFailedReason') + ' : ' + error, alertTitle: t('alert.SignInFailed') };
console.error("GitHub sign-in failed:", error);
}
},
- // 退出登录
+ // sign out
async signOut() {
try {
await firebaseSignOut(auth);
@@ -246,7 +208,7 @@ export const useMainStore = defineStore('main', {
console.error("Sign out failed:", error);
}
},
- // 初始化 Auth 监听
+ // initialize Auth listener
initializeAuthListener() {
return new Promise((resolve) => {
const unsubscribe = onAuthStateChanged(auth, (currentUser) => {
@@ -254,26 +216,26 @@ export const useMainStore = defineStore('main', {
if (currentUser) {
this.isSignedIn = true;
}
- unsubscribe(); // 获取到用户状态后立即取消订阅
+ unsubscribe(); // unsubscribe immediately after getting user state
resolve();
});
});
},
- // 触发打开成就
+ // trigger open achievements
setTriggerAchievements(value) {
this.triggerAchievements = value;
},
- // 触发打开用户权益
+ // trigger open user benefits
setTriggerUserBenefits(value) {
this.triggerUserBenefits = value;
},
- // 触发远程获取用户信息
+ // trigger remote fetch user info
setTriggerRemoteUserInfo(value) {
if (value) {
this.triggerRemoteUserInfo = value;
}
},
- // 触发更新成就
+ // trigger update achievements
setTriggerUpdateAchievements(achievement) {
this.triggerUpdateAchievements = true;
this.achievementToUpdate = achievement;
diff --git a/frontend/style/style.css b/frontend/style/style.css
index f77e98ec3..94895bd8b 100644
--- a/frontend/style/style.css
+++ b/frontend/style/style.css
@@ -1,6 +1,183 @@
-@import 'bootstrap/dist/css/bootstrap.min.css';
-@import 'bootstrap-icons/font/bootstrap-icons.min.css';
-@import 'flag-icons/css/flag-icons.min.css';
+/* === Tailwind v4 + shadcn-vue === */
+@import 'tailwindcss';
+@import 'tw-animate-css';
+
+/* Base styles */
+@layer base {
+ h1 { font-size: 2.5rem; font-weight: 500; line-height: 1.2; margin-bottom: 0.5rem; }
+ h2 { font-size: 2rem; font-weight: 500; line-height: 1.2; margin-bottom: 0.5rem; }
+ h3 { font-size: 1.75rem; font-weight: 500; line-height: 1.2; margin-bottom: 0.5rem; }
+ h4 { font-size: 1.5rem; font-weight: 500; line-height: 1.2; margin-bottom: 0.5rem; }
+ h5 { font-size: 1.25rem; font-weight: 500; line-height: 1.2; margin-bottom: 0.5rem; }
+ h6 { font-size: 1rem; font-weight: 500; line-height: 1.2; margin-bottom: 0.5rem; }
+ p { margin-bottom: 1rem; }
+
+ /* Required patch for shadcn-vue + Tailwind v4:
+ In Tailwind v4, the `border` utility color falls back to currentColor (black/white),
+ unlike v3 which defaults to gray-200. shadcn-vue components (Card / DropdownMenuContent /
+ Dialog, etc.) have bare `border` classes without color, which will inherit text color and
+ become "black borders". Bind the default border color back to design token --border to
+ restore expected behavior.
+ Reference: https://ui.shadcn.com/docs/tailwind-v4 */
+ *, ::before, ::after {
+ border-color: var(--border);
+ }
+}
+
+/* Dark mode: triggered by .dark class (synchronized from store.isDarkMode to ) */
+@custom-variant dark (&:where(.dark, .dark *));
+
+/* Design tokens — shadcn-vue standard CSS variables + project custom semantic colors
+ ---------------------------------------------------------
+ Custom token rules:
+ - info = information/in-progress/waiting (paired with animate-ping status light) ≈ sky-500
+ - success = success/OK-fast ≈ green-500
+ - warning = warning/OK-slow ≈ amber-500
+ - destructive continue using shadcn primitives, corresponding to fail / error ≈ red-500
+
+ Each semantic color has a foreground pair, which automatically corrects the text color when used in bg-* ≈ amber-500 (foreground is dark because amber is light; sky / green / red are dark, so foreground is white). The light/dark mode is defined independently by :root / .dark, and tokens do not need to write dark: variants.
+*/
+:root {
+ --background: oklch(1 0 0);
+ --foreground: oklch(0.145 0 0);
+ --card: oklch(1 0 0);
+ --card-foreground: oklch(0.145 0 0);
+ --popover: oklch(1 0 0);
+ --popover-foreground: oklch(0.145 0 0);
+ --primary: oklch(0.205 0 0);
+ --primary-foreground: oklch(0.985 0 0);
+ --secondary: oklch(0.97 0 0);
+ --secondary-foreground: oklch(0.205 0 0);
+ --muted: oklch(0.97 0 0);
+ --muted-foreground: oklch(0.556 0 0);
+ --accent: oklch(0.97 0 0);
+ --accent-foreground: oklch(0.205 0 0);
+ --destructive: oklch(0.577 0.245 27.325);
+ --destructive-foreground: oklch(0.985 0 0);
+ /* Project custom semantic colors (light mode, corresponding to Tailwind *-500 oklch values) */
+ --info: oklch(0.685 0.169 237.323); /* sky-500 */
+ --info-foreground: oklch(0.985 0 0);
+ --success: oklch(0.63 0.17 149); /* green-500 */
+ --success-foreground: oklch(0.985 0 0);
+ --warning: oklch(0.769 0.188 70.08); /* amber-500 */
+ --warning-foreground: oklch(0.145 0 0);
+ --action: oklch(0.623 0.214 259.815); /* blue-500 —— for "run action" */
+ --action-foreground: oklch(0.985 0 0);
+ --border: oklch(0.922 0 0);
+ --input: oklch(0.922 0 0);
+ --ring: oklch(0.708 0 0);
+ --radius: 0.5rem;
+}
+
+.dark {
+ --background: oklch(0.145 0 0);
+ --foreground: oklch(0.985 0 0);
+ --card: oklch(0.205 0 0);
+ --card-foreground: oklch(0.985 0 0);
+ --popover: oklch(0.205 0 0);
+ --popover-foreground: oklch(0.985 0 0);
+ --primary: oklch(0.985 0 0);
+ --primary-foreground: oklch(0.205 0 0);
+ --secondary: oklch(0.269 0 0);
+ --secondary-foreground: oklch(0.985 0 0);
+ --muted: oklch(0.269 0 0);
+ --muted-foreground: oklch(0.708 0 0);
+ --accent: oklch(0.269 0 0);
+ --accent-foreground: oklch(0.985 0 0);
+ --destructive: oklch(0.704 0.191 22.216);
+ --destructive-foreground: oklch(0.985 0 0);
+ /* dark mode slightly brightened (corresponding to Tailwind *-400, better readability in dark background) */
+ --info: oklch(0.746 0.16 232.661); /* sky-400 */
+ --info-foreground: oklch(0.145 0 0);
+ --success: oklch(0.792 0.209 151.711); /* green-400 */
+ --success-foreground: oklch(0.145 0 0);
+ --warning: oklch(0.828 0.189 84.429); /* amber-400 */
+ --warning-foreground: oklch(0.145 0 0);
+ --action: oklch(0.623 0.214 259.815); /* blue-500 (same as light mode) */
+ --action-foreground: oklch(0.985 0 0); /* white text */
+ --border: oklch(1 0 0 / 0.1);
+ --input: oklch(1 0 0 / 0.15);
+ --ring: oklch(0.556 0 0);
+}
+
+@theme inline {
+ --color-background: var(--background);
+ --color-foreground: var(--foreground);
+ --color-card: var(--card);
+ --color-card-foreground: var(--card-foreground);
+ --color-popover: var(--popover);
+ --color-popover-foreground: var(--popover-foreground);
+ --color-primary: var(--primary);
+ --color-primary-foreground: var(--primary-foreground);
+ --color-secondary: var(--secondary);
+ --color-secondary-foreground: var(--secondary-foreground);
+ --color-muted: var(--muted);
+ --color-muted-foreground: var(--muted-foreground);
+ --color-accent: var(--accent);
+ --color-accent-foreground: var(--accent-foreground);
+ --color-destructive: var(--destructive);
+ --color-destructive-foreground: var(--destructive-foreground);
+ --color-info: var(--info);
+ --color-info-foreground: var(--info-foreground);
+ --color-success: var(--success);
+ --color-success-foreground: var(--success-foreground);
+ --color-warning: var(--warning);
+ --color-warning-foreground: var(--warning-foreground);
+ --color-action: var(--action);
+ --color-action-foreground: var(--action-foreground);
+ --color-border: var(--border);
+ --color-input: var(--input);
+ --color-ring: var(--ring);
+ --radius-lg: var(--radius);
+ --radius-md: calc(var(--radius) - 2px);
+ --radius-sm: calc(var(--radius) - 4px);
+}
+/* vaul default injects @media (hover:hover) and (pointer:fine) { user-select: none }
+ into [data-vaul-drawer] to avoid conflict between drag gestures and text selection.
+ We set handleOnly to true by default in the Drawer component (only the handle can be dragged, and the main content does not respond to dragging), so this restriction is a bug → users want to select text in the drawer on desktop but cannot.
+ Two pitfalls:
+ 1. vaul's
+
+
+
-
+
+
+
+
+
+
-
-
-
+
It may take a while for the first time, please wait…
-
-
It may take a while for the first time, please wait...
-
首次加载的时间可能会较长,请等待...
-
-
-
+
+
+
+
+ Waiting too long? Try IPCheck.ing Lite , or refresh the page.
+
-
+
+
+
+ IPCheck.ing requires JavaScript. Please enable it and refresh.
+
+
+
+
+
-