@jjlmoya/utils-hardware 1.17.0 → 1.18.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.
Files changed (61) hide show
  1. package/package.json +1 -1
  2. package/src/category/i18n/de.ts +4 -4
  3. package/src/category/i18n/id.ts +3 -3
  4. package/src/category/i18n/it.ts +3 -3
  5. package/src/category/i18n/nl.ts +3 -3
  6. package/src/category/i18n/pl.ts +4 -4
  7. package/src/category/i18n/pt.ts +3 -3
  8. package/src/category/i18n/ru.ts +3 -3
  9. package/src/category/i18n/sv.ts +3 -3
  10. package/src/category/i18n/tr.ts +3 -3
  11. package/src/category/i18n/zh.ts +3 -3
  12. package/src/layouts/PreviewLayout.astro +1 -0
  13. package/src/tests/diacritics_density.test.ts +118 -0
  14. package/src/tests/inverted_punctuation.test.ts +84 -0
  15. package/src/tests/no_en_dash.test.ts +70 -0
  16. package/src/tests/script_density.test.ts +94 -0
  17. package/src/tool/batteryHealthEstimator/i18n/fr.ts +4 -4
  18. package/src/tool/batteryHealthEstimator/i18n/pl.ts +1 -1
  19. package/src/tool/colorAccuracyTest/color-accuracy-test.css +118 -5
  20. package/src/tool/colorAccuracyTest/i18n/de.ts +7 -7
  21. package/src/tool/colorAccuracyTest/i18n/en.ts +3 -3
  22. package/src/tool/colorAccuracyTest/i18n/es.ts +2 -2
  23. package/src/tool/colorAccuracyTest/i18n/fr.ts +9 -9
  24. package/src/tool/colorAccuracyTest/i18n/id.ts +3 -3
  25. package/src/tool/colorAccuracyTest/i18n/it.ts +3 -3
  26. package/src/tool/colorAccuracyTest/i18n/ja.ts +1 -1
  27. package/src/tool/colorAccuracyTest/i18n/ko.ts +2 -2
  28. package/src/tool/colorAccuracyTest/i18n/nl.ts +3 -3
  29. package/src/tool/colorAccuracyTest/i18n/pl.ts +5 -5
  30. package/src/tool/colorAccuracyTest/i18n/pt.ts +3 -3
  31. package/src/tool/colorAccuracyTest/i18n/ru.ts +15 -15
  32. package/src/tool/colorAccuracyTest/i18n/sv.ts +3 -3
  33. package/src/tool/colorAccuracyTest/i18n/tr.ts +2 -2
  34. package/src/tool/colorAccuracyTest/i18n/zh.ts +7 -7
  35. package/src/tool/deadPixelTest/i18n/ru.ts +6 -6
  36. package/src/tool/deadPixelTest/i18n/sv.ts +1 -1
  37. package/src/tool/deadPixelTest/i18n/zh.ts +5 -5
  38. package/src/tool/gamepadTest/gamepad-test.css +171 -3
  39. package/src/tool/gamepadTest/i18n/es.ts +4 -4
  40. package/src/tool/gamepadTest/i18n/ru.ts +1 -1
  41. package/src/tool/gamepadTest/i18n/zh.ts +1 -1
  42. package/src/tool/gamepadVibrationTester/i18n/es.ts +1 -1
  43. package/src/tool/gamepadVibrationTester/i18n/fr.ts +2 -2
  44. package/src/tool/keyboardTest/keyboard-test.css +115 -2
  45. package/src/tool/mousePollingTest/i18n/fr.ts +3 -3
  46. package/src/tool/mousePollingTest/i18n/pl.ts +1 -1
  47. package/src/tool/mousePollingTest/i18n/ru.ts +1 -1
  48. package/src/tool/mousePollingTest/i18n/zh.ts +1 -1
  49. package/src/tool/refreshRateDetector/i18n/de.ts +3 -3
  50. package/src/tool/refreshRateDetector/i18n/en.ts +3 -3
  51. package/src/tool/refreshRateDetector/i18n/fr.ts +4 -4
  52. package/src/tool/refreshRateDetector/i18n/id.ts +3 -3
  53. package/src/tool/refreshRateDetector/i18n/pl.ts +2 -2
  54. package/src/tool/refreshRateDetector/i18n/pt.ts +3 -3
  55. package/src/tool/refreshRateDetector/i18n/sv.ts +3 -3
  56. package/src/tool/refreshRateDetector/i18n/tr.ts +2 -2
  57. package/src/tool/refreshRateDetector/i18n/zh.ts +2 -2
  58. package/src/tool/toneGenerator/i18n/fr.ts +2 -2
  59. package/src/tool/toneGenerator/i18n/pl.ts +1 -1
  60. package/src/tool/toneGenerator/i18n/ru.ts +2 -2
  61. package/src/tool/toneGenerator/i18n/zh.ts +3 -3
@@ -20,7 +20,15 @@
20
20
  --tm-stick-border: #64748b;
21
21
 
22
22
  width: 100%;
23
+ max-width: 100%;
23
24
  color: var(--tm-text);
25
+ overflow-x: clip;
26
+ }
27
+
28
+ .tm-wrapper *,
29
+ .tm-wrapper *::before,
30
+ .tm-wrapper *::after {
31
+ box-sizing: border-box;
24
32
  }
25
33
 
26
34
  .theme-dark .tm-wrapper {
@@ -103,6 +111,8 @@ body.is-widget .tm-wrapper {
103
111
  padding: 2rem;
104
112
  box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
105
113
  border: 1px solid var(--tm-border);
114
+ max-width: 100%;
115
+ overflow: hidden;
106
116
  }
107
117
 
108
118
  .tm-card-header {
@@ -148,24 +158,28 @@ body.is-widget .tm-wrapper {
148
158
  flex-direction: column;
149
159
  align-items: center;
150
160
  gap: 1rem;
161
+ width: 100%;
162
+ overflow: hidden;
151
163
  }
152
164
 
153
165
  .tm-stage {
154
166
  position: relative;
155
167
  width: 600px;
156
168
  height: 420px;
169
+ flex: 0 0 600px;
170
+ transform-origin: top center;
157
171
  transition: all 500ms;
158
172
  }
159
173
 
160
174
  .tm-stage-inactive {
161
175
  opacity: 0.25;
162
176
  filter: grayscale(1);
163
- transform: scale(0.9);
177
+ transform: scale(var(--tm-stage-scale, 1));
164
178
  }
165
179
 
166
180
  @media (min-width: 640px) {
167
181
  .tm-stage-inactive {
168
- transform: scale(1);
182
+ transform: scale(var(--tm-stage-scale, 1));
169
183
  }
170
184
  }
171
185
 
@@ -460,6 +474,7 @@ body.is-widget .tm-wrapper {
460
474
  font-size: 0.75rem;
461
475
  color: var(--tm-text-muted);
462
476
  transition: opacity 500ms;
477
+ min-width: 0;
463
478
  }
464
479
 
465
480
  .tm-info-inactive { opacity: 0.5; }
@@ -468,6 +483,7 @@ body.is-widget .tm-wrapper {
468
483
  .tm-info-right {
469
484
  display: flex;
470
485
  gap: 1rem;
486
+ min-width: 0;
471
487
  }
472
488
 
473
489
  .tm-gp-id {
@@ -630,6 +646,7 @@ body.is-widget .tm-wrapper {
630
646
  justify-content: center;
631
647
  border: 1px solid rgba(255, 255, 255, 0.05);
632
648
  color: white;
649
+ max-width: 100%;
633
650
  }
634
651
 
635
652
  .tm-game-intro {
@@ -732,6 +749,7 @@ body.is-widget .tm-wrapper {
732
749
  align-items: center;
733
750
  width: 100%;
734
751
  margin-bottom: 3rem;
752
+ gap: 1rem;
735
753
  }
736
754
 
737
755
  .tm-hud-item {
@@ -783,6 +801,7 @@ body.is-widget .tm-wrapper {
783
801
  display: flex;
784
802
  align-items: center;
785
803
  justify-content: center;
804
+ max-width: 100%;
786
805
  }
787
806
 
788
807
  .tm-target-ring {
@@ -852,6 +871,8 @@ body.is-widget .tm-wrapper {
852
871
  background: rgba(255, 255, 255, 0.05);
853
872
  border-radius: 9999px;
854
873
  border: 1px solid rgba(255, 255, 255, 0.1);
874
+ max-width: 100%;
875
+ text-align: center;
855
876
  }
856
877
 
857
878
  .tm-instruction-dot {
@@ -922,6 +943,153 @@ body.is-widget .tm-wrapper {
922
943
  justify-content: center;
923
944
  }
924
945
 
946
+ @media (max-width: 700px) {
947
+ .tm-container {
948
+ padding: 0;
949
+ gap: 1.25rem;
950
+ }
951
+
952
+ .tm-card,
953
+ .tm-game-card {
954
+ border-radius: 0.875rem;
955
+ padding: 1rem;
956
+ }
957
+
958
+ .tm-card-header {
959
+ margin-bottom: 1.25rem;
960
+ }
961
+
962
+ .tm-title {
963
+ font-size: 1.5rem;
964
+ }
965
+
966
+ .tm-stage-wrapper {
967
+ --tm-stage-scale: 0.9;
968
+
969
+ min-height: calc(420px * var(--tm-stage-scale));
970
+ }
971
+
972
+ .tm-stage {
973
+ transform: scale(var(--tm-stage-scale));
974
+ margin-bottom: calc((420px * var(--tm-stage-scale)) - 420px);
975
+ }
976
+
977
+ .tm-info-bar {
978
+ flex-direction: column;
979
+ align-items: stretch;
980
+ gap: 0.5rem;
981
+ padding-top: 0.75rem;
982
+ }
983
+
984
+ .tm-info-left,
985
+ .tm-info-right {
986
+ justify-content: space-between;
987
+ gap: 0.5rem;
988
+ }
989
+
990
+ .tm-vibration-panel,
991
+ .tm-log-section {
992
+ margin-top: 1rem;
993
+ border-radius: 0.75rem;
994
+ padding: 0.875rem;
995
+ }
996
+
997
+ .tm-vibration-btns,
998
+ .tm-results-btns {
999
+ display: grid;
1000
+ grid-template-columns: 1fr;
1001
+ gap: 0.75rem;
1002
+ }
1003
+
1004
+ .tm-vib-btn,
1005
+ .tm-restart-btn,
1006
+ .tm-share-btn {
1007
+ width: 100%;
1008
+ }
1009
+
1010
+ .tm-game-card {
1011
+ min-height: 420px;
1012
+ }
1013
+
1014
+ .tm-game-icon {
1015
+ width: 4rem;
1016
+ height: 4rem;
1017
+ margin-bottom: 1rem;
1018
+ }
1019
+
1020
+ .tm-game-intro-title {
1021
+ font-size: 1.65rem;
1022
+ }
1023
+
1024
+ .tm-game-intro-desc {
1025
+ margin-bottom: 1.5rem;
1026
+ font-size: 0.95rem;
1027
+ }
1028
+
1029
+ .tm-game-start-btn {
1030
+ width: 100%;
1031
+ padding: 1rem;
1032
+ font-size: 1rem;
1033
+ }
1034
+
1035
+ .tm-game-hud {
1036
+ margin-bottom: 1.5rem;
1037
+ }
1038
+
1039
+ .tm-hud-label {
1040
+ font-size: 0.55rem;
1041
+ }
1042
+
1043
+ .tm-hud-value {
1044
+ font-size: 1.5rem;
1045
+ }
1046
+
1047
+ .tm-target-container {
1048
+ width: min(15rem, 78vw);
1049
+ height: min(15rem, 78vw);
1050
+ }
1051
+
1052
+ .tm-target-btn {
1053
+ width: min(8rem, 45vw);
1054
+ height: min(8rem, 45vw);
1055
+ font-size: 2.5rem;
1056
+ }
1057
+
1058
+ .tm-game-instruction {
1059
+ margin-top: 1.5rem;
1060
+ border-radius: 0.75rem;
1061
+ padding: 0.75rem 1rem;
1062
+ }
1063
+
1064
+ .tm-final-score {
1065
+ font-size: 4rem;
1066
+ }
1067
+ }
1068
+
1069
+ @media (max-width: 560px) {
1070
+ .tm-stage-wrapper {
1071
+ --tm-stage-scale: 0.82;
1072
+ }
1073
+ }
1074
+
1075
+ @media (max-width: 500px) {
1076
+ .tm-stage-wrapper {
1077
+ --tm-stage-scale: 0.72;
1078
+ }
1079
+ }
1080
+
1081
+ @media (max-width: 440px) {
1082
+ .tm-stage-wrapper {
1083
+ --tm-stage-scale: 0.62;
1084
+ }
1085
+ }
1086
+
1087
+ @media (max-width: 380px) {
1088
+ .tm-stage-wrapper {
1089
+ --tm-stage-scale: 0.54;
1090
+ }
1091
+ }
1092
+
925
1093
  @media (min-width: 640px) {
926
1094
  .tm-results-btns { flex-direction: row; }
927
1095
  }
@@ -964,4 +1132,4 @@ body.is-widget .tm-wrapper {
964
1132
 
965
1133
  @keyframes pulse {
966
1134
  50% { opacity: 0.5; }
967
- }
1135
+ }
@@ -158,16 +158,16 @@ export const content: ToolLocaleContent<TestMandoUI> = {
158
158
  gamePress: 'PULSA',
159
159
  rankLegendaryName: 'LEGENDARIO',
160
160
  rankLegendaryDesc: 'Tus dedos se mueven a la velocidad del sonido.',
161
- rankLegendaryFlavor: 'Mi mando vuela!',
161
+ rankLegendaryFlavor: '¡Mi mando vuela!',
162
162
  rankProName: 'PRO GAMER',
163
163
  rankProDesc: 'Tienes reflejos de acero y un mando bien calibrado.',
164
- rankProFlavor: 'Mi mando vuela!',
164
+ rankProFlavor: '¡Mi mando vuela!',
165
165
  rankGamerName: 'GAMER',
166
166
  rankGamerDesc: 'No está mal, pero para el competitivo te falta calle.',
167
- rankGamerFlavor: 'Casi lo tengo!',
167
+ rankGamerFlavor: '¡Casi lo tengo!',
168
168
  rankNoobName: 'MANCO',
169
169
  rankNoobDesc: '¿Seguro que tienes el mando encendido?',
170
- rankNoobFlavor: 'El mando me tiene manía!',
170
+ rankNoobFlavor: '¡El mando me tiene manía!',
171
171
  gameShareText: '¿Me superas?',
172
172
  gameShareScorePrefix: 'Hice',
173
173
  gameShareScoreSuffix: 'aciertos',
@@ -14,7 +14,7 @@ const faqData = [
14
14
  },
15
15
  {
16
16
  question: 'Как исправить дрифт программно?',
17
- answer: 'Если дрифт незначительный, вы можете настроить увеличенную «Мертвую зону» (Deadzone) в настройках игры. Это позволит игнорировать небольшие движения стика в центре.',
17
+ answer: 'Если дрифт незначительный, вы можете настроить увеличенную "Мертвую зону" (Deadzone) в настройках игры. Это позволит игнорировать небольшие движения стика в центре.',
18
18
  },
19
19
  {
20
20
  question: 'Совместим ли тест с контроллерами PS5, Xbox и Switch?',
@@ -14,7 +14,7 @@ const faqData = [
14
14
  },
15
15
  {
16
16
  question: '我可以通过软件修复漂移吗?',
17
- answer: '如果漂移较轻,您可以在游戏设置中配置更大的“死区 (Dead Zone)”。这将忽略中心位置的微小摇杆移动。',
17
+ answer: '如果漂移较轻,您可以在游戏设置中配置更大的"死区 (Dead Zone)"。这将忽略中心位置的微小摇杆移动。',
18
18
  },
19
19
  {
20
20
  question: '是否兼容 PS5、Xbox 和 Switch 控制器?',
@@ -133,7 +133,7 @@ export const content: ToolLocaleContent<ProbadorVibracionMandoUI> = {
133
133
  presetHeartbeatDesc: 'Palpitaciones sutiles consecutivas. Perfecto para ver retenciones inerciales.',
134
134
  presetSongTitle: 'Ritmo Moneda',
135
135
  presetSongDesc: 'Simula el ruido de monedas consecutivas. Corto y táctil.',
136
- presetRockYouTitle: 'Rock You!',
136
+ presetRockYouTitle: '¡Rock You!',
137
137
  presetRockYouDesc: "El clásico de Queen en tus manos: pum, pum, ¡clap!",
138
138
  presetEarthquakeTitle: '¡Terremoto Máximo!',
139
139
  presetEarthquakeDesc: 'Ambos motores al 100% de fuerza explosiva. MUY intenso.',
@@ -106,7 +106,7 @@ export const content: ToolLocaleContent<ProbadorVibracionMandoUI> = {
106
106
  { type: 'title', text: 'Architecture Dual-Rumble vs. Actionneurs Linéaires', level: 3 },
107
107
  {
108
108
  type: 'paragraph',
109
- html: "Les manettes classiques (Xbox, DualShock) utilisent deux micromoteurs asymétriques : le gauche génère des vibrations graves et profondes ; le droit produit des bourdonnements aigus et rapides. Les appareils avancés comme le DualSense utilisent des actionneurs linéaires qui simulent textures et résistance.",
109
+ html: "Les manettes classiques (Xbox, DualShock) utilisent deux micromoteurs asymétriques: le gauche génère des vibrations graves et profondes ; le droit produit des bourdonnements aigus et rapides. Les appareils avancés comme le DualSense utilisent des actionneurs linéaires qui simulent textures et résistance.",
110
110
  },
111
111
  ],
112
112
  ui: {
@@ -129,7 +129,7 @@ export const content: ToolLocaleContent<ProbadorVibracionMandoUI> = {
129
129
  presetSongTitle: 'Rythme Pièce',
130
130
  presetSongDesc: 'Simule le son de pièces collectées. Court et tactile.',
131
131
  presetRockYouTitle: 'Rock You!',
132
- presetRockYouDesc: "Le classique de Queen dans vos mains : boum, boum, clap !",
132
+ presetRockYouDesc: "Le classique de Queen dans vos mains: boum, boum, clap !",
133
133
  presetEarthquakeTitle: 'Tremblement Maximal !',
134
134
  presetEarthquakeDesc: 'Les deux moteurs à 100% de force explosive. TRÈS intense.',
135
135
  customStrongLabel: 'Force Grave (Gauche)',
@@ -16,7 +16,15 @@
16
16
  --tt-kb-bg: #e2e8f0;
17
17
 
18
18
  width: 100%;
19
+ max-width: 100%;
19
20
  color: var(--tt-text);
21
+ overflow-x: clip;
22
+ }
23
+
24
+ .tt-wrapper *,
25
+ .tt-wrapper *::before,
26
+ .tt-wrapper *::after {
27
+ box-sizing: border-box;
20
28
  }
21
29
 
22
30
  .theme-dark .tt-wrapper {
@@ -58,6 +66,8 @@ body.is-widget .tt-wrapper > div {
58
66
  padding: 2rem;
59
67
  box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
60
68
  border: 1px solid var(--tt-border);
69
+ max-width: 100%;
70
+ overflow: hidden;
61
71
  }
62
72
 
63
73
  .tt-header {
@@ -167,7 +177,7 @@ body.is-widget .tt-wrapper > div {
167
177
  .tt-keyboard-wrapper {
168
178
  position: relative;
169
179
  width: 100%;
170
- overflow-x: auto;
180
+ overflow: hidden;
171
181
  padding-bottom: 1rem;
172
182
  display: flex;
173
183
  justify-content: center;
@@ -181,7 +191,9 @@ body.is-widget .tt-wrapper > div {
181
191
  flex-direction: column;
182
192
  gap: 0.25rem;
183
193
  user-select: none;
194
+ width: 900px;
184
195
  min-width: 900px;
196
+ transform-origin: top center;
185
197
  }
186
198
 
187
199
  .tt-row {
@@ -323,4 +335,105 @@ body.is-widget .tt-wrapper > div {
323
335
  border-radius: 0.375rem;
324
336
  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
325
337
  flex-shrink: 0;
326
- }
338
+ }
339
+
340
+ @media (max-width: 760px) {
341
+ .tt-container {
342
+ padding: 0;
343
+ }
344
+
345
+ body.is-widget .tt-wrapper > div {
346
+ padding: 0;
347
+ }
348
+
349
+ .tt-card {
350
+ border-radius: 0.875rem;
351
+ padding: 1rem;
352
+ }
353
+
354
+ .tt-header {
355
+ margin-bottom: 1rem;
356
+ }
357
+
358
+ .tt-title {
359
+ font-size: 1.5rem;
360
+ }
361
+
362
+ .tt-description {
363
+ font-size: 0.875rem;
364
+ }
365
+
366
+ .tt-stats {
367
+ display: grid;
368
+ grid-template-columns: 1fr auto;
369
+ width: 100%;
370
+ gap: 0.75rem;
371
+ }
372
+
373
+ .tt-stat-box {
374
+ min-width: 0;
375
+ padding: 0.75rem;
376
+ border-radius: 0.75rem;
377
+ }
378
+
379
+ .tt-stat-label {
380
+ font-size: 0.65rem;
381
+ }
382
+
383
+ .tt-stat-value {
384
+ font-size: 1.75rem;
385
+ }
386
+
387
+ .tt-reset-btn {
388
+ width: 3.5rem;
389
+ min-height: 100%;
390
+ border-radius: 0.75rem;
391
+ }
392
+
393
+ .tt-keyboard-wrapper {
394
+ --tt-keyboard-scale: 0.82;
395
+
396
+ min-height: calc(20rem * var(--tt-keyboard-scale));
397
+ padding-bottom: 0;
398
+ align-items: flex-start;
399
+ }
400
+
401
+ .tt-keyboard {
402
+ transform: scale(var(--tt-keyboard-scale));
403
+ margin-bottom: calc((20rem * var(--tt-keyboard-scale)) - 20rem);
404
+ }
405
+
406
+ .tt-event-log {
407
+ height: 2.25rem;
408
+ }
409
+ }
410
+
411
+ @media (max-width: 680px) {
412
+ .tt-keyboard-wrapper {
413
+ --tt-keyboard-scale: 0.72;
414
+ }
415
+ }
416
+
417
+ @media (max-width: 600px) {
418
+ .tt-keyboard-wrapper {
419
+ --tt-keyboard-scale: 0.62;
420
+ }
421
+ }
422
+
423
+ @media (max-width: 520px) {
424
+ .tt-keyboard-wrapper {
425
+ --tt-keyboard-scale: 0.52;
426
+ }
427
+ }
428
+
429
+ @media (max-width: 440px) {
430
+ .tt-keyboard-wrapper {
431
+ --tt-keyboard-scale: 0.42;
432
+ }
433
+ }
434
+
435
+ @media (max-width: 360px) {
436
+ .tt-keyboard-wrapper {
437
+ --tt-keyboard-scale: 0.36;
438
+ }
439
+ }
@@ -101,17 +101,17 @@ export const content: ToolLocaleContent<TestRatonUI> = {
101
101
  { type: 'title', text: 'Niveaux de Taux de Sondage et Leurs Usages', level: 3 },
102
102
  {
103
103
  type: 'paragraph',
104
- html: "<strong>125 Hz</strong> -La souris communique toutes les 8 ms. Parfait pour un usage bureautique, mais saccadé sur un écran 144Hz. <strong>1000 Hz</strong> -L'étalon-or du gaming : communication toutes les 1 ms, mouvement fluide. <strong>8000 Hz</strong> -Technologie de pointe (Razer, Logitech), nécessite un processeur puissant.",
104
+ html: "<strong>125 Hz</strong> -La souris communique toutes les 8 ms. Parfait pour un usage bureautique, mais saccadé sur un écran 144Hz. <strong>1000 Hz</strong> -L'étalon-or du gaming: communication toutes les 1 ms, mouvement fluide. <strong>8000 Hz</strong> -Technologie de pointe (Razer, Logitech), nécessite un processeur puissant.",
105
105
  },
106
106
  { type: 'title', text: 'Pourquoi mes Hz fluctuent-ils ?', level: 3 },
107
107
  {
108
108
  type: 'paragraph',
109
109
  html: "Tout à fait normal. La plupart des souris modernes ont un taux de sondage dynamique pour économiser l'énergie. En déplaçant lentement la souris, elle envoie moins de rapports car il y a moins de nouvelles données. Seuls des mouvements rapides et continus poussent le capteur à son vrai pic maximum.",
110
110
  },
111
- { type: 'title', text: 'Taux de Sondage vs DPI : La Grande Confusion', level: 3 },
111
+ { type: 'title', text: 'Taux de Sondage vs DPI: La Grande Confusion', level: 3 },
112
112
  {
113
113
  type: 'paragraph',
114
- html: "<strong>DPI (Dots Per Inch)</strong> est la sensibilité : combien de pixels le curseur parcourt par pouce de déplacement physique. <strong>Hz (Taux de Sondage)</strong> est la fréquence de mise à jour : avec quelle fluidité et actualité ce mouvement est reporté. Les deux paramètres sont indépendants et complémentaires.",
114
+ html: "<strong>DPI (Dots Per Inch)</strong> est la sensibilité: combien de pixels le curseur parcourt par pouce de déplacement physique. <strong>Hz (Taux de Sondage)</strong> est la fréquence de mise à jour: avec quelle fluidité et actualité ce mouvement est reporté. Les deux paramètres sont indépendants et complémentaires.",
115
115
  },
116
116
  ],
117
117
  ui: {
@@ -96,7 +96,7 @@ export const content: ToolLocaleContent<TestRatonUI> = {
96
96
  { type: 'title', text: 'Definitywny Przewodnik po Polling Rate', level: 2 },
97
97
  {
98
98
  type: 'paragraph',
99
- html: 'Gdy fizycznie poruszasz myszką po podkładce, ten analogowy ruch musi zostać przetłumaczony na sygnały cyfrowe zrozumiałe dla komputera. <strong>Polling Rate</strong> to częstotliwość, z jaką mysz raportuje swoją pozycję do PC. Mierzy się ją w Hercach (Hz).',
99
+ html: 'Gdy fizycznie poruszasz myszką po podkładce, ten analogowy ruch musi zostać przetłumaczony na sygnały cyfrowe zrozumiałe dla komputera. <strong>Polling Rate</strong> to częstotliwość, z jaką mysz "raportuje" swoją pozycję do PC. Mierzy się ją w Hercach (Hz).',
100
100
  },
101
101
  { type: 'title', text: 'Poziomy Polling Rate i ich zastosowania', level: 3 },
102
102
  {
@@ -96,7 +96,7 @@ export const content: ToolLocaleContent<TestRatonUI> = {
96
96
  { type: 'title', text: 'Полное руководство по частоте опроса мыши', level: 2 },
97
97
  {
98
98
  type: 'paragraph',
99
- html: 'Когда вы физически перемещаете мышь по коврику, это аналоговое движение должно быть преобразовано в цифровые сигналы, которые понимает ваш компьютер. <strong>Polling Rate</strong> -это частота, с которой мышь «сообщает» свою позицию ПК. Она измеряется в Герцах (Гц).',
99
+ html: 'Когда вы физически перемещаете мышь по коврику, это аналоговое движение должно быть преобразовано в цифровые сигналы, которые понимает ваш компьютер. <strong>Polling Rate</strong> -это частота, с которой мышь "сообщает" свою позицию ПК. Она измеряется в Герцах (Гц).',
100
100
  },
101
101
  { type: 'title', text: 'Уровни частоты опроса и их использование', level: 3 },
102
102
  {
@@ -96,7 +96,7 @@ export const content: ToolLocaleContent<TestRatonUI> = {
96
96
  { type: 'title', text: '鼠标回报率权威指南', level: 2 },
97
97
  {
98
98
  type: 'paragraph',
99
- html: '当您在鼠标垫上物理移动鼠标时,这种模拟运动必须转换为电脑理解的数字信号。<strong>回报率 (Polling Rate)</strong> 是鼠标向电脑“报告”其位置的频率。它以赫兹 (Hz) 为单位。',
99
+ html: '当您在鼠标垫上物理移动鼠标时,这种模拟运动必须转换为电脑理解的数字信号。<strong>回报率 (Polling Rate)</strong> 是鼠标向电脑"报告"其位置的频率。它以赫兹 (Hz) 为单位。',
100
100
  },
101
101
  { type: 'title', text: '回报率等级及其用途', level: 3 },
102
102
  {
@@ -122,7 +122,7 @@ export const content: ToolLocaleContent<RefreshRateDetectorUI> = {
122
122
  {
123
123
  type: 'list',
124
124
  items: [
125
- 'Laden Sie diesen Detektor die Messung beginnt sofort',
125
+ 'Laden Sie diesen Detektor - die Messung beginnt sofort',
126
126
  'Wählen Sie zwischen dem schnellen (3s) oder dem stabilen (10s) Messmodus',
127
127
  'Lesen Sie die Hz-Zahl Ihres Monitors auf der Tachometerskala ab',
128
128
  'Vergleichen Sie sie mit Industriestandards (60, 75, 120, 144, 240, 360 Hz)',
@@ -152,7 +152,7 @@ export const content: ToolLocaleContent<RefreshRateDetectorUI> = {
152
152
  {
153
153
  type: 'list',
154
154
  items: [
155
- 'Prüfen Sie die HDMI/DisplayPort-Kabelverbindungen lose Kabel reduzieren die Bandbreite',
155
+ 'Prüfen Sie die HDMI/DisplayPort-Kabelverbindungen - lose Kabel reduzieren die Bandbreite',
156
156
  'Aktualisieren Sie Ihre GPU-Treiber (NVIDIA, AMD, Intel)',
157
157
  'Überprüfen Sie die Betriebssystem-Anzeigeeinstellungen, um sicherzustellen, dass eine hohe Bildwiederholfrequenz aktiviert ist',
158
158
  'Probieren Sie verschiedene Kabel oder Anschlüsse an Ihrem Monitor aus',
@@ -166,7 +166,7 @@ export const content: ToolLocaleContent<RefreshRateDetectorUI> = {
166
166
  },
167
167
  {
168
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.',
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
170
  },
171
171
  ],
172
172
  ui: {
@@ -122,7 +122,7 @@ export const content: ToolLocaleContent<RefreshRateDetectorUI> = {
122
122
  {
123
123
  type: 'list',
124
124
  items: [
125
- 'Load this detectormeasurement begins immediately',
125
+ 'Load this detector-measurement begins immediately',
126
126
  'Choose between Fast (3s) or Stable (10s) measurement mode',
127
127
  'Read your monitor\'s Hz from the speedometer dial',
128
128
  'Compare against industry standards (60, 75, 120, 144, 240, 360Hz)',
@@ -152,7 +152,7 @@ export const content: ToolLocaleContent<RefreshRateDetectorUI> = {
152
152
  {
153
153
  type: 'list',
154
154
  items: [
155
- 'Check HDMI/DisplayPort cable connectionsloose cables reduce bandwidth',
155
+ 'Check HDMI/DisplayPort cable connections-loose cables reduce bandwidth',
156
156
  'Update your GPU drivers (NVIDIA, AMD, Intel)',
157
157
  'Check OS display settings to ensure high refresh rate is enabled',
158
158
  'Try different cables or ports on your monitor',
@@ -166,7 +166,7 @@ export const content: ToolLocaleContent<RefreshRateDetectorUI> = {
166
166
  },
167
167
  {
168
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 precisionno special hardware needed.',
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
170
  },
171
171
  ],
172
172
  ui: {
@@ -22,7 +22,7 @@ const faqData = [
22
22
  },
23
23
  {
24
24
  question: 'Pourquoi mon Hz détecté est-il différent de ce qu\'indique mon moniteur ?',
25
- answer: 'Cela peut arriver si : votre connexion par câble est lâche, vos pilotes sont obsolètes ou la mise à l\'échelle de votre système d\'exploitation interfère. Essayez de débrancher et de rebrancher votre câble d\'affichage, ou de mettre à jour les pilotes de votre GPU.',
25
+ answer: 'Cela peut arriver si: votre connexion par câble est lâche, vos pilotes sont obsolètes ou la mise à l\'échelle de votre système d\'exploitation interfère. Essayez de débrancher et de rebrancher votre câble d\'affichage, ou de mettre à jour les pilotes de votre GPU.',
26
26
  },
27
27
  {
28
28
  question: 'Quels taux de rafraîchissement les moniteurs modernes prennent-ils en charge ?',
@@ -48,7 +48,7 @@ const howToData = [
48
48
  text: 'L\'outil affiche la norme correspondant à votre moniteur (60, 75, 120, 144, 240, 360Hz).',
49
49
  },
50
50
  {
51
- name: 'Optionnel : test de saut d\'images',
51
+ name: 'Optionnel: test de saut d\'images',
52
52
  text: 'Observez le carré animé traverser l\'écran pour confirmer visuellement la fluidité.',
53
53
  },
54
54
  ];
@@ -98,7 +98,7 @@ export const content: ToolLocaleContent<RefreshRateDetectorUI> = {
98
98
  seo: [
99
99
  {
100
100
  type: 'title',
101
- text: 'Détecteur de Taux de Rafraîchissement du Moniteur : Testez les Hz de votre Écran en Ligne',
101
+ text: 'Détecteur de Taux de Rafraîchissement du Moniteur: Testez les Hz de votre Écran en Ligne',
102
102
  level: 2,
103
103
  },
104
104
  {
@@ -146,7 +146,7 @@ export const content: ToolLocaleContent<RefreshRateDetectorUI> = {
146
146
  },
147
147
  {
148
148
  type: 'title',
149
- text: 'Dépannage : L\'Écran Affiche moins de Hz que Prévu',
149
+ text: 'Dépannage: L\'Écran Affiche moins de Hz que Prévu',
150
150
  level: 3,
151
151
  },
152
152
  {
@@ -122,7 +122,7 @@ export const content: ToolLocaleContent<RefreshRateDetectorUI> = {
122
122
  {
123
123
  type: 'list',
124
124
  items: [
125
- 'Buka detektor inipengukuran dimulai segera',
125
+ 'Buka detektor ini-pengukuran dimulai segera',
126
126
  'Pilih antara mode pengukuran Cepat (3 detik) atau Stabil (10 detik)',
127
127
  'Baca Hz monitor Anda dari dial speedometer',
128
128
  'Bandingkan dengan standar industri (60, 75, 120, 144, 240, 360Hz)',
@@ -152,7 +152,7 @@ export const content: ToolLocaleContent<RefreshRateDetectorUI> = {
152
152
  {
153
153
  type: 'list',
154
154
  items: [
155
- 'Periksa koneksi kabel HDMI/DisplayPortkabel longgar mengurangi bandwidth',
155
+ 'Periksa koneksi kabel HDMI/DisplayPort-kabel longgar mengurangi bandwidth',
156
156
  'Perbarui driver GPU Anda (NVIDIA, AMD, Intel)',
157
157
  'Periksa pengaturan layar OS untuk memastikan refresh rate tinggi telah diaktifkan',
158
158
  'Coba kabel atau port yang berbeda pada monitor Anda',
@@ -166,7 +166,7 @@ export const content: ToolLocaleContent<RefreshRateDetectorUI> = {
166
166
  },
167
167
  {
168
168
  type: 'paragraph',
169
- html: 'Alat ini menggunakan API requestAnimationFrame browser, yang sinkron langsung dengan siklus refresh monitor Anda. Dengan mengukur waktu antar frame animasi, kami menghitung refresh rate Anda yang tepat dengan presisi tinggitanpa perlu perangkat keras khusus.',
169
+ html: 'Alat ini menggunakan API requestAnimationFrame browser, yang sinkron langsung dengan siklus refresh monitor Anda. Dengan mengukur waktu antar frame animasi, kami menghitung refresh rate Anda yang tepat dengan presisi tinggi-tanpa perlu perangkat keras khusus.',
170
170
  },
171
171
  ],
172
172
  ui: {
@@ -122,7 +122,7 @@ export const content: ToolLocaleContent<RefreshRateDetectorUI> = {
122
122
  {
123
123
  type: 'list',
124
124
  items: [
125
- 'Uruchom detektor pomiar zaczyna się automatycznie',
125
+ 'Uruchom detektor - pomiar zaczyna się automatycznie',
126
126
  'Wybierz tryb Szybki (3s) lub Stabilny (10s)',
127
127
  'Odczytaj Hz z tarczy prędkościomierza',
128
128
  'Porównaj z normami branżowymi (60, 75, 120, 144, 240, 360Hz)',
@@ -152,7 +152,7 @@ export const content: ToolLocaleContent<RefreshRateDetectorUI> = {
152
152
  {
153
153
  type: 'list',
154
154
  items: [
155
- 'Sprawdź kabel HDMI/DisplayPort słabe połączenie ogranicza przepustowość',
155
+ 'Sprawdź kabel HDMI/DisplayPort - słabe połączenie ogranicza przepustowość',
156
156
  'Zaktualizuj sterowniki karty graficznej (NVIDIA, AMD, Intel)',
157
157
  'Sprawdź ustawienia ekranu w systemie, aby włączyć wysokie odświeżanie',
158
158
  'Wypróbuj inne kable lub porty w monitorze',