@jjlmoya/utils-hardware 1.1.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 +60 -0
- package/src/category/i18n/en.ts +107 -0
- package/src/category/i18n/es.ts +107 -0
- package/src/category/i18n/fr.ts +107 -0
- package/src/category/index.ts +18 -0
- package/src/category/seo.astro +15 -0
- package/src/components/PreviewNavSidebar.astro +116 -0
- package/src/components/PreviewToolbar.astro +143 -0
- package/src/data.ts +11 -0
- package/src/env.d.ts +5 -0
- package/src/index.ts +26 -0
- package/src/layouts/PreviewLayout.astro +117 -0
- package/src/pages/[locale]/[slug].astro +146 -0
- package/src/pages/[locale].astro +251 -0
- package/src/pages/index.astro +4 -0
- package/src/tests/faq_count.test.ts +19 -0
- package/src/tests/locale_completeness.test.ts +42 -0
- package/src/tests/mocks/astro_mock.js +2 -0
- package/src/tests/no_h1_in_components.test.ts +48 -0
- package/src/tests/schemas_fulfillment.test.ts +23 -0
- package/src/tests/seo_length.test.ts +23 -0
- package/src/tests/title_quality.test.ts +55 -0
- package/src/tests/tool_validation.test.ts +17 -0
- package/src/tool/batteryHealthEstimator/bibliography.astro +14 -0
- package/src/tool/batteryHealthEstimator/component.astro +606 -0
- package/src/tool/batteryHealthEstimator/i18n/en.ts +158 -0
- package/src/tool/batteryHealthEstimator/i18n/es.ts +158 -0
- package/src/tool/batteryHealthEstimator/i18n/fr.ts +158 -0
- package/src/tool/batteryHealthEstimator/index.ts +34 -0
- package/src/tool/batteryHealthEstimator/seo.astro +14 -0
- package/src/tool/batteryHealthEstimator/ui.ts +31 -0
- package/src/tool/deadPixelTest/bibliography.astro +31 -0
- package/src/tool/deadPixelTest/component.astro +717 -0
- package/src/tool/deadPixelTest/i18n/en.ts +218 -0
- package/src/tool/deadPixelTest/i18n/es.ts +218 -0
- package/src/tool/deadPixelTest/i18n/fr.ts +218 -0
- package/src/tool/deadPixelTest/index.ts +34 -0
- package/src/tool/deadPixelTest/seo.astro +14 -0
- package/src/tool/deadPixelTest/ui.ts +20 -0
- package/src/tool/gamepadTest/bibliography.astro +30 -0
- package/src/tool/gamepadTest/component.astro +1419 -0
- package/src/tool/gamepadTest/i18n/en.ts +186 -0
- package/src/tool/gamepadTest/i18n/es.ts +186 -0
- package/src/tool/gamepadTest/i18n/fr.ts +186 -0
- package/src/tool/gamepadTest/index.ts +34 -0
- package/src/tool/gamepadTest/seo.astro +14 -0
- package/src/tool/gamepadTest/ui.ts +57 -0
- package/src/tool/gamepadVibrationTester/bibliography.astro +14 -0
- package/src/tool/gamepadVibrationTester/component.astro +694 -0
- package/src/tool/gamepadVibrationTester/i18n/en.ts +155 -0
- package/src/tool/gamepadVibrationTester/i18n/es.ts +155 -0
- package/src/tool/gamepadVibrationTester/i18n/fr.ts +150 -0
- package/src/tool/gamepadVibrationTester/index.ts +34 -0
- package/src/tool/gamepadVibrationTester/seo.astro +14 -0
- package/src/tool/gamepadVibrationTester/ui.ts +28 -0
- package/src/tool/keyboardTest/bibliography.astro +30 -0
- package/src/tool/keyboardTest/component.astro +601 -0
- package/src/tool/keyboardTest/i18n/en.ts +146 -0
- package/src/tool/keyboardTest/i18n/es.ts +146 -0
- package/src/tool/keyboardTest/i18n/fr.ts +146 -0
- package/src/tool/keyboardTest/index.ts +34 -0
- package/src/tool/keyboardTest/seo.astro +14 -0
- package/src/tool/keyboardTest/ui.ts +8 -0
- package/src/tool/mousePollingTest/bibliography.astro +14 -0
- package/src/tool/mousePollingTest/component.astro +237 -0
- package/src/tool/mousePollingTest/i18n/en.ts +135 -0
- package/src/tool/mousePollingTest/i18n/es.ts +135 -0
- package/src/tool/mousePollingTest/i18n/fr.ts +135 -0
- package/src/tool/mousePollingTest/index.ts +34 -0
- package/src/tool/mousePollingTest/logic/MovingAverage.ts +20 -0
- package/src/tool/mousePollingTest/logic/RatonManager.ts +97 -0
- package/src/tool/mousePollingTest/logic/StatisticalFilter.ts +48 -0
- package/src/tool/mousePollingTest/seo.astro +14 -0
- package/src/tool/mousePollingTest/ui.ts +8 -0
- package/src/tool/mousePollingTest/worker/mouseWorker.ts +50 -0
- package/src/tool/toneGenerator/bibliography.astro +14 -0
- package/src/tool/toneGenerator/component.astro +571 -0
- package/src/tool/toneGenerator/i18n/en.ts +146 -0
- package/src/tool/toneGenerator/i18n/es.ts +146 -0
- package/src/tool/toneGenerator/i18n/fr.ts +146 -0
- package/src/tool/toneGenerator/index.ts +34 -0
- package/src/tool/toneGenerator/seo.astro +14 -0
- package/src/tool/toneGenerator/ui.ts +19 -0
- package/src/tools.ts +10 -0
- package/src/types.ts +72 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { TestMandoUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'gamepad-test';
|
|
6
|
+
const title = 'Online Gamepad & Controller Test';
|
|
7
|
+
const description = 'Test your Xbox, PlayStation or PC controller. Visualize dead zones, joystick drift and buttons.';
|
|
8
|
+
|
|
9
|
+
const faqData = [
|
|
10
|
+
{
|
|
11
|
+
question: 'What is Joystick Drift?',
|
|
12
|
+
answer: 'Drift occurs when the controller registers movement without touching the joystick. It is caused by wear on the internal potentiometers, which send a false electrical signal in a constant direction.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'How can I fix drift with software?',
|
|
16
|
+
answer: 'If the drift is mild, you can configure a larger "Dead Zone" (Deadzone) in your game settings. This ignores small joystick movements in the center.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'Is it compatible with PS5, Xbox and Switch controllers?',
|
|
20
|
+
answer: 'Yes. Our tool uses the standard Gamepad API from modern browsers, which detects almost any controller connected via USB or Bluetooth, including DualSense, DualShock 4 and Xbox Controllers.',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
question: 'Why doesn\'t the browser detect my controller?',
|
|
24
|
+
answer: 'For security, browsers only enable the gamepad after the first button press. If it doesn\'t appear, press any button (like A or X) and make sure you\'re not in strict incognito mode.',
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
const howToData = [
|
|
29
|
+
{
|
|
30
|
+
name: 'Connect the controller',
|
|
31
|
+
text: 'Plug your gamepad in via USB or pair it over Bluetooth with your computer.',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'Activate detection',
|
|
35
|
+
text: 'Move the joysticks or press any button so the browser recognizes the connected device.',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'Test dead zones',
|
|
39
|
+
text: 'Release the joysticks and observe the axes on screen. If the values are not at 0.0000, you have slight drift.',
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'Verify buttons and vibration',
|
|
43
|
+
text: 'Press each button and trigger. Visual indicators should light up and if your controller supports it, you can test the vibration motor.',
|
|
44
|
+
},
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
48
|
+
'@context': 'https://schema.org',
|
|
49
|
+
'@type': 'FAQPage',
|
|
50
|
+
mainEntity: faqData.map((item) => ({
|
|
51
|
+
'@type': 'Question',
|
|
52
|
+
name: item.question,
|
|
53
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
54
|
+
})),
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const howToSchema: WithContext<HowTo> = {
|
|
58
|
+
'@context': 'https://schema.org',
|
|
59
|
+
'@type': 'HowTo',
|
|
60
|
+
name: title,
|
|
61
|
+
description,
|
|
62
|
+
step: howToData.map((step, i) => ({
|
|
63
|
+
'@type': 'HowToStep',
|
|
64
|
+
position: i + 1,
|
|
65
|
+
name: step.name,
|
|
66
|
+
text: step.text,
|
|
67
|
+
})),
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
71
|
+
'@context': 'https://schema.org',
|
|
72
|
+
'@type': 'SoftwareApplication',
|
|
73
|
+
name: title,
|
|
74
|
+
description,
|
|
75
|
+
applicationCategory: 'UtilityApplication',
|
|
76
|
+
operatingSystem: 'All',
|
|
77
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
|
|
78
|
+
inLanguage: 'en',
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export const content: ToolLocaleContent<TestMandoUI> = {
|
|
82
|
+
slug,
|
|
83
|
+
title,
|
|
84
|
+
description,
|
|
85
|
+
faqTitle: 'Frequently Asked Questions',
|
|
86
|
+
faq: faqData,
|
|
87
|
+
bibliographyTitle: 'Technical References',
|
|
88
|
+
bibliography: [
|
|
89
|
+
{
|
|
90
|
+
name: 'Gamepad API Standard - W3C',
|
|
91
|
+
url: 'https://w3c.github.io/gamepad/',
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: 'Vibration API - MDN Web Docs',
|
|
95
|
+
url: 'https://developer.mozilla.org/en-US/docs/Web/API/Vibration_API',
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
howTo: howToData,
|
|
99
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
100
|
+
seo: [
|
|
101
|
+
{
|
|
102
|
+
type: 'title',
|
|
103
|
+
text: 'Online Gamepad Test: Detect Drift and Joystick Issues',
|
|
104
|
+
level: 2,
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
type: 'paragraph',
|
|
108
|
+
html: 'Free tool to test Xbox, PlayStation, Switch and other controllers. Visualize dead zones, detect drift and test vibration.',
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
type: 'title',
|
|
112
|
+
text: 'What is Joystick Drift',
|
|
113
|
+
level: 3,
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
type: 'paragraph',
|
|
117
|
+
html: 'Drift is a common defect in analog joysticks where the stick registers movement without being touched. It is caused by wear on the internal potentiometers.',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
type: 'title',
|
|
121
|
+
text: 'Controller Compatibility',
|
|
122
|
+
level: 3,
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
type: 'paragraph',
|
|
126
|
+
html: 'Compatible with Xbox One, Xbox Series X/S, PlayStation 4, PlayStation 5 (DualSense), Nintendo Switch Pro and virtually any modern USB or Bluetooth gamepad.',
|
|
127
|
+
},
|
|
128
|
+
],
|
|
129
|
+
ui: {
|
|
130
|
+
badge: 'Input Test',
|
|
131
|
+
title: 'Gamepad and Controller Test',
|
|
132
|
+
description: 'Test your controller and detect issues.',
|
|
133
|
+
connectionMessage: 'Connect your USB or Bluetooth device',
|
|
134
|
+
connectionStatus: 'Connected',
|
|
135
|
+
axisLabel: 'Axes',
|
|
136
|
+
buttonsLabel: 'Buttons',
|
|
137
|
+
vibrationTitle: 'Vibration Test',
|
|
138
|
+
vibrationDescription: 'Requires browser support and compatible gamepad.',
|
|
139
|
+
vibrationLow: 'Low (Rumble)',
|
|
140
|
+
vibrationHigh: 'High (Buzz)',
|
|
141
|
+
eventHistoryTitle: 'Event History',
|
|
142
|
+
eventHistoryClear: 'Clear',
|
|
143
|
+
eventWaiting: 'Waiting for events...',
|
|
144
|
+
gameStartBtn: 'START CHALLENGE',
|
|
145
|
+
gameControllerWarning: 'Connect a gamepad or use keyboard',
|
|
146
|
+
gameTimer: 'Timer',
|
|
147
|
+
gameScore: 'Score',
|
|
148
|
+
gameInstruction: 'Press fast',
|
|
149
|
+
gameCompleted: 'Challenge Completed',
|
|
150
|
+
gameNewRecord: 'NEW RECORD',
|
|
151
|
+
gameRestartBtn: 'Retry',
|
|
152
|
+
gameFeedback: 'You are a button legend',
|
|
153
|
+
gameIntroTitlePre: 'Pro Gamer ',
|
|
154
|
+
gameIntroHighlight: 'Reflexes',
|
|
155
|
+
gameIntroTitlePost: '?',
|
|
156
|
+
gameIntroDescPre: 'Test your controller latency and reaction speed. You have ',
|
|
157
|
+
gameIntroDescSeconds: '30 seconds',
|
|
158
|
+
gameIntroDescPost: ' to master the buttons.',
|
|
159
|
+
gameShareBtn: 'SHARE RANK',
|
|
160
|
+
gameLogConnected: 'Connected',
|
|
161
|
+
gameLogDisconnected: 'Disconnected',
|
|
162
|
+
gameLogCleared: 'Log cleared...',
|
|
163
|
+
gameLogBtnPrefix: 'Button',
|
|
164
|
+
gameVibNotSupported: 'Vibration not supported.',
|
|
165
|
+
gameVibLow: 'Low',
|
|
166
|
+
gameVibHigh: 'High',
|
|
167
|
+
gameMoveStick: 'MOVE STICK',
|
|
168
|
+
gamePress: 'PRESS',
|
|
169
|
+
rankLegendaryName: 'LEGENDARY',
|
|
170
|
+
rankLegendaryDesc: 'Your fingers move at the speed of sound.',
|
|
171
|
+
rankLegendaryFlavor: 'My controller is flying!',
|
|
172
|
+
rankProName: 'PRO GAMER',
|
|
173
|
+
rankProDesc: 'You have steel reflexes and a well-calibrated controller.',
|
|
174
|
+
rankProFlavor: 'My controller is flying!',
|
|
175
|
+
rankGamerName: 'GAMER',
|
|
176
|
+
rankGamerDesc: 'Not bad, but you need more practice for competitive play.',
|
|
177
|
+
rankGamerFlavor: 'Almost got it!',
|
|
178
|
+
rankNoobName: 'NOOB',
|
|
179
|
+
rankNoobDesc: 'Are you sure you have the controller turned on?',
|
|
180
|
+
rankNoobFlavor: 'The controller has it in for me!',
|
|
181
|
+
gameShareText: 'Can you beat me?',
|
|
182
|
+
gameShareScorePrefix: 'I got',
|
|
183
|
+
gameShareScoreSuffix: 'hits',
|
|
184
|
+
gameShareTitle: 'Online Gamepad Test',
|
|
185
|
+
},
|
|
186
|
+
};
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { TestMandoUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'test-mando';
|
|
6
|
+
const title = 'Test de Mando y Gamepad Online';
|
|
7
|
+
const description = 'Prueba tu controlador de Xbox, PlayStation o PC. Visualiza zonas muertas, drift de joysticks y botones.';
|
|
8
|
+
|
|
9
|
+
const faqData = [
|
|
10
|
+
{
|
|
11
|
+
question: '¿Qué es el Drift en los joysticks?',
|
|
12
|
+
answer: 'El drift ocurre cuando el mando registra movimiento sin que estés tocando el joystick. Se debe al desgaste de los potenciómetros internos, que envían una señal eléctrica falsa hacia una dirección constante.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: '¿Cómo puedo arreglar el drift por software?',
|
|
16
|
+
answer: 'Si el drift es leve, puedes configurar una "Zona Muerta" (Deadzone) mayor en los ajustes de tus juegos. Esto ignora los movimientos pequeños del joystick en el centro.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: '¿Es compatible con mandos de PS5, Xbox y Switch?',
|
|
20
|
+
answer: 'Sí. Nuestra herramienta utiliza la Gamepad API estándar de los navegadores modernos, lo que permite detectar casi cualquier mando conectado por USB o Bluetooth, incluidos DualSense, DualShock 4 y Xbox Controllers.',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
question: '¿Por qué el navegador no detecta mi mando?',
|
|
24
|
+
answer: 'Por seguridad, los navegadores solo activan el mando tras la primera pulsación de un botón. Si no aparece, pulsa cualquier botón (como el botón A o X) y asegúrate de no estar en modo incógnito estricto.',
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
const howToData = [
|
|
29
|
+
{
|
|
30
|
+
name: 'Conectar el controlador',
|
|
31
|
+
text: 'Enchufa tu mando por USB o emparéjalo por Bluetooth con tu ordenador.',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'Activar la detección',
|
|
35
|
+
text: 'Mueve los joysticks o pulsa cualquier botón para que el navegador reconozca el dispositivo conectado.',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'Test de zonas muertas',
|
|
39
|
+
text: 'Suelta los joysticks y observa los ejes en pantalla (Axis). Si los valores no están en 0.0000, tienes un ligero drift.',
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'Verificar botones y vibración',
|
|
43
|
+
text: 'Presiona cada botón y gatillo. Los indicadores visuales deben encenderse y, si tu mando lo soporta, puedes probar el motor de vibración.',
|
|
44
|
+
},
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
48
|
+
'@context': 'https://schema.org',
|
|
49
|
+
'@type': 'FAQPage',
|
|
50
|
+
mainEntity: faqData.map((item) => ({
|
|
51
|
+
'@type': 'Question',
|
|
52
|
+
name: item.question,
|
|
53
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
54
|
+
})),
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const howToSchema: WithContext<HowTo> = {
|
|
58
|
+
'@context': 'https://schema.org',
|
|
59
|
+
'@type': 'HowTo',
|
|
60
|
+
name: title,
|
|
61
|
+
description,
|
|
62
|
+
step: howToData.map((step, i) => ({
|
|
63
|
+
'@type': 'HowToStep',
|
|
64
|
+
position: i + 1,
|
|
65
|
+
name: step.name,
|
|
66
|
+
text: step.text,
|
|
67
|
+
})),
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
71
|
+
'@context': 'https://schema.org',
|
|
72
|
+
'@type': 'SoftwareApplication',
|
|
73
|
+
name: title,
|
|
74
|
+
description,
|
|
75
|
+
applicationCategory: 'UtilityApplication',
|
|
76
|
+
operatingSystem: 'All',
|
|
77
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
78
|
+
inLanguage: 'es',
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export const content: ToolLocaleContent<TestMandoUI> = {
|
|
82
|
+
slug,
|
|
83
|
+
title,
|
|
84
|
+
description,
|
|
85
|
+
faqTitle: 'Preguntas Frecuentes',
|
|
86
|
+
faq: faqData,
|
|
87
|
+
bibliographyTitle: 'Referencias Técnicas',
|
|
88
|
+
bibliography: [
|
|
89
|
+
{
|
|
90
|
+
name: 'Gamepad API Standard - W3C',
|
|
91
|
+
url: 'https://w3c.github.io/gamepad/',
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: 'Vibration API - MDN Web Docs',
|
|
95
|
+
url: 'https://developer.mozilla.org/en-US/docs/Web/API/Vibration_API',
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
howTo: howToData,
|
|
99
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
100
|
+
seo: [
|
|
101
|
+
{
|
|
102
|
+
type: 'title',
|
|
103
|
+
text: 'Test de Mando Online: Detecta Drift y Problemas de Joystick',
|
|
104
|
+
level: 2,
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
type: 'paragraph',
|
|
108
|
+
html: 'Herramienta gratuita para probar mandos de Xbox, PlayStation, Switch y otros controladores. Visualiza zonas muertas, detecta drift y prueba vibración.',
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
type: 'title',
|
|
112
|
+
text: 'Qué es el Drift en Joysticks',
|
|
113
|
+
level: 3,
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
type: 'paragraph',
|
|
117
|
+
html: 'El drift es un defecto común en los joysticks analógicos donde el stick registra movimiento sin que lo toques. Es causado por el desgaste de los potenciómetros internos.',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
type: 'title',
|
|
121
|
+
text: 'Compatibilidad con Mandos',
|
|
122
|
+
level: 3,
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
type: 'paragraph',
|
|
126
|
+
html: 'Compatible con Xbox One, Xbox Series X/S, PlayStation 4, PlayStation 5 (DualSense), Nintendo Switch Pro y prácticamente cualquier mando USB o Bluetooth moderno.',
|
|
127
|
+
},
|
|
128
|
+
],
|
|
129
|
+
ui: {
|
|
130
|
+
badge: 'Test de Entrada',
|
|
131
|
+
title: 'Test de Mando y Gamepad',
|
|
132
|
+
description: 'Prueba tu controlador y detecta problemas.',
|
|
133
|
+
connectionMessage: 'Conecta tu dispositivo USB o Bluetooth',
|
|
134
|
+
connectionStatus: 'Conectado',
|
|
135
|
+
axisLabel: 'Ejes',
|
|
136
|
+
buttonsLabel: 'Botones',
|
|
137
|
+
vibrationTitle: 'Test de Vibración',
|
|
138
|
+
vibrationDescription: 'Requiere soporte del navegador y mando compatible.',
|
|
139
|
+
vibrationLow: 'Grave (Rumble)',
|
|
140
|
+
vibrationHigh: 'Agudo (Buzz)',
|
|
141
|
+
eventHistoryTitle: 'Historial de Eventos',
|
|
142
|
+
eventHistoryClear: 'Limpiar',
|
|
143
|
+
eventWaiting: 'Esperando eventos...',
|
|
144
|
+
gameStartBtn: 'EMPEZAR DESAFÍO',
|
|
145
|
+
gameControllerWarning: 'Conecta un mando o usa el teclado',
|
|
146
|
+
gameTimer: 'Cronómetro',
|
|
147
|
+
gameScore: 'Puntuación',
|
|
148
|
+
gameInstruction: 'Pulsa rápido',
|
|
149
|
+
gameCompleted: 'Desafío Completado',
|
|
150
|
+
gameNewRecord: 'NUEVO RÉCORD',
|
|
151
|
+
gameRestartBtn: 'Reintentar',
|
|
152
|
+
gameFeedback: 'Eres una leyenda de los botones',
|
|
153
|
+
gameIntroTitlePre: '¿Reflejos ',
|
|
154
|
+
gameIntroHighlight: 'Pro Gamer',
|
|
155
|
+
gameIntroTitlePost: '?',
|
|
156
|
+
gameIntroDescPre: 'Pon a prueba la latencia de tu mando y tu velocidad de reacción. Tienes ',
|
|
157
|
+
gameIntroDescSeconds: '30 segundos',
|
|
158
|
+
gameIntroDescPost: ' para dominar los botones.',
|
|
159
|
+
gameShareBtn: 'COMPARTIR RANGO',
|
|
160
|
+
gameLogConnected: 'Conectado',
|
|
161
|
+
gameLogDisconnected: 'Desconectado',
|
|
162
|
+
gameLogCleared: 'Log limpiado...',
|
|
163
|
+
gameLogBtnPrefix: 'Botón',
|
|
164
|
+
gameVibNotSupported: 'Vibración no soportada.',
|
|
165
|
+
gameVibLow: 'Grave',
|
|
166
|
+
gameVibHigh: 'Agudo',
|
|
167
|
+
gameMoveStick: 'MOVER STICK',
|
|
168
|
+
gamePress: 'PULSA',
|
|
169
|
+
rankLegendaryName: 'LEGENDARIO',
|
|
170
|
+
rankLegendaryDesc: 'Tus dedos se mueven a la velocidad del sonido.',
|
|
171
|
+
rankLegendaryFlavor: 'Mi mando vuela!',
|
|
172
|
+
rankProName: 'PRO GAMER',
|
|
173
|
+
rankProDesc: 'Tienes reflejos de acero y un mando bien calibrado.',
|
|
174
|
+
rankProFlavor: 'Mi mando vuela!',
|
|
175
|
+
rankGamerName: 'GAMER',
|
|
176
|
+
rankGamerDesc: 'No está mal, pero para el competitivo te falta calle.',
|
|
177
|
+
rankGamerFlavor: 'Casi lo tengo!',
|
|
178
|
+
rankNoobName: 'MANCO',
|
|
179
|
+
rankNoobDesc: '¿Seguro que tienes el mando encendido?',
|
|
180
|
+
rankNoobFlavor: 'El mando me tiene manía!',
|
|
181
|
+
gameShareText: '¿Me superas?',
|
|
182
|
+
gameShareScorePrefix: 'Hice',
|
|
183
|
+
gameShareScoreSuffix: 'aciertos',
|
|
184
|
+
gameShareTitle: 'Test de Mando Online',
|
|
185
|
+
},
|
|
186
|
+
};
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { TestMandoUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'test-manette';
|
|
6
|
+
const title = 'Test de Manette et Contrôleur En Ligne';
|
|
7
|
+
const description = 'Testez votre contrôleur Xbox, PlayStation ou PC. Visualisez les zones mortes, la dérive du joystick et les boutons.';
|
|
8
|
+
|
|
9
|
+
const faqData = [
|
|
10
|
+
{
|
|
11
|
+
question: 'Qu\'est-ce que la dérive du joystick?',
|
|
12
|
+
answer: 'La dérive se produit lorsque la manette enregistre un mouvement sans toucher le joystick. Elle est causée par l\'usure des potentiomètres internes, qui envoient un faux signal électrique dans une direction constante.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'Comment puis-je corriger la dérive par logiciel?',
|
|
16
|
+
answer: 'Si la dérive est légère, vous pouvez configurer une "zone morte" (Deadzone) plus grande dans les paramètres de votre jeu. Cela ignore les petits mouvements du joystick au centre.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'Est-ce compatible avec les contrôleurs PS5, Xbox et Switch?',
|
|
20
|
+
answer: 'Oui. Notre outil utilise l\'API Gamepad standard des navigateurs modernes, qui détecte presque n\'importe quelle manette connectée par USB ou Bluetooth, y compris DualSense, DualShock 4 et les contrôleurs Xbox.',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
question: 'Pourquoi le navigateur ne détecte-t-il pas ma manette?',
|
|
24
|
+
answer: 'Pour des raisons de sécurité, les navigateurs ne activent la manette qu\'après la première pression d\'un bouton. Si elle n\'apparaît pas, appuyez sur n\'importe quel bouton (comme A ou X) et assurez-vous de ne pas être en mode incognito strict.',
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
const howToData = [
|
|
29
|
+
{
|
|
30
|
+
name: 'Connecter la manette',
|
|
31
|
+
text: 'Branchez votre manette en USB ou appairez-la par Bluetooth avec votre ordinateur.',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'Activer la détection',
|
|
35
|
+
text: 'Déplacez les joysticks ou appuyez sur n\'importe quel bouton pour que le navigateur reconnaisse l\'appareil connecté.',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'Test des zones mortes',
|
|
39
|
+
text: 'Relâchez les joysticks et observez les axes à l\'écran. Si les valeurs ne sont pas à 0,0000, vous avez une légère dérive.',
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'Vérifier les boutons et la vibration',
|
|
43
|
+
text: 'Appuyez sur chaque bouton et gâchette. Les indicateurs visuels doivent s\'allumer et si votre manette le supporte, vous pouvez tester le moteur de vibration.',
|
|
44
|
+
},
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
48
|
+
'@context': 'https://schema.org',
|
|
49
|
+
'@type': 'FAQPage',
|
|
50
|
+
mainEntity: faqData.map((item) => ({
|
|
51
|
+
'@type': 'Question',
|
|
52
|
+
name: item.question,
|
|
53
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
54
|
+
})),
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const howToSchema: WithContext<HowTo> = {
|
|
58
|
+
'@context': 'https://schema.org',
|
|
59
|
+
'@type': 'HowTo',
|
|
60
|
+
name: title,
|
|
61
|
+
description,
|
|
62
|
+
step: howToData.map((step, i) => ({
|
|
63
|
+
'@type': 'HowToStep',
|
|
64
|
+
position: i + 1,
|
|
65
|
+
name: step.name,
|
|
66
|
+
text: step.text,
|
|
67
|
+
})),
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
71
|
+
'@context': 'https://schema.org',
|
|
72
|
+
'@type': 'SoftwareApplication',
|
|
73
|
+
name: title,
|
|
74
|
+
description,
|
|
75
|
+
applicationCategory: 'UtilityApplication',
|
|
76
|
+
operatingSystem: 'All',
|
|
77
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
78
|
+
inLanguage: 'fr',
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export const content: ToolLocaleContent<TestMandoUI> = {
|
|
82
|
+
slug,
|
|
83
|
+
title,
|
|
84
|
+
description,
|
|
85
|
+
faqTitle: 'Questions Fréquemment Posées',
|
|
86
|
+
faq: faqData,
|
|
87
|
+
bibliographyTitle: 'Références Techniques',
|
|
88
|
+
bibliography: [
|
|
89
|
+
{
|
|
90
|
+
name: 'Gamepad API Standard - W3C',
|
|
91
|
+
url: 'https://w3c.github.io/gamepad/',
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: 'Vibration API - MDN Web Docs',
|
|
95
|
+
url: 'https://developer.mozilla.org/en-US/docs/Web/API/Vibration_API',
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
howTo: howToData,
|
|
99
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
100
|
+
seo: [
|
|
101
|
+
{
|
|
102
|
+
type: 'title',
|
|
103
|
+
text: 'Test de Manette En Ligne: Détectez la Dérive et les Problèmes de Joystick',
|
|
104
|
+
level: 2,
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
type: 'paragraph',
|
|
108
|
+
html: 'Outil gratuit pour tester les manettes Xbox, PlayStation, Switch et autres contrôleurs. Visualisez les zones mortes, détectez la dérive et testez la vibration.',
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
type: 'title',
|
|
112
|
+
text: 'Qu\'est-ce que la Dérive du Joystick',
|
|
113
|
+
level: 3,
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
type: 'paragraph',
|
|
117
|
+
html: 'La dérive est un défaut courant des joysticks analogiques où le stick enregistre un mouvement sans être touché. Elle est causée par l\'usure des potentiomètres internes.',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
type: 'title',
|
|
121
|
+
text: 'Compatibilité des Manettes',
|
|
122
|
+
level: 3,
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
type: 'paragraph',
|
|
126
|
+
html: 'Compatible avec Xbox One, Xbox Series X/S, PlayStation 4, PlayStation 5 (DualSense), Nintendo Switch Pro et pratiquement n\'importe quelle manette USB ou Bluetooth moderne.',
|
|
127
|
+
},
|
|
128
|
+
],
|
|
129
|
+
ui: {
|
|
130
|
+
badge: 'Test d\'Entrée',
|
|
131
|
+
title: 'Test de Manette et de Contrôleur',
|
|
132
|
+
description: 'Testez votre manette et détectez les problèmes.',
|
|
133
|
+
connectionMessage: 'Connectez votre appareil USB ou Bluetooth',
|
|
134
|
+
connectionStatus: 'Connecté',
|
|
135
|
+
axisLabel: 'Axes',
|
|
136
|
+
buttonsLabel: 'Boutons',
|
|
137
|
+
vibrationTitle: 'Test de Vibration',
|
|
138
|
+
vibrationDescription: 'Nécessite le support du navigateur et une manette compatible.',
|
|
139
|
+
vibrationLow: 'Grave (Rumble)',
|
|
140
|
+
vibrationHigh: 'Aigu (Buzz)',
|
|
141
|
+
eventHistoryTitle: 'Historique des Événements',
|
|
142
|
+
eventHistoryClear: 'Effacer',
|
|
143
|
+
eventWaiting: 'En attente d\'événements...',
|
|
144
|
+
gameStartBtn: 'COMMENCER LE DÉFI',
|
|
145
|
+
gameControllerWarning: 'Connectez une manette ou utilisez le clavier',
|
|
146
|
+
gameTimer: 'Chronomètre',
|
|
147
|
+
gameScore: 'Score',
|
|
148
|
+
gameInstruction: 'Appuyez vite',
|
|
149
|
+
gameCompleted: 'Défi Terminé',
|
|
150
|
+
gameNewRecord: 'NOUVEAU RECORD',
|
|
151
|
+
gameRestartBtn: 'Réessayer',
|
|
152
|
+
gameFeedback: 'Vous êtes une légende des boutons',
|
|
153
|
+
gameIntroTitlePre: 'Réflexes ',
|
|
154
|
+
gameIntroHighlight: 'Pro Gamer',
|
|
155
|
+
gameIntroTitlePost: '?',
|
|
156
|
+
gameIntroDescPre: 'Testez la latence de votre manette et votre vitesse de réaction. Vous avez ',
|
|
157
|
+
gameIntroDescSeconds: '30 secondes',
|
|
158
|
+
gameIntroDescPost: ' pour maîtriser les boutons.',
|
|
159
|
+
gameShareBtn: 'PARTAGER RANG',
|
|
160
|
+
gameLogConnected: 'Connecté',
|
|
161
|
+
gameLogDisconnected: 'Déconnecté',
|
|
162
|
+
gameLogCleared: 'Journal effacé...',
|
|
163
|
+
gameLogBtnPrefix: 'Bouton',
|
|
164
|
+
gameVibNotSupported: 'Vibration non supportée.',
|
|
165
|
+
gameVibLow: 'Grave',
|
|
166
|
+
gameVibHigh: 'Aigu',
|
|
167
|
+
gameMoveStick: 'BOUGER STICK',
|
|
168
|
+
gamePress: 'APPUYER',
|
|
169
|
+
rankLegendaryName: 'LÉGENDAIRE',
|
|
170
|
+
rankLegendaryDesc: 'Vos doigts bougent à la vitesse du son.',
|
|
171
|
+
rankLegendaryFlavor: "Ma manette s'envole !",
|
|
172
|
+
rankProName: 'PRO GAMER',
|
|
173
|
+
rankProDesc: "Tu as des réflexes d'acier et une manette bien calibrée.",
|
|
174
|
+
rankProFlavor: "Ma manette s'envole !",
|
|
175
|
+
rankGamerName: 'GAMER',
|
|
176
|
+
rankGamerDesc: "Pas mal, mais pour le compétitif, il te manque de l'entraînement.",
|
|
177
|
+
rankGamerFlavor: "J'y suis presque !",
|
|
178
|
+
rankNoobName: 'MANCHOT',
|
|
179
|
+
rankNoobDesc: 'Tu es sûr que ta manette est allumée ?',
|
|
180
|
+
rankNoobFlavor: "La manette m'en veut !",
|
|
181
|
+
gameShareText: 'Tu me bats ?',
|
|
182
|
+
gameShareScorePrefix: "J'ai fait",
|
|
183
|
+
gameShareScoreSuffix: 'points',
|
|
184
|
+
gameShareTitle: 'Test de Manette En Ligne',
|
|
185
|
+
},
|
|
186
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { HardwareToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
|
|
2
|
+
|
|
3
|
+
import TestMandoComponent from './component.astro';
|
|
4
|
+
import TestMandoSEO from './seo.astro';
|
|
5
|
+
import TestMandoBibliography from './bibliography.astro';
|
|
6
|
+
|
|
7
|
+
import type { TestMandoUI } from './ui';
|
|
8
|
+
export type TestMandoLocaleContent = ToolLocaleContent<TestMandoUI>;
|
|
9
|
+
|
|
10
|
+
import { content as es } from './i18n/es';
|
|
11
|
+
import { content as en } from './i18n/en';
|
|
12
|
+
import { content as fr } from './i18n/fr';
|
|
13
|
+
|
|
14
|
+
export const testMando: HardwareToolEntry<TestMandoUI> = {
|
|
15
|
+
id: 'test-mando',
|
|
16
|
+
icons: {
|
|
17
|
+
bg: 'mdi:gamepad-variant',
|
|
18
|
+
fg: 'mdi:gamepad-circle',
|
|
19
|
+
},
|
|
20
|
+
i18n: {
|
|
21
|
+
es: async () => es,
|
|
22
|
+
en: async () => en,
|
|
23
|
+
fr: async () => fr,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export { TestMandoComponent, TestMandoSEO, TestMandoBibliography };
|
|
28
|
+
|
|
29
|
+
export const TEST_MANDO_TOOL: ToolDefinition = {
|
|
30
|
+
entry: testMando,
|
|
31
|
+
Component: TestMandoComponent,
|
|
32
|
+
SEOComponent: TestMandoSEO,
|
|
33
|
+
BibliographyComponent: TestMandoBibliography,
|
|
34
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import type { KnownLocale } from '../../types';
|
|
4
|
+
import { testMando } from './index';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await testMando.i18n[locale]?.();
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
{content && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export interface TestMandoUI extends Record<string, string> {
|
|
2
|
+
badge: string;
|
|
3
|
+
title: string;
|
|
4
|
+
description: string;
|
|
5
|
+
connectionMessage: string;
|
|
6
|
+
connectionStatus: string;
|
|
7
|
+
axisLabel: string;
|
|
8
|
+
buttonsLabel: string;
|
|
9
|
+
vibrationTitle: string;
|
|
10
|
+
vibrationDescription: string;
|
|
11
|
+
vibrationLow: string;
|
|
12
|
+
vibrationHigh: string;
|
|
13
|
+
eventHistoryTitle: string;
|
|
14
|
+
eventHistoryClear: string;
|
|
15
|
+
eventWaiting: string;
|
|
16
|
+
gameStartBtn: string;
|
|
17
|
+
gameControllerWarning: string;
|
|
18
|
+
gameTimer: string;
|
|
19
|
+
gameScore: string;
|
|
20
|
+
gameInstruction: string;
|
|
21
|
+
gameCompleted: string;
|
|
22
|
+
gameNewRecord: string;
|
|
23
|
+
gameRestartBtn: string;
|
|
24
|
+
gameFeedback: string;
|
|
25
|
+
gameIntroTitlePre: string;
|
|
26
|
+
gameIntroHighlight: string;
|
|
27
|
+
gameIntroTitlePost: string;
|
|
28
|
+
gameIntroDescPre: string;
|
|
29
|
+
gameIntroDescSeconds: string;
|
|
30
|
+
gameIntroDescPost: string;
|
|
31
|
+
gameShareBtn: string;
|
|
32
|
+
gameLogConnected: string;
|
|
33
|
+
gameLogDisconnected: string;
|
|
34
|
+
gameLogCleared: string;
|
|
35
|
+
gameLogBtnPrefix: string;
|
|
36
|
+
gameVibNotSupported: string;
|
|
37
|
+
gameVibLow: string;
|
|
38
|
+
gameVibHigh: string;
|
|
39
|
+
gameMoveStick: string;
|
|
40
|
+
gamePress: string;
|
|
41
|
+
rankLegendaryName: string;
|
|
42
|
+
rankLegendaryDesc: string;
|
|
43
|
+
rankLegendaryFlavor: string;
|
|
44
|
+
rankProName: string;
|
|
45
|
+
rankProDesc: string;
|
|
46
|
+
rankProFlavor: string;
|
|
47
|
+
rankGamerName: string;
|
|
48
|
+
rankGamerDesc: string;
|
|
49
|
+
rankGamerFlavor: string;
|
|
50
|
+
rankNoobName: string;
|
|
51
|
+
rankNoobDesc: string;
|
|
52
|
+
rankNoobFlavor: string;
|
|
53
|
+
gameShareText: string;
|
|
54
|
+
gameShareScorePrefix: string;
|
|
55
|
+
gameShareScoreSuffix: string;
|
|
56
|
+
gameShareTitle: string;
|
|
57
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
|
|
3
|
+
import type { KnownLocale } from '../../types';
|
|
4
|
+
import { probadorVibracionMando } from './index';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await probadorVibracionMando.i18n[locale]?.();
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
{content && content.bibliography.length > 0 && <SharedBibliography links={content.bibliography} />}
|