@jjlmoya/utils-hardware 1.15.0 → 1.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/category/index.ts +2 -1
- package/src/entries.ts +4 -1
- package/src/index.ts +1 -0
- package/src/pages/[locale]/[slug].astro +28 -12
- package/src/tests/locale_completeness.test.ts +6 -20
- package/src/tests/shared-test-helpers.ts +56 -0
- package/src/tests/tool_exports.test.ts +34 -0
- package/src/tests/tool_validation.test.ts +2 -2
- package/src/tool/batteryHealthEstimator/bibliography.ts +13 -0
- package/src/tool/batteryHealthEstimator/i18n/de.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/en.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/es.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/fr.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/id.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/it.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/ja.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/ko.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/nl.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/pl.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/pt.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/ru.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/sv.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/tr.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/zh.ts +2 -12
- package/src/tool/batteryHealthEstimator/seo.astro +3 -2
- package/src/tool/deadPixelTest/bibliography.ts +13 -0
- package/src/tool/deadPixelTest/i18n/de.ts +2 -12
- package/src/tool/deadPixelTest/i18n/en.ts +2 -12
- package/src/tool/deadPixelTest/i18n/es.ts +2 -12
- package/src/tool/deadPixelTest/i18n/fr.ts +2 -12
- package/src/tool/deadPixelTest/i18n/id.ts +2 -12
- package/src/tool/deadPixelTest/i18n/it.ts +2 -12
- package/src/tool/deadPixelTest/i18n/ja.ts +2 -12
- package/src/tool/deadPixelTest/i18n/ko.ts +2 -12
- package/src/tool/deadPixelTest/i18n/nl.ts +2 -12
- package/src/tool/deadPixelTest/i18n/pl.ts +2 -12
- package/src/tool/deadPixelTest/i18n/pt.ts +2 -12
- package/src/tool/deadPixelTest/i18n/ru.ts +2 -12
- package/src/tool/deadPixelTest/i18n/sv.ts +2 -12
- package/src/tool/deadPixelTest/i18n/tr.ts +2 -12
- package/src/tool/deadPixelTest/i18n/zh.ts +2 -12
- package/src/tool/deadPixelTest/seo.astro +3 -2
- package/src/tool/gamepadTest/bibliography.ts +12 -0
- package/src/tool/gamepadTest/i18n/de.ts +2 -12
- package/src/tool/gamepadTest/i18n/en.ts +2 -12
- package/src/tool/gamepadTest/i18n/es.ts +2 -12
- package/src/tool/gamepadTest/i18n/fr.ts +2 -12
- package/src/tool/gamepadTest/i18n/id.ts +2 -12
- package/src/tool/gamepadTest/i18n/it.ts +2 -12
- package/src/tool/gamepadTest/i18n/ja.ts +2 -12
- package/src/tool/gamepadTest/i18n/ko.ts +2 -12
- package/src/tool/gamepadTest/i18n/nl.ts +2 -12
- package/src/tool/gamepadTest/i18n/pl.ts +2 -12
- package/src/tool/gamepadTest/i18n/pt.ts +2 -12
- package/src/tool/gamepadTest/i18n/ru.ts +2 -12
- package/src/tool/gamepadTest/i18n/sv.ts +2 -12
- package/src/tool/gamepadTest/i18n/tr.ts +2 -12
- package/src/tool/gamepadTest/i18n/zh.ts +2 -12
- package/src/tool/gamepadTest/seo.astro +3 -2
- package/src/tool/gamepadVibrationTester/bibliography.ts +13 -0
- package/src/tool/gamepadVibrationTester/i18n/de.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/en.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/es.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/fr.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/id.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/it.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/ja.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/ko.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/nl.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/pl.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/pt.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/ru.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/sv.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/tr.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/zh.ts +2 -12
- package/src/tool/gamepadVibrationTester/seo.astro +3 -2
- package/src/tool/keyboardTest/bibliography.ts +13 -0
- package/src/tool/keyboardTest/i18n/de.ts +2 -12
- package/src/tool/keyboardTest/i18n/en.ts +2 -12
- package/src/tool/keyboardTest/i18n/es.ts +2 -12
- package/src/tool/keyboardTest/i18n/fr.ts +2 -12
- package/src/tool/keyboardTest/i18n/id.ts +2 -12
- package/src/tool/keyboardTest/i18n/it.ts +2 -12
- package/src/tool/keyboardTest/i18n/ja.ts +2 -12
- package/src/tool/keyboardTest/i18n/ko.ts +2 -12
- package/src/tool/keyboardTest/i18n/nl.ts +2 -12
- package/src/tool/keyboardTest/i18n/pl.ts +2 -12
- package/src/tool/keyboardTest/i18n/pt.ts +2 -12
- package/src/tool/keyboardTest/i18n/ru.ts +2 -12
- package/src/tool/keyboardTest/i18n/sv.ts +2 -12
- package/src/tool/keyboardTest/i18n/tr.ts +2 -12
- package/src/tool/keyboardTest/i18n/zh.ts +2 -12
- package/src/tool/keyboardTest/seo.astro +3 -2
- package/src/tool/mousePollingTest/bibliography.ts +13 -0
- package/src/tool/mousePollingTest/i18n/de.ts +2 -12
- package/src/tool/mousePollingTest/i18n/en.ts +2 -12
- package/src/tool/mousePollingTest/i18n/es.ts +2 -12
- package/src/tool/mousePollingTest/i18n/fr.ts +2 -12
- package/src/tool/mousePollingTest/i18n/id.ts +2 -12
- package/src/tool/mousePollingTest/i18n/it.ts +2 -12
- package/src/tool/mousePollingTest/i18n/ja.ts +2 -12
- package/src/tool/mousePollingTest/i18n/ko.ts +2 -12
- package/src/tool/mousePollingTest/i18n/nl.ts +2 -12
- package/src/tool/mousePollingTest/i18n/pl.ts +2 -12
- package/src/tool/mousePollingTest/i18n/pt.ts +2 -12
- package/src/tool/mousePollingTest/i18n/ru.ts +2 -12
- package/src/tool/mousePollingTest/i18n/sv.ts +2 -12
- package/src/tool/mousePollingTest/i18n/tr.ts +2 -12
- package/src/tool/mousePollingTest/i18n/zh.ts +2 -12
- package/src/tool/mousePollingTest/seo.astro +3 -2
- package/src/tool/refreshRateDetector/bibliography.astro +14 -0
- package/src/tool/refreshRateDetector/bibliography.ts +20 -0
- package/src/tool/refreshRateDetector/component.astro +206 -0
- package/src/tool/refreshRateDetector/entry.ts +29 -0
- package/src/tool/refreshRateDetector/i18n/de.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/en.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/es.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/fr.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/id.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/it.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/ja.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/ko.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/nl.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/pl.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/pt.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/ru.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/sv.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/tr.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/zh.ts +196 -0
- package/src/tool/refreshRateDetector/index.ts +11 -0
- package/src/tool/refreshRateDetector/monitor-refresh-rate-detector.css +342 -0
- package/src/tool/refreshRateDetector/seo.astro +15 -0
- package/src/tool/refreshRateDetector/ui.ts +24 -0
- package/src/tool/toneGenerator/bibliography.ts +13 -0
- package/src/tool/toneGenerator/i18n/de.ts +2 -12
- package/src/tool/toneGenerator/i18n/en.ts +2 -12
- package/src/tool/toneGenerator/i18n/es.ts +2 -12
- package/src/tool/toneGenerator/i18n/fr.ts +2 -12
- package/src/tool/toneGenerator/i18n/id.ts +2 -12
- package/src/tool/toneGenerator/i18n/it.ts +2 -12
- package/src/tool/toneGenerator/i18n/ja.ts +2 -12
- package/src/tool/toneGenerator/i18n/ko.ts +2 -12
- package/src/tool/toneGenerator/i18n/nl.ts +2 -12
- package/src/tool/toneGenerator/i18n/pl.ts +2 -12
- package/src/tool/toneGenerator/i18n/pt.ts +2 -12
- package/src/tool/toneGenerator/i18n/ru.ts +2 -12
- package/src/tool/toneGenerator/i18n/sv.ts +2 -12
- package/src/tool/toneGenerator/i18n/tr.ts +2 -12
- package/src/tool/toneGenerator/i18n/zh.ts +2 -12
- package/src/tool/toneGenerator/seo.astro +3 -2
- package/src/tools.ts +2 -1
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { BibliographyEntry } from '../../types';
|
|
2
|
+
|
|
3
|
+
export const bibliography: BibliographyEntry[] = [
|
|
4
|
+
{
|
|
5
|
+
name: 'VESA DisplayPort Standard - Monitor Refresh Rates',
|
|
6
|
+
url: 'https://www.vesa.org/standards/',
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
name: 'HDMI Specification - Refresh Rate Support',
|
|
10
|
+
url: 'https://www.hdmi.org/spec21Sub1',
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
name: 'MDN - requestAnimationFrame API',
|
|
14
|
+
url: 'https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: 'Screen Refresh Rate - Performance Best Practices',
|
|
18
|
+
url: 'https://web.dev/animations-guide/',
|
|
19
|
+
},
|
|
20
|
+
];
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
---
|
|
2
|
+
import type { KnownLocale } from '../../types';
|
|
3
|
+
import type { RefreshRateDetectorUI } from './ui';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
locale?: KnownLocale;
|
|
7
|
+
ui?: Record<string, unknown>;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { ui } = Astro.props;
|
|
11
|
+
const t = (ui ?? {}) as RefreshRateDetectorUI;
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
<div id="rrd-root" class="rrd-wrapper" data-config={JSON.stringify({
|
|
15
|
+
currentHz: t.currentHz,
|
|
16
|
+
averageHz: t.averageHz,
|
|
17
|
+
maxHz: t.maxHz,
|
|
18
|
+
minHz: t.minHz,
|
|
19
|
+
})}>
|
|
20
|
+
<div class="rrd-container">
|
|
21
|
+
<div class="rrd-card">
|
|
22
|
+
<div class="rrd-layout">
|
|
23
|
+
<div class="rrd-left">
|
|
24
|
+
<div class="rrd-metrics">
|
|
25
|
+
<div class="rrd-metric-item">
|
|
26
|
+
<div class="rrd-metric-label">{t.currentHz}</div>
|
|
27
|
+
<div class="rrd-metric-value" id="current-hz">—</div>
|
|
28
|
+
<div class="rrd-metric-unit">Hz</div>
|
|
29
|
+
</div>
|
|
30
|
+
<div class="rrd-metric-item">
|
|
31
|
+
<div class="rrd-metric-label">{t.averageHz}</div>
|
|
32
|
+
<div class="rrd-metric-value" id="average-hz">—</div>
|
|
33
|
+
<div class="rrd-metric-unit">Hz</div>
|
|
34
|
+
</div>
|
|
35
|
+
<div class="rrd-metric-item">
|
|
36
|
+
<div class="rrd-metric-label">{t.maxHz}</div>
|
|
37
|
+
<div class="rrd-metric-value" id="max-hz">—</div>
|
|
38
|
+
<div class="rrd-metric-unit">Hz</div>
|
|
39
|
+
</div>
|
|
40
|
+
<div class="rrd-metric-item">
|
|
41
|
+
<div class="rrd-metric-label">{t.minHz}</div>
|
|
42
|
+
<div class="rrd-metric-value" id="min-hz">—</div>
|
|
43
|
+
<div class="rrd-metric-unit">Hz</div>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
|
|
47
|
+
<div class="rrd-mode-selector">
|
|
48
|
+
<button id="mode-fast" class="rrd-mode-btn selected" data-mode="fast" data-duration="3000">
|
|
49
|
+
{t.modeFast}
|
|
50
|
+
</button>
|
|
51
|
+
<button id="mode-stable" class="rrd-mode-btn" data-mode="stable" data-duration="10000">
|
|
52
|
+
{t.modeStable}
|
|
53
|
+
</button>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<div class="rrd-right">
|
|
58
|
+
<div class="rrd-monitor">
|
|
59
|
+
<div class="rrd-monitor-bezel">
|
|
60
|
+
<div class="rrd-monitor-screen">
|
|
61
|
+
<div class="rrd-monitor-content">
|
|
62
|
+
<div class="rrd-hz-display" id="hz-display">—</div>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
<div class="rrd-monitor-stand"></div>
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
|
|
74
|
+
<link rel="stylesheet" href="./monitor-refresh-rate-detector.css" />
|
|
75
|
+
|
|
76
|
+
<script>
|
|
77
|
+
interface State {
|
|
78
|
+
mode: 'fast' | 'stable';
|
|
79
|
+
duration: number;
|
|
80
|
+
frameTimestamps: number[];
|
|
81
|
+
startTime: number;
|
|
82
|
+
maxHz: number;
|
|
83
|
+
minHz: number;
|
|
84
|
+
averageHz: number;
|
|
85
|
+
currentHz: number;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const state: State = {
|
|
89
|
+
mode: 'fast',
|
|
90
|
+
duration: 3000,
|
|
91
|
+
frameTimestamps: [],
|
|
92
|
+
startTime: 0,
|
|
93
|
+
maxHz: 0,
|
|
94
|
+
minHz: Infinity,
|
|
95
|
+
averageHz: 0,
|
|
96
|
+
currentHz: 0,
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const elements = {
|
|
100
|
+
currentHz: document.getElementById('current-hz'),
|
|
101
|
+
averageHz: document.getElementById('average-hz'),
|
|
102
|
+
maxHz: document.getElementById('max-hz'),
|
|
103
|
+
minHz: document.getElementById('min-hz'),
|
|
104
|
+
hzDisplay: document.getElementById('hz-display'),
|
|
105
|
+
modeFast: document.getElementById('mode-fast'),
|
|
106
|
+
modeStable: document.getElementById('mode-stable'),
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
function getFrameDeltas(timestamps: number[]): number[] {
|
|
110
|
+
const deltas: number[] = [];
|
|
111
|
+
for (let i = 1; i < timestamps.length; i++) {
|
|
112
|
+
const prev = timestamps[i - 1];
|
|
113
|
+
const curr = timestamps[i];
|
|
114
|
+
if (prev !== undefined && curr !== undefined) {
|
|
115
|
+
deltas.push(curr - prev);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return deltas;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function filterOutliers(deltas: number[]): number[] {
|
|
122
|
+
if (deltas.length === 0) return deltas;
|
|
123
|
+
const sorted = [...deltas].sort((a, b) => a - b);
|
|
124
|
+
const q1Index = Math.floor(sorted.length * 0.25);
|
|
125
|
+
const q3Index = Math.floor(sorted.length * 0.75);
|
|
126
|
+
const q1 = sorted[q1Index] ?? 0;
|
|
127
|
+
const q3 = sorted[q3Index] ?? 0;
|
|
128
|
+
const iqr = q3 - q1;
|
|
129
|
+
return deltas.filter(d => d >= q1 - 1.5 * iqr && d <= q3 + 1.5 * iqr);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function calculateHz(timestamps: number[]): number {
|
|
133
|
+
if (timestamps.length < 2) return 0;
|
|
134
|
+
const deltas = getFrameDeltas(timestamps);
|
|
135
|
+
if (deltas.length === 0) return 0;
|
|
136
|
+
const filtered = filterOutliers(deltas);
|
|
137
|
+
if (filtered.length === 0) return 0;
|
|
138
|
+
const avgDelta = filtered.reduce((a, b) => a + b) / filtered.length;
|
|
139
|
+
return avgDelta > 0 ? Math.round(1000 / avgDelta * 10) / 10 : 0;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function updateMetrics(): void {
|
|
143
|
+
if (state.frameTimestamps.length < 2) return;
|
|
144
|
+
const warmupTime = state.startTime + 500;
|
|
145
|
+
const warmedUpTimestamps = state.frameTimestamps.filter(t => t >= warmupTime);
|
|
146
|
+
if (warmedUpTimestamps.length < 2) return;
|
|
147
|
+
|
|
148
|
+
const recentHz = calculateHz(warmedUpTimestamps.slice(-60));
|
|
149
|
+
state.currentHz = recentHz;
|
|
150
|
+
|
|
151
|
+
const allHz: number[] = [];
|
|
152
|
+
for (let i = 1; i < warmedUpTimestamps.length; i++) {
|
|
153
|
+
const prev = warmedUpTimestamps[i - 1];
|
|
154
|
+
const curr = warmedUpTimestamps[i];
|
|
155
|
+
if (prev !== undefined && curr !== undefined) {
|
|
156
|
+
allHz.push(1000 / (curr - prev));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (allHz.length > 0) {
|
|
161
|
+
state.maxHz = Math.max(...allHz);
|
|
162
|
+
state.minHz = Math.min(...allHz);
|
|
163
|
+
state.averageHz = allHz.reduce((a, b) => a + b) / allHz.length;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
elements.currentHz!.textContent = state.currentHz.toFixed(1);
|
|
167
|
+
elements.averageHz!.textContent = state.averageHz.toFixed(1);
|
|
168
|
+
elements.maxHz!.textContent = state.maxHz.toFixed(1);
|
|
169
|
+
elements.minHz!.textContent = state.minHz.toFixed(1);
|
|
170
|
+
elements.hzDisplay!.textContent = state.currentHz.toFixed(0);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function measureFrame() {
|
|
174
|
+
state.frameTimestamps.push(performance.now());
|
|
175
|
+
updateMetrics();
|
|
176
|
+
requestAnimationFrame(measureFrame);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function restartMeasurement() {
|
|
180
|
+
state.frameTimestamps = [];
|
|
181
|
+
state.startTime = performance.now();
|
|
182
|
+
state.maxHz = 0;
|
|
183
|
+
state.minHz = Infinity;
|
|
184
|
+
state.averageHz = 0;
|
|
185
|
+
state.currentHz = 0;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
elements.modeFast?.addEventListener('click', () => {
|
|
189
|
+
state.mode = 'fast';
|
|
190
|
+
state.duration = 3000;
|
|
191
|
+
elements.modeFast!.classList.add('selected');
|
|
192
|
+
elements.modeStable!.classList.remove('selected');
|
|
193
|
+
restartMeasurement();
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
elements.modeStable?.addEventListener('click', () => {
|
|
197
|
+
state.mode = 'stable';
|
|
198
|
+
state.duration = 10000;
|
|
199
|
+
elements.modeStable!.classList.add('selected');
|
|
200
|
+
elements.modeFast!.classList.remove('selected');
|
|
201
|
+
restartMeasurement();
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
restartMeasurement();
|
|
205
|
+
requestAnimationFrame(measureFrame);
|
|
206
|
+
</script>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { HardwareToolEntry, ToolLocaleContent } from '../../types';
|
|
2
|
+
import type { RefreshRateDetectorUI } from './ui';
|
|
3
|
+
|
|
4
|
+
export type RefreshRateDetectorLocaleContent = ToolLocaleContent<RefreshRateDetectorUI>;
|
|
5
|
+
|
|
6
|
+
export const refreshRateDetector: HardwareToolEntry<RefreshRateDetectorUI> = {
|
|
7
|
+
id: 'monitor-refresh-rate-detector',
|
|
8
|
+
icons: {
|
|
9
|
+
bg: 'mdi:monitor',
|
|
10
|
+
fg: 'mdi:speedometer',
|
|
11
|
+
},
|
|
12
|
+
i18n: {
|
|
13
|
+
en: () => import('./i18n/en').then((m) => m.content),
|
|
14
|
+
es: () => import('./i18n/es').then((m) => m.content),
|
|
15
|
+
fr: () => import('./i18n/fr').then((m) => m.content),
|
|
16
|
+
de: () => import('./i18n/de').then((m) => m.content),
|
|
17
|
+
it: () => import('./i18n/it').then((m) => m.content),
|
|
18
|
+
pt: () => import('./i18n/pt').then((m) => m.content),
|
|
19
|
+
nl: () => import('./i18n/nl').then((m) => m.content),
|
|
20
|
+
pl: () => import('./i18n/pl').then((m) => m.content),
|
|
21
|
+
sv: () => import('./i18n/sv').then((m) => m.content),
|
|
22
|
+
tr: () => import('./i18n/tr').then((m) => m.content),
|
|
23
|
+
ru: () => import('./i18n/ru').then((m) => m.content),
|
|
24
|
+
id: () => import('./i18n/id').then((m) => m.content),
|
|
25
|
+
ja: () => import('./i18n/ja').then((m) => m.content),
|
|
26
|
+
ko: () => import('./i18n/ko').then((m) => m.content),
|
|
27
|
+
zh: () => import('./i18n/zh').then((m) => m.content),
|
|
28
|
+
},
|
|
29
|
+
};
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { RefreshRateDetectorUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
5
|
+
|
|
6
|
+
const slug = 'monitor-bildwiederholfrequenz-detektor';
|
|
7
|
+
const title = 'Monitor Bildwiederholfrequenz Detektor';
|
|
8
|
+
const description = 'Erkennen Sie sofort die Bildwiederholfrequenz Ihres Monitors mit Präzision unter Verwendung von requestAnimationFrame. Testen Sie die Bildstabilität und vergleichen Sie sie mit Industriestandards.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Was ist die Bildwiederholfrequenz (Hz)?',
|
|
13
|
+
answer: 'Die Bildwiederholfrequenz gibt an, wie oft pro Sekunde Ihr Monitor das Bild aktualisiert. Ein 60-Hz-Monitor aktualisiert das Bild 60 Mal pro Sekunde, während ein 144-Hz-Monitor dies 144 Mal tut. Höhere Raten führen zu flüssigeren Bewegungen.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
question: 'Wie genau ist dieser Detektor?',
|
|
17
|
+
answer: 'Dieses Tool verwendet requestAnimationFrame, das sich mit dem Aktualisierungszyklus Ihres Monitors synchronisiert. Die Genauigkeit hängt von der Systemlast ab. Der stabile Modus misst über längere Zeiträume für eine höhere Präzision.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
question: 'Was ist der Unterschied zwischen dem stabilen und dem schnellen Modus?',
|
|
21
|
+
answer: 'Der schnelle Modus misst über eine kurze Zeit (~3 Sekunden) für schnelles Feedback. Der stabile Modus dauert länger (~10 Sekunden), um Systemrauschen herauszufiltern und zuverlässigere Ergebnisse zu liefern.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
question: 'Warum unterscheidet sich meine erkannte Hz-Zahl von den Angaben meines Monitors?',
|
|
25
|
+
answer: 'Dies kann passieren, wenn: Ihre Kabelverbindung locker ist, Treiber veraltet sind oder Ihre Betriebssystem-Skalierung stört. Versuchen Sie, Ihr Displaykabel aus- und wieder einzustecken oder die GPU-Treiber zu aktualisieren.',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
question: 'Welche Bildwiederholfrequenzen unterstützen moderne Monitore?',
|
|
29
|
+
answer: 'Gängige Standards sind 60 Hz (Basis), 75 Hz, 120 Hz, 144 Hz (Gaming), 240 Hz (kompetitives Gaming) und 360 Hz (professioneller E-Sport).',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Tool laden',
|
|
36
|
+
text: 'Öffnen Sie einfach diese Seite. Der Detektor beginnt sofort mit der Messung.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Auf Stabilisierung warten',
|
|
40
|
+
text: 'Wählen Sie den stabilen oder den schnellen Modus. Lassen Sie die Messung abschließen, ohne das Fenster zu bewegen.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Tachometer prüfen',
|
|
44
|
+
text: 'Die Bildwiederholfrequenz Ihres Monitors erscheint als sanfte Skala mit Benchmark-Statistiken (Min/Max/Avg).',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Mit Standards vergleichen',
|
|
48
|
+
text: 'Das Tool zeigt an, welchem Standard Ihr Monitor entspricht (60, 75, 120, 144, 240, 360 Hz).',
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: 'Optional: Frame-Skipping testen',
|
|
52
|
+
text: 'Beobachten Sie das animierte Quadrat, das über den Bildschirm läuft, um die Flüssigkeit visuell zu bestätigen.',
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
57
|
+
'@context': 'https://schema.org',
|
|
58
|
+
'@type': 'FAQPage',
|
|
59
|
+
mainEntity: faqData.map((item) => ({
|
|
60
|
+
'@type': 'Question',
|
|
61
|
+
name: item.question,
|
|
62
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
63
|
+
})),
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
const howToSchema: WithContext<HowTo> = {
|
|
67
|
+
'@context': 'https://schema.org',
|
|
68
|
+
'@type': 'HowTo',
|
|
69
|
+
name: title,
|
|
70
|
+
description,
|
|
71
|
+
step: howToData.map((step, i) => ({
|
|
72
|
+
'@type': 'HowToStep',
|
|
73
|
+
position: i + 1,
|
|
74
|
+
name: step.name,
|
|
75
|
+
text: step.text,
|
|
76
|
+
})),
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
80
|
+
'@context': 'https://schema.org',
|
|
81
|
+
'@type': 'SoftwareApplication',
|
|
82
|
+
name: title,
|
|
83
|
+
description,
|
|
84
|
+
applicationCategory: 'UtilityApplication',
|
|
85
|
+
operatingSystem: 'All',
|
|
86
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
|
|
87
|
+
inLanguage: 'de',
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export const content: ToolLocaleContent<RefreshRateDetectorUI> = {
|
|
91
|
+
slug,
|
|
92
|
+
title,
|
|
93
|
+
description,
|
|
94
|
+
faq: faqData,
|
|
95
|
+
bibliography,
|
|
96
|
+
howTo: howToData,
|
|
97
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
98
|
+
seo: [
|
|
99
|
+
{
|
|
100
|
+
type: 'title',
|
|
101
|
+
text: 'Monitor Bildwiederholfrequenz-Detektor: Testen Sie Ihre Display-Hz online',
|
|
102
|
+
level: 2,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
type: 'paragraph',
|
|
106
|
+
html: 'Erkennen Sie sofort die Bildwiederholfrequenz Ihres Monitors (60 Hz, 144 Hz, 240 Hz usw.) mit Präzision. Testen Sie die Bildstabilität und verifizieren Sie, dass Ihr Display die angegebenen Spezifikationen erfüllt.',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
type: 'title',
|
|
110
|
+
text: 'Warum die Bildwiederholfrequenz des Monitors wichtig ist',
|
|
111
|
+
level: 3,
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
type: 'paragraph',
|
|
115
|
+
html: 'Die Bildwiederholfrequenz bestimmt, wie flüssig Bewegungen auf Ihrem Bildschirm erscheinen. Gamer profitieren von 144-Hz+-Monitoren, während allgemeine Benutzer 60 Hz als ausreichend empfinden. Dieses Tool hilft zu bestätigen, dass Ihr Monitor tatsächlich die beworbene Bildwiederholfrequenz liefert.',
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
type: 'title',
|
|
119
|
+
text: 'So erkennen Sie Ihre Bildwiederholfrequenz',
|
|
120
|
+
level: 3,
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
type: 'list',
|
|
124
|
+
items: [
|
|
125
|
+
'Laden Sie diesen Detektor – die Messung beginnt sofort',
|
|
126
|
+
'Wählen Sie zwischen dem schnellen (3s) oder dem stabilen (10s) Messmodus',
|
|
127
|
+
'Lesen Sie die Hz-Zahl Ihres Monitors auf der Tachometerskala ab',
|
|
128
|
+
'Vergleichen Sie sie mit Industriestandards (60, 75, 120, 144, 240, 360 Hz)',
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
type: 'title',
|
|
133
|
+
text: 'Gängige Standards für die Bildwiederholfrequenz',
|
|
134
|
+
level: 3,
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
type: 'table',
|
|
138
|
+
headers: ['Standard', 'Anwendungsfall', 'Typischer Benutzer'],
|
|
139
|
+
rows: [
|
|
140
|
+
['60 Hz', 'Allgemeine Computeranwendung', 'Büro, Surfen im Web'],
|
|
141
|
+
['75 Hz', 'Leichtes Gaming', 'Gelegenheitsspieler'],
|
|
142
|
+
['120 Hz', 'Multimedia', 'Konsole, Streaming'],
|
|
143
|
+
['144 Hz', 'Kompetitives Gaming', 'FPS, schnelle Spiele'],
|
|
144
|
+
['240 Hz+', 'Professioneller E-Sport', 'Profi-Gamer, Streamer'],
|
|
145
|
+
],
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
type: 'title',
|
|
149
|
+
text: 'Fehlerbehebung: Display zeigt weniger Hz als erwartet an',
|
|
150
|
+
level: 3,
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
type: 'list',
|
|
154
|
+
items: [
|
|
155
|
+
'Prüfen Sie die HDMI/DisplayPort-Kabelverbindungen – lose Kabel reduzieren die Bandbreite',
|
|
156
|
+
'Aktualisieren Sie Ihre GPU-Treiber (NVIDIA, AMD, Intel)',
|
|
157
|
+
'Überprüfen Sie die Betriebssystem-Anzeigeeinstellungen, um sicherzustellen, dass eine hohe Bildwiederholfrequenz aktiviert ist',
|
|
158
|
+
'Probieren Sie verschiedene Kabel oder Anschlüsse an Ihrem Monitor aus',
|
|
159
|
+
'Starten Sie Ihren Computer neu und testen Sie erneut',
|
|
160
|
+
],
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
type: 'title',
|
|
164
|
+
text: 'Die Technik hinter diesem Detektor',
|
|
165
|
+
level: 3,
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
type: 'paragraph',
|
|
169
|
+
html: 'Dieses Tool verwendet die requestAnimationFrame-API des Browsers, die direkt mit dem Aktualisierungszyklus Ihres Monitors synchronisiert wird. Durch Messen der Zeit zwischen den Animationsframes berechnen wir Ihre exakte Bildwiederholfrequenz mit hoher Präzision – keine spezielle Hardware erforderlich.',
|
|
170
|
+
},
|
|
171
|
+
],
|
|
172
|
+
ui: {
|
|
173
|
+
badge: 'Display Test',
|
|
174
|
+
title: 'Monitor Bildwiederholfrequenz Detektor',
|
|
175
|
+
description: 'Erkennen Sie sofort die Bildwiederholfrequenz Ihres Displays',
|
|
176
|
+
modeStable: 'Stabil (10s, präzise)',
|
|
177
|
+
modeFast: 'Schnell (3s, fix)',
|
|
178
|
+
measurementStatus: 'Messung läuft...',
|
|
179
|
+
currentHz: 'Aktuell',
|
|
180
|
+
averageHz: 'Durchschnitt',
|
|
181
|
+
maxHz: 'Maximum',
|
|
182
|
+
minHz: 'Minimum',
|
|
183
|
+
standardDetected: 'Standard erkannt',
|
|
184
|
+
frameSkippingTest: 'Frame-Skipping-Test',
|
|
185
|
+
startMeasurement: 'Messung starten',
|
|
186
|
+
resetMeasurement: 'Zurücksetzen',
|
|
187
|
+
copyResult: 'Ergebnis kopieren',
|
|
188
|
+
copiedFeedback: 'In die Zwischenablage kopiert!',
|
|
189
|
+
optimalConfiguration: '[OK] Optimale Konfiguration',
|
|
190
|
+
suboptimalConfiguration: '[WARNUNG] Unter dem Optimum',
|
|
191
|
+
unstableRefreshRate: '[WARNUNG] Instabile Bildwiederholfrequenz',
|
|
192
|
+
measurementNotStarted: 'Bereit zur Messung',
|
|
193
|
+
switchMonitorHint: 'Ziehen Sie das Fenster auf einen anderen Monitor, um diesen zu testen',
|
|
194
|
+
incompatibleBrowserMsg: 'Ihr Browser unterstützt requestAnimationFrame nicht',
|
|
195
|
+
},
|
|
196
|
+
};
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { RefreshRateDetectorUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
5
|
+
|
|
6
|
+
const slug = 'monitor-refresh-rate-detector';
|
|
7
|
+
const title = 'Monitor Refresh Rate Detector';
|
|
8
|
+
const description = 'Instantly detect your monitor\'s refresh rate with precision using requestAnimationFrame. Test frame stability and compare with industry standards.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'What is refresh rate (Hz)?',
|
|
13
|
+
answer: 'Refresh rate is how many times per second your monitor updates the image. A 60Hz monitor refreshes 60 times per second, while 144Hz refreshes 144 times. Higher rates result in smoother motion.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
question: 'How accurate is this detector?',
|
|
17
|
+
answer: 'This tool uses requestAnimationFrame, which synchronizes with your monitor\'s refresh cycle. Accuracy depends on system load. The stable mode measures for longer periods for greater precision.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
question: 'What\'s the difference between Stable and Fast mode?',
|
|
21
|
+
answer: 'Fast mode measures for a short time (~3 seconds) for quick feedback. Stable mode takes longer (~10 seconds) to filter out system noise and provide more reliable results.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
question: 'Why is my detected Hz different from what my monitor says?',
|
|
25
|
+
answer: 'This can happen if: your cable connection is loose, drivers are outdated, or your OS scaling interferes. Try unplugging and re-plugging your display cable, or updating GPU drivers.',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
question: 'What refresh rates do modern monitors support?',
|
|
29
|
+
answer: 'Common standards are 60Hz (basic), 75Hz, 120Hz, 144Hz (gaming), 240Hz (competitive gaming), and 360Hz (professional esports).',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Load the tool',
|
|
36
|
+
text: 'Simply open this page. The detector starts measuring immediately.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Wait for stabilization',
|
|
40
|
+
text: 'Choose Stable or Fast mode. Let the measurement complete without moving the window.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Check the speedometer',
|
|
44
|
+
text: 'Your monitor\'s refresh rate appears as a smooth dial, with benchmark stats (min/max/avg).',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Compare with standards',
|
|
48
|
+
text: 'The tool shows which standard your monitor matches (60, 75, 120, 144, 240, 360Hz).',
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: 'Optional: test frame skipping',
|
|
52
|
+
text: 'Watch the animated square cross the screen to visually confirm fluidity.',
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
57
|
+
'@context': 'https://schema.org',
|
|
58
|
+
'@type': 'FAQPage',
|
|
59
|
+
mainEntity: faqData.map((item) => ({
|
|
60
|
+
'@type': 'Question',
|
|
61
|
+
name: item.question,
|
|
62
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
63
|
+
})),
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
const howToSchema: WithContext<HowTo> = {
|
|
67
|
+
'@context': 'https://schema.org',
|
|
68
|
+
'@type': 'HowTo',
|
|
69
|
+
name: title,
|
|
70
|
+
description,
|
|
71
|
+
step: howToData.map((step, i) => ({
|
|
72
|
+
'@type': 'HowToStep',
|
|
73
|
+
position: i + 1,
|
|
74
|
+
name: step.name,
|
|
75
|
+
text: step.text,
|
|
76
|
+
})),
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
80
|
+
'@context': 'https://schema.org',
|
|
81
|
+
'@type': 'SoftwareApplication',
|
|
82
|
+
name: title,
|
|
83
|
+
description,
|
|
84
|
+
applicationCategory: 'UtilityApplication',
|
|
85
|
+
operatingSystem: 'All',
|
|
86
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
|
|
87
|
+
inLanguage: 'en',
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export const content: ToolLocaleContent<RefreshRateDetectorUI> = {
|
|
91
|
+
slug,
|
|
92
|
+
title,
|
|
93
|
+
description,
|
|
94
|
+
faq: faqData,
|
|
95
|
+
bibliography,
|
|
96
|
+
howTo: howToData,
|
|
97
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
98
|
+
seo: [
|
|
99
|
+
{
|
|
100
|
+
type: 'title',
|
|
101
|
+
text: 'Monitor Refresh Rate Detector: Test Your Display Hz Online',
|
|
102
|
+
level: 2,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
type: 'paragraph',
|
|
106
|
+
html: 'Instantly detect your monitor\'s refresh rate (60Hz, 144Hz, 240Hz, etc.) with precision. Test frame stability and verify your display is performing at its rated specifications.',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
type: 'title',
|
|
110
|
+
text: 'Why Monitor Refresh Rate Matters',
|
|
111
|
+
level: 3,
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
type: 'paragraph',
|
|
115
|
+
html: 'Refresh rate determines how smooth motion appears on your screen. Gamers benefit from 144Hz+ monitors, while general users find 60Hz adequate. This tool helps confirm your monitor is actually delivering its advertised refresh rate.',
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
type: 'title',
|
|
119
|
+
text: 'How to Detect Your Refresh Rate',
|
|
120
|
+
level: 3,
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
type: 'list',
|
|
124
|
+
items: [
|
|
125
|
+
'Load this detector—measurement begins immediately',
|
|
126
|
+
'Choose between Fast (3s) or Stable (10s) measurement mode',
|
|
127
|
+
'Read your monitor\'s Hz from the speedometer dial',
|
|
128
|
+
'Compare against industry standards (60, 75, 120, 144, 240, 360Hz)',
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
type: 'title',
|
|
133
|
+
text: 'Common Refresh Rate Standards',
|
|
134
|
+
level: 3,
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
type: 'table',
|
|
138
|
+
headers: ['Standard', 'Use Case', 'Typical User'],
|
|
139
|
+
rows: [
|
|
140
|
+
['60Hz', 'General Computing', 'Office, Web Browsing'],
|
|
141
|
+
['75Hz', 'Light Gaming', 'Casual Gamers'],
|
|
142
|
+
['120Hz', 'Multimedia', 'Console, Streaming'],
|
|
143
|
+
['144Hz', 'Competitive Gaming', 'FPS, Fast-Paced Games'],
|
|
144
|
+
['240Hz+', 'Professional Esports', 'Pro Gamers, Streamers'],
|
|
145
|
+
],
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
type: 'title',
|
|
149
|
+
text: 'Troubleshooting: Display Shows Lower Hz Than Expected',
|
|
150
|
+
level: 3,
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
type: 'list',
|
|
154
|
+
items: [
|
|
155
|
+
'Check HDMI/DisplayPort cable connections—loose cables reduce bandwidth',
|
|
156
|
+
'Update your GPU drivers (NVIDIA, AMD, Intel)',
|
|
157
|
+
'Check OS display settings to ensure high refresh rate is enabled',
|
|
158
|
+
'Try different cables or ports on your monitor',
|
|
159
|
+
'Restart your computer and re-test',
|
|
160
|
+
],
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
type: 'title',
|
|
164
|
+
text: 'The Tech Behind This Detector',
|
|
165
|
+
level: 3,
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
type: 'paragraph',
|
|
169
|
+
html: 'This tool uses the browser\'s requestAnimationFrame API, which synchronizes directly with your monitor\'s refresh cycle. By measuring the time between animation frames, we calculate your exact refresh rate with high precision—no special hardware needed.',
|
|
170
|
+
},
|
|
171
|
+
],
|
|
172
|
+
ui: {
|
|
173
|
+
badge: 'Display Test',
|
|
174
|
+
title: 'Monitor Refresh Rate Detector',
|
|
175
|
+
description: 'Detect your display\'s refresh rate instantly',
|
|
176
|
+
modeStable: 'Stable (10s, precise)',
|
|
177
|
+
modeFast: 'Fast (3s, quick)',
|
|
178
|
+
measurementStatus: 'Measuring...',
|
|
179
|
+
currentHz: 'Current',
|
|
180
|
+
averageHz: 'Average',
|
|
181
|
+
maxHz: 'Maximum',
|
|
182
|
+
minHz: 'Minimum',
|
|
183
|
+
standardDetected: 'Standard Detected',
|
|
184
|
+
frameSkippingTest: 'Frame Skipping Test',
|
|
185
|
+
startMeasurement: 'Start Measurement',
|
|
186
|
+
resetMeasurement: 'Reset',
|
|
187
|
+
copyResult: 'Copy Result',
|
|
188
|
+
copiedFeedback: 'Copied to clipboard!',
|
|
189
|
+
optimalConfiguration: '[OK] Optimal Configuration',
|
|
190
|
+
suboptimalConfiguration: '[WARNING] Below Optimal',
|
|
191
|
+
unstableRefreshRate: '[WARNING] Unstable Refresh Rate',
|
|
192
|
+
measurementNotStarted: 'Ready to measure',
|
|
193
|
+
switchMonitorHint: 'Drag window to another monitor to test it',
|
|
194
|
+
incompatibleBrowserMsg: 'Your browser doesn\'t support requestAnimationFrame',
|
|
195
|
+
},
|
|
196
|
+
};
|