@jjlmoya/utils-games-development 1.61.0 → 1.62.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 (38) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -1
  3. package/src/entries.ts +2 -1
  4. package/src/index.ts +1 -0
  5. package/src/tests/locale_completeness.test.ts +2 -2
  6. package/src/tests/tool_validation.test.ts +2 -2
  7. package/src/tool/gameUIAccessibilityTester/bibliography.astro +6 -0
  8. package/src/tool/gameUIAccessibilityTester/bibliography.ts +10 -0
  9. package/src/tool/gameUIAccessibilityTester/component.astro +210 -0
  10. package/src/tool/gameUIAccessibilityTester/controller-actions.ts +92 -0
  11. package/src/tool/gameUIAccessibilityTester/controller.ts +237 -0
  12. package/src/tool/gameUIAccessibilityTester/dom-views.ts +193 -0
  13. package/src/tool/gameUIAccessibilityTester/entry.ts +28 -0
  14. package/src/tool/gameUIAccessibilityTester/evaluator.ts +43 -0
  15. package/src/tool/gameUIAccessibilityTester/game-ui-accessibility-stress-tester.css +982 -0
  16. package/src/tool/gameUIAccessibilityTester/i18n/de.ts +203 -0
  17. package/src/tool/gameUIAccessibilityTester/i18n/en.ts +199 -0
  18. package/src/tool/gameUIAccessibilityTester/i18n/es.ts +203 -0
  19. package/src/tool/gameUIAccessibilityTester/i18n/fr.ts +203 -0
  20. package/src/tool/gameUIAccessibilityTester/i18n/id.ts +203 -0
  21. package/src/tool/gameUIAccessibilityTester/i18n/it.ts +203 -0
  22. package/src/tool/gameUIAccessibilityTester/i18n/ja.ts +203 -0
  23. package/src/tool/gameUIAccessibilityTester/i18n/ko.ts +203 -0
  24. package/src/tool/gameUIAccessibilityTester/i18n/nl.ts +203 -0
  25. package/src/tool/gameUIAccessibilityTester/i18n/pl.ts +203 -0
  26. package/src/tool/gameUIAccessibilityTester/i18n/pt.ts +203 -0
  27. package/src/tool/gameUIAccessibilityTester/i18n/ru.ts +203 -0
  28. package/src/tool/gameUIAccessibilityTester/i18n/sv.ts +203 -0
  29. package/src/tool/gameUIAccessibilityTester/i18n/tr.ts +203 -0
  30. package/src/tool/gameUIAccessibilityTester/i18n/zh.ts +203 -0
  31. package/src/tool/gameUIAccessibilityTester/index.ts +11 -0
  32. package/src/tool/gameUIAccessibilityTester/logic.test.ts +57 -0
  33. package/src/tool/gameUIAccessibilityTester/logic.ts +157 -0
  34. package/src/tool/gameUIAccessibilityTester/report.ts +59 -0
  35. package/src/tool/gameUIAccessibilityTester/seo.astro +15 -0
  36. package/src/tool/gameUIAccessibilityTester/storage.ts +34 -0
  37. package/src/tool/gameUIAccessibilityTester/ui.ts +80 -0
  38. package/src/tools.ts +2 -0
@@ -0,0 +1,203 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { GameUiAccessibilityTesterUI } from '../ui';
4
+ import { bibliographyEntries } from '../bibliography';
5
+
6
+ const slug = 'tester-dostepnosci-ui-gier';
7
+ const title = 'Tester Dostępności UI Gier';
8
+ const description = 'Sprawdzaj zrzuty ekranu z gier lokalnie w przeglądarce za pomocą symulacji ślepoty barw, próbników kontrastu HUD, rozmycia i map cieplnych.';
9
+
10
+ const faq = [
11
+ {
12
+ question: 'Czy to narzędzie certyfikuje dostępność UI mojej gry?',
13
+ answer: 'Nie. Łączy symulacje widzenia barw, pomiary kontrastu oraz wskazówki przeglądu. Używaj wyników jako pomocy przy projektowaniu, a nie jako oficjalnego certyfikatu.',
14
+ },
15
+ {
16
+ question: 'Czy mój zrzut ekranu jest przesyłany na serwer?',
17
+ answer: 'Nie. Obraz jest dekodowany, analizowany i przekształcany wyłącznie w Twojej przeglądarce. W pamięci lokalnej zapisywane są tylko ustawienia widoku.',
18
+ },
19
+ {
20
+ question: 'Co należy mierzyć za pomocą dwóch próbników koloru?',
21
+ answer: 'Wybierz dwa kolory przekazujące różne informacje, takie jak wskaźniki sojusznika i wroga, stan aktywny i nieaktywny lub poziomy rzadkości.',
22
+ },
23
+ {
24
+ question: 'Dlaczego dobry współczynnik kontrastu wymaga ręcznego przeglądu?',
25
+ answer: 'Para kolorów może mieć wysoki kontrast, ale mała ikona, cienki tekst, ruchome tło lub poleganie wyłącznie na barwie mogą utrudniać odczyt.',
26
+ },
27
+ {
28
+ question: 'Co pokazuje mapa cieplna?',
29
+ answer: 'Mapa cieplna wyróżnia obszary, w których różnica kolorów drastycznie spada po zastosowaniu wybranej symulacji.',
30
+ },
31
+ ];
32
+
33
+ const howTo = [
34
+ { name: 'Wczytaj zrzut ekranu', text: 'Wybierz plik PNG, JPEG lub WebP z gry. Obraz pozostaje w pamięci podręcznej Twojej przeglądarki.' },
35
+ { name: 'Wybierz soczewkę symulacji', text: 'Porównaj oryginał z symulacją zaburzeń rozpoznawania barw, skalą szarości lub obniżonym kontrastem.' },
36
+ { name: 'Zastosuj testy wizualne', text: 'Dodaj rozmycie, zmniejsz skalę renderowania, przybliż piksele lub włącz mapę cieplną krawędzi.' },
37
+ { name: 'Zmierz dwa kluczowe sygnały', text: 'Wybierz Próbnik A lub B i kliknij na oryginalnym obrazie, aby porównać dwa kolory.' },
38
+ { name: 'Eksportuj wnioski', text: 'Zapoznaj się z pytaniami pomocniczymi, dodaj własne uwagi i pobierz arkusz porównawczy oraz raport JSON.' },
39
+ ];
40
+
41
+ const softwareApplication: WithContext<SoftwareApplication> = {
42
+ '@context': 'https://schema.org',
43
+ '@type': 'SoftwareApplication',
44
+ name: title,
45
+ applicationCategory: 'DeveloperApplication',
46
+ operatingSystem: 'Any',
47
+ };
48
+
49
+ const faqPage: WithContext<FAQPage> = {
50
+ '@context': 'https://schema.org',
51
+ '@type': 'FAQPage',
52
+ mainEntity: faq.map((item) => ({
53
+ '@type': 'Question',
54
+ name: item.question,
55
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
56
+ })),
57
+ };
58
+
59
+ const howToSchema: WithContext<HowTo> = {
60
+ '@context': 'https://schema.org',
61
+ '@type': 'HowTo',
62
+ name: title,
63
+ step: howTo.map((step) => ({ '@type': 'HowToStep', name: step.name, text: step.text })),
64
+ };
65
+
66
+ export const content: ToolLocaleContent<GameUiAccessibilityTesterUI> = {
67
+ slug,
68
+ title,
69
+ description,
70
+ ui: {
71
+ onboarding: 'Załaduj zrzut ekranu z gry, wybierz soczewkę symulacji i porównaj dwa sygnały wizualne, które gracz musi łatwo rozróżniać.',
72
+ privacyNote: 'Analiza lokalna. Obrazy nie są wysyłane na żaden serwer.',
73
+ dropTitle: 'Przeciągnij zrzut ekranu z gry na stół analityczny',
74
+ dropHint: 'Upuść obraz tutaj lub wybierz go z urządzenia. Używaj reprezentatywnych kadrów z rzeczywistym tłem.',
75
+ chooseImage: 'Wybierz zrzut ekranu',
76
+ replaceImage: 'Zmień zrzut ekranu',
77
+ supportedFiles: 'PNG, JPEG lub WebP do 16 MB. Duże obrazy są skalowane do 1600 px.',
78
+ lensLabel: 'Soczewka symulacji',
79
+ lensOriginal: 'Oryginał',
80
+ lensProtanopia: 'Protanopia',
81
+ lensDeuteranopia: 'Deuteranopia',
82
+ lensTritanopia: 'Tritanopia',
83
+ lensAchromatopsia: 'Skala szarości',
84
+ lensReducedContrast: 'Obniżony kontrast',
85
+ lensDesaturation: 'Desaturacja',
86
+ compareLabel: 'Tryb porównania',
87
+ compareSideBySide: 'Obok siebie',
88
+ compareSplit: 'Dzielona soczewka',
89
+ comparePress: 'Naciśnij, aby odsłonić',
90
+ holdOriginal: 'Przytrzymaj dla oryginału',
91
+ splitPosition: 'Pozycja podziału',
92
+ stressLabel: 'Testy obciążeniowe sygnału',
93
+ blurLabel: 'Rozmycie w pikselach',
94
+ downscaleLabel: 'Podgląd małego ekranu',
95
+ downscaleFull: 'Pełny',
96
+ downscaleHalf: 'Połowa',
97
+ downscaleQuarter: 'Ćwiartka',
98
+ downscaleEighth: 'Jedna ósma',
99
+ zoomLabel: 'Powiększenie pikseli',
100
+ heatmapLabel: 'Mapa cieplna krawędzi',
101
+ heatmapHint: 'Wyróżnia obszary ze znacznym spadkiem widoczności krawędzi.',
102
+ originalView: 'Oryginalny sygnał',
103
+ simulatedView: 'Symulowany sygnał',
104
+ emptyCanvas: 'Wybierz zrzut ekranu, aby rozpocząć analizę. Plik pozostaje na Twoim urządzeniu.',
105
+ sampleTitle: 'Próbniki sygnałów',
106
+ sampleInstructions: 'Wybierz A lub B i kliknij na oryginale, aby pobrać próbkę koloru.',
107
+ sampleA: 'Próbnik A',
108
+ sampleB: 'Próbnik B',
109
+ sampleAName: 'Znaczenie próbnika A',
110
+ sampleBName: 'Znaczenie próbnika B',
111
+ manualColor: 'Ustaw kolor ręcznie',
112
+ sampleAInitial: 'Wskaźnik sojusznika',
113
+ sampleBInitial: 'Wskaźnik wroga',
114
+ noSample: 'Oczekiwanie na obraz',
115
+ originalContrast: 'Oryginalny kontrast',
116
+ simulatedContrast: 'Symulowany kontrast',
117
+ separationRetained: 'Zachowana różnica',
118
+ statusStrong: 'Sygnał wyraźnie widoczny',
119
+ statusWatch: 'Sprawdź w kontekście',
120
+ statusReview: 'Wymaga przeglądu',
121
+ statusPending: 'Brak analizy',
122
+ measurementLabel: 'Pomiar',
123
+ heuristicLabel: 'Heurystyka',
124
+ manualReviewLabel: 'Przegląd ręczny',
125
+ measurementHint: 'Oblicza współczynnik kontrastu WCAG dla dwóch pobranych kolorów sRGB.',
126
+ heuristicHint: 'Porównuje odległość kolorów przed i po zastosowaniu symulacji.',
127
+ promptTitle: 'Pytania pomocnicze dla projektanta',
128
+ promptColorOnly: 'Czy gracze mogą rozróżnić elementy bez polegania wyłącznie na barwie?',
129
+ promptChangingBackground: 'Czy tekst pozostaje czytelny na jasnych, ciemnych lub ruchomych tłach?',
130
+ promptMinimap: 'Czy ikony na minimapie różnią się kształtem lub wzorem oprócz koloru?',
131
+ promptStates: 'Czy stany wyboru, wyłączenia i odnawiania są jednoznaczne?',
132
+ promptShape: 'Czy symbol, napis lub dźwięk wzmacnia każdy sygnał kolorystyczny?',
133
+ findingLabel: 'Uwaga zespołu',
134
+ findingPlaceholder: 'Przykład: Obrys wroga zanika na czerwonym tle',
135
+ addFinding: 'Dodaj uwagę',
136
+ findingsEmpty: 'Brak zapisanych uwag.',
137
+ exportSheet: 'Pobierz arkusz porównawczy',
138
+ exportReport: 'Pobierz raport JSON',
139
+ resetTool: 'Zresetuj',
140
+ uploadError: 'Nie można odczytać pliku. Wybierz poprawny format PNG, JPEG lub WebP.',
141
+ fileTooLarge: 'Plik przekracza 16 MB. Wybierz mniejszy obraz.',
142
+ imageReady: 'Obraz załadowany. Pobierz dwie próbki kolorów, aby rozpocząć.',
143
+ reportDownloaded: 'Pobrano raport JSON.',
144
+ sheetDownloaded: 'Pobrano arkusz porównawczy.',
145
+ localOnlyDisclosure: 'Analiza w 100% lokalna w Twojej przeglądarce.',
146
+ limitationDisclosure: 'Narzędzie wspomaga projektowanie, ale nie zastępuje testów z graczami.',
147
+ reportTitle: 'Raport przeglądu dostępności UI gry',
148
+ reportFindingReview: 'Mierzona para kolorów traci znaczny kontrast w wybranej symulacji.',
149
+ },
150
+ seo: [
151
+ {
152
+ type: 'title',
153
+ level: 2,
154
+ text: 'Testowanie dostępności UI gier bez wysyłania plików',
155
+ },
156
+ {
157
+ type: 'paragraph',
158
+ html: 'Interfejsy gier muszą być czytelne w dynamicznych warunkach wizualnych. To lokalne narzędzie pozwala analizować zrzuty ekranu bezpośrednio w przeglądarce przy użyciu symulacji ślepoty barw.',
159
+ },
160
+ {
161
+ type: 'title',
162
+ level: 2,
163
+ text: 'Pomiary, heurystyka i ocena człowieka',
164
+ },
165
+ {
166
+ type: 'table',
167
+ headers: ['Rodzaj analizy', 'Co zapewnia to narzędzie', 'Czego nie może zagwarantować'],
168
+ rows: [
169
+ ['Pomiar', 'Stosunek kontrastu i jasność względna WCAG dla dwóch kolorów', 'Automatyczna zgodność całej gry z normami'],
170
+ ['Symulacja', 'Przekształcenia dla protanopii, deuteranopii i tritanopii', 'Dokładne odczucia wizualne każdego gracza'],
171
+ ['Heurystyka', 'Rozmycie, skalowanie i wykrywanie utraty krawędzi', 'Automatyczna ocena jakości projektu UI'],
172
+ ['Przegląd ręczny', 'Checklista z pytaniami i raporty do eksportu', 'Zastąpienie testów z udziałem graczy'],
173
+ ],
174
+ },
175
+ {
176
+ type: 'title',
177
+ level: 2,
178
+ text: 'Mierz kolory wpływające na decyzje gracza',
179
+ },
180
+ {
181
+ type: 'paragraph',
182
+ html: 'Skup się na parach kolorów kluczowych dla rozgrywki, takich jak wrok i sojusznik. Jeśli kontrast spada, rozważ dodanie ikony lub kształtu.',
183
+ },
184
+ {
185
+ type: 'tip',
186
+ title: 'Testuj dynamiczne kadry z gry',
187
+ html: 'Używaj zrzutów ekranu z intensywnych momentów rozgrywki, aby uzyskać wiarygodne wyniki.',
188
+ },
189
+ {
190
+ type: 'title',
191
+ level: 2,
192
+ text: 'Wykorzystaj raport w pracy zespołowej',
193
+ },
194
+ {
195
+ type: 'paragraph',
196
+ html: 'Raport JSON oraz obraz PNG można dołączyć do zadań w systemie zarządzania projektem, aby ułatwić komunikację z zespołem.',
197
+ },
198
+ ],
199
+ faq,
200
+ howTo,
201
+ schemas: [softwareApplication, faqPage, howToSchema],
202
+ bibliography: bibliographyEntries,
203
+ };
@@ -0,0 +1,203 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { GameUiAccessibilityTesterUI } from '../ui';
4
+ import { bibliographyEntries } from '../bibliography';
5
+
6
+ const slug = 'testador-estresse-acessibilidade-ui-jogos';
7
+ const title = 'Testador de Estresse de Acessibilidade para UI de Jogos';
8
+ const description = 'Inspecione capturas de tela de jogos localmente com simulações de daltonismo, sondas de contraste HUD, desfoque, redução de escala e mapas de calor de bordas.';
9
+
10
+ const faq = [
11
+ {
12
+ question: 'Esta ferramenta certifica a acessibilidade da minha interface?',
13
+ answer: 'Não. Ela combina simulações de visão de cores, medições de contraste e guias de revisão visual. Use os resultados para orientar o design e os testes com jogadores.',
14
+ },
15
+ {
16
+ question: 'Minha captura de tela é enviada para algum servidor?',
17
+ answer: 'Não. A imagem é decodificada, analisada e transformada inteiramente no seu navegador. Apenas as configurações de exibição são salvas localmente.',
18
+ },
19
+ {
20
+ question: 'O que devo medir com as duas sondas de cor?',
21
+ answer: 'Escolha duas cores que devem comunicar significados diferentes, como indicadores de aliado e inimigo, estados ativo e inativo ou níveis de raridade.',
22
+ },
23
+ {
24
+ question: 'Por que uma boa taxa de contraste ainda exige revisão manual?',
25
+ answer: 'Um par pode ter bom contraste numérico, mas um ícone pequeno, texto fino ou fundo em movimento ainda podem ser difíceis de identificar no jogo.',
26
+ },
27
+ {
28
+ question: 'O que o mapa de calor mostra?',
29
+ answer: 'O mapa de calor destaca áreas onde a separação de cores diminui acentuadamente após a simulação selecionada.',
30
+ },
31
+ ];
32
+
33
+ const howTo = [
34
+ { name: 'Carregar captura de tela', text: 'Selecione uma imagem PNG, JPEG ou WebP do jogo. A imagem permanece na memória local do seu navegador.' },
35
+ { name: 'Escolher lente de simulação', text: 'Compare o original com simulações de daltonismo, escala de cinza ou contraste reduzido.' },
36
+ { name: 'Aplicar estresse visual', text: 'Adicione desfoque, reduza a escala de renderização, amplie os pixels ou ative o mapa de calor de bordas.' },
37
+ { name: 'Amostrar dois sinais críticos', text: 'Selecione a Sonda A ou B e clique na imagem original para comparar duas cores.' },
38
+ { name: 'Exportar observações', text: 'Consulte o guia de revisão, adicione notas e baixe uma folha comparativa e um relatório JSON.' },
39
+ ];
40
+
41
+ const softwareApplication: WithContext<SoftwareApplication> = {
42
+ '@context': 'https://schema.org',
43
+ '@type': 'SoftwareApplication',
44
+ name: title,
45
+ applicationCategory: 'DeveloperApplication',
46
+ operatingSystem: 'Any',
47
+ };
48
+
49
+ const faqPage: WithContext<FAQPage> = {
50
+ '@context': 'https://schema.org',
51
+ '@type': 'FAQPage',
52
+ mainEntity: faq.map((item) => ({
53
+ '@type': 'Question',
54
+ name: item.question,
55
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
56
+ })),
57
+ };
58
+
59
+ const howToSchema: WithContext<HowTo> = {
60
+ '@context': 'https://schema.org',
61
+ '@type': 'HowTo',
62
+ name: title,
63
+ step: howTo.map((step) => ({ '@type': 'HowToStep', name: step.name, text: step.text })),
64
+ };
65
+
66
+ export const content: ToolLocaleContent<GameUiAccessibilityTesterUI> = {
67
+ slug,
68
+ title,
69
+ description,
70
+ ui: {
71
+ onboarding: 'Carregue uma captura de tela do jogo, escolha uma lente de simulação e compare dois sinais visuais que os jogadores precisam diferenciar claramente.',
72
+ privacyNote: 'Análise local. As capturas de tela não são enviadas para servidores.',
73
+ dropTitle: 'Arraste uma captura do jogo para a bancada de teste',
74
+ dropHint: 'Solte uma imagem aqui ou escolha do seu dispositivo. Use um momento real do jogo com fundos e elementos visuais reais.',
75
+ chooseImage: 'Escolher captura',
76
+ replaceImage: 'Substituir captura',
77
+ supportedFiles: 'PNG, JPEG ou WebP até 16 MB. Imagens grandes são ajustadas para 1600 px.',
78
+ lensLabel: 'Lente de simulação',
79
+ lensOriginal: 'Original',
80
+ lensProtanopia: 'Protanopia',
81
+ lensDeuteranopia: 'Deuteranopia',
82
+ lensTritanopia: 'Tritanopia',
83
+ lensAchromatopsia: 'Escala de cinza',
84
+ lensReducedContrast: 'Contraste reduzido',
85
+ lensDesaturation: 'Dessaturação',
86
+ compareLabel: 'Modo de comparação',
87
+ compareSideBySide: 'Lado a lado',
88
+ compareSplit: 'Lente dividida',
89
+ comparePress: 'Pressionar para revelar',
90
+ holdOriginal: 'Segure para ver original',
91
+ splitPosition: 'Posição da lente',
92
+ stressLabel: 'Controles de estresse de sinal',
93
+ blurLabel: 'Desfoque em pixels',
94
+ downscaleLabel: 'Prévia de tela pequena',
95
+ downscaleFull: 'Total',
96
+ downscaleHalf: 'Metade',
97
+ downscaleQuarter: 'Um quarto',
98
+ downscaleEighth: 'Um oitavo',
99
+ zoomLabel: 'Zoom de inspeção',
100
+ heatmapLabel: 'Mapa de calor de bordas',
101
+ heatmapHint: 'Destaca perdas de separação de cores sob a lente ativa.',
102
+ originalView: 'Sinal original',
103
+ simulatedView: 'Sinal simulado',
104
+ emptyCanvas: 'Selecione uma captura para ativar a comparação. A imagem permanece no seu dispositivo.',
105
+ sampleTitle: 'Sondas de sinal crítico',
106
+ sampleInstructions: 'Selecione A ou B e clique na imagem original para amostrar as cores.',
107
+ sampleA: 'Sonda A',
108
+ sampleB: 'Sonda B',
109
+ sampleAName: 'Significado da sonda A',
110
+ sampleBName: 'Significado da sonda B',
111
+ manualColor: 'Definir cor diretamente',
112
+ sampleAInitial: 'Marcador aliado',
113
+ sampleBInitial: 'Marcador inimigo',
114
+ noSample: 'Aguardando captura',
115
+ originalContrast: 'Contraste original',
116
+ simulatedContrast: 'Contraste simulado',
117
+ separationRetained: 'Separação mantida',
118
+ statusStrong: 'Sinal bem distinto',
119
+ statusWatch: 'Verificar no contexto',
120
+ statusReview: 'Revisar design do sinal',
121
+ statusPending: 'Sem dados',
122
+ measurementLabel: 'Medição',
123
+ heuristicLabel: 'Heurística',
124
+ manualReviewLabel: 'Status de revisão',
125
+ measurementHint: 'Calcula a taxa de contraste de luminância relativa WCAG para as duas cores amostradas.',
126
+ heuristicHint: 'Compara a distância de cores antes e depois da simulação de visão.',
127
+ promptTitle: 'Guia de revisão da interface',
128
+ promptColorOnly: 'Os jogadores conseguem identificar elementos sem depender apenas da cor?',
129
+ promptChangingBackground: 'O texto permanece legível sobre fundos claros, escuros ou em movimento?',
130
+ promptMinimap: 'Os ícones do minimapa se diferenciam por forma ou padrão além da cor?',
131
+ promptStates: 'Os estados selecionado, desativado e recarga são inequívocos?',
132
+ promptShape: 'Um ícone, texto ou som reforça cada sinal de cor?',
133
+ findingLabel: 'Nota da equipe',
134
+ findingPlaceholder: 'Exemplo: O contorno do inimigo desaparece sobre o efeito vermelho',
135
+ addFinding: 'Adicionar nota',
136
+ findingsEmpty: 'Nenhuma nota registrada até o momento.',
137
+ exportSheet: 'Baixar folha comparativa',
138
+ exportReport: 'Baixar relatório JSON',
139
+ resetTool: 'Reiniciar sessão',
140
+ uploadError: 'Não foi possível ler a imagem. Escolha um arquivo PNG, JPEG ou WebP válido.',
141
+ fileTooLarge: 'A imagem excede 16 MB. Escolha um arquivo menor.',
142
+ imageReady: 'Captura carregada. Selecione duas sondas de cor para começar.',
143
+ reportDownloaded: 'Relatório JSON baixado.',
144
+ sheetDownloaded: 'Folha comparativa baixada.',
145
+ localOnlyDisclosure: 'Processamento 100% local no seu navegador. Nenhuma imagem é enviada.',
146
+ limitationDisclosure: 'Esta ferramenta auxilia na revisão de design, mas não substitui testes com jogadores.',
147
+ reportTitle: 'Relatório de revisão de acessibilidade de UI de jogo',
148
+ reportFindingReview: 'O par de cores perdeu contraste significativo sob a simulação.',
149
+ },
150
+ seo: [
151
+ {
152
+ type: 'title',
153
+ level: 2,
154
+ text: 'Avaliar a acessibilidade da UI do seu jogo sem enviar imagens',
155
+ },
156
+ {
157
+ type: 'paragraph',
158
+ html: 'As interfaces de jogos precisam ser legíveis em condições visuais dinâmicas. Este testador local permite analisar capturas de tela diretamente no navegador por meio de simulações de daltonismo.',
159
+ },
160
+ {
161
+ type: 'title',
162
+ level: 2,
163
+ text: 'Medições, heurísticas e avaliação humana',
164
+ },
165
+ {
166
+ type: 'table',
167
+ headers: ['Tipo de evidência', 'O que esta ferramenta oferece', 'O que ela não garante'],
168
+ rows: [
169
+ ['Medição', 'Taxa de contraste e luminância relativa WCAG para duas cores', 'Conformidade automática de todo o jogo'],
170
+ ['Simulação', 'Transformações para protanopia, deuteranopia e tritanopia', 'A experiência visual exata de cada jogador'],
171
+ ['Heurística', 'Desfoque, redução de escala e detecção de perda de bordas', 'Avaliação automática da qualidade da UI'],
172
+ ['Revisão manual', 'Guia de perguntas e relatórios exportáveis', 'Substituição de testes reais com jogadores'],
173
+ ],
174
+ },
175
+ {
176
+ type: 'title',
177
+ level: 2,
178
+ text: 'Amostre cores que influenciam as decisões do jogador',
179
+ },
180
+ {
181
+ type: 'paragraph',
182
+ html: 'Foque seus testes em pares de cores vitais para o jogo, como aliado e inimigo. Se o contraste diminuir na simulação, adicione ícones ou formas de suporte.',
183
+ },
184
+ {
185
+ type: 'tip',
186
+ title: 'Teste capturas de momentos intensos do jogo',
187
+ html: 'Utilize imagens tiradas durante a ação real do jogo em vez de artes estáticas limpas para obter resultados mais realistas.',
188
+ },
189
+ {
190
+ type: 'title',
191
+ level: 2,
192
+ text: 'Use o relatório exportado no trabalho em equipe',
193
+ },
194
+ {
195
+ type: 'paragraph',
196
+ html: 'O relatório JSON e a folha comparativa PNG podem ser anexados às tarefas de desenvolvimento para facilitar a correção de problemas de UI.',
197
+ },
198
+ ],
199
+ faq,
200
+ howTo,
201
+ schemas: [softwareApplication, faqPage, howToSchema],
202
+ bibliography: bibliographyEntries,
203
+ };
@@ -0,0 +1,203 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { GameUiAccessibilityTesterUI } from '../ui';
4
+ import { bibliographyEntries } from '../bibliography';
5
+
6
+ const slug = 'tester-dostupnosti-ui-igr';
7
+ const title = 'Тестер Доступности Интерфейса Игр';
8
+ const description = 'Проверяйте скриншоты игрового интерфейса локально с помощью симуляции дальтонизма, зондов контрастности HUD, размытия и тепловых карт.';
9
+
10
+ const faq = [
11
+ {
12
+ question: 'Сертифицирует ли этот инструмент доступность интерфейса моей игры?',
13
+ answer: 'Нет. Он объединяет математические измерения контрастности, модели симуляции цветовосприятия и контрольные вопросы. Используйте результаты для проверки дизайна.',
14
+ },
15
+ {
16
+ question: 'Загружается ли мой скриншот на внешний сервер?',
17
+ answer: 'Нет. Изображение обрабатывается и анализируется исключительно в вашем браузере. Настройки отображения сохраняются локально.',
18
+ },
19
+ {
20
+ question: 'Что следует измерять двумя цветовыми зондами?',
21
+ answer: 'Выберите два цвета с разным смысловым значением, например, маркеры союзника и врага, активное и неактивное состояние, или уровни редкости предметов.',
22
+ },
23
+ {
24
+ question: 'Почему даже при хорошем контрасте требуется ручная проверка?',
25
+ answer: 'Высокая контрастность пары цветов не гарантирует различимость мелких иконки, тонких шрифтов или элементов на движущемся фоне.',
26
+ },
27
+ {
28
+ question: 'Что показывает тепловая карта?',
29
+ answer: 'Тепловая карта подсвечивает области, где цветовое различие между соседними пикселями резко падает при выбранной симуляции.',
30
+ },
31
+ ];
32
+
33
+ const howTo = [
34
+ { name: 'Загрузите скриншот', text: 'Выберите файл PNG, JPEG или WebP. Изображение остается в локальной памяти вашего браузера.' },
35
+ { name: 'Выберите симуляцию', text: 'Сравните оригинал с симуляцией протанопии, дейтеранопии, тританопии, оттенков серого или пониженного контраста.' },
36
+ { name: 'Примените визуальные тесты', text: 'Добавьте размытие, уменьшите масштаб, увеличьте пиксели или включите тепловую карту границ.' },
37
+ { name: 'Измерьте два сигнала', text: 'Выберите Зонд A или B и кликните по оригинальному изображению для взятия пробы цвета.' },
38
+ { name: 'Сохраните результаты', text: 'Изучите контрольные вопросы, добавьте замечания и скачайте сравнительное изображение и отчет JSON.' },
39
+ ];
40
+
41
+ const softwareApplication: WithContext<SoftwareApplication> = {
42
+ '@context': 'https://schema.org',
43
+ '@type': 'SoftwareApplication',
44
+ name: title,
45
+ applicationCategory: 'DeveloperApplication',
46
+ operatingSystem: 'Any',
47
+ };
48
+
49
+ const faqPage: WithContext<FAQPage> = {
50
+ '@context': 'https://schema.org',
51
+ '@type': 'FAQPage',
52
+ mainEntity: faq.map((item) => ({
53
+ '@type': 'Question',
54
+ name: item.question,
55
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
56
+ })),
57
+ };
58
+
59
+ const howToSchema: WithContext<HowTo> = {
60
+ '@context': 'https://schema.org',
61
+ '@type': 'HowTo',
62
+ name: title,
63
+ step: howTo.map((step) => ({ '@type': 'HowToStep', name: step.name, text: step.text })),
64
+ };
65
+
66
+ export const content: ToolLocaleContent<GameUiAccessibilityTesterUI> = {
67
+ slug,
68
+ title,
69
+ description,
70
+ ui: {
71
+ onboarding: 'Загрузите скриншот игры, выберите режим симуляции и сравните два ключевых визуальных сигнала, которые игрок должен различать.',
72
+ privacyNote: 'Локальный анализ. Скриншоты не отправляются на сервер.',
73
+ dropTitle: 'Перетащите скриншот игры на рабочую область',
74
+ dropHint: 'Перетащите изображение сюда или выберите файл на устройстве. Используйте реальные кадры игрового процесса.',
75
+ chooseImage: 'Выбрать скриншот',
76
+ replaceImage: 'Заменить скриншот',
77
+ supportedFiles: 'PNG, JPEG или WebP до 16 МБ. Большие изображения масштабируются до 1600 px.',
78
+ lensLabel: 'Режим симуляции',
79
+ lensOriginal: 'Оригинал',
80
+ lensProtanopia: 'Протанопия',
81
+ lensDeuteranopia: 'Дейтеранопия',
82
+ lensTritanopia: 'Тританопия',
83
+ lensAchromatopsia: 'Оттенки серого',
84
+ lensReducedContrast: 'Пониженный контраст',
85
+ lensDesaturation: 'Обесцвечивание',
86
+ compareLabel: 'Режим сравнения',
87
+ compareSideBySide: 'Рядом',
88
+ compareSplit: 'Разделенный экран',
89
+ comparePress: 'Удерживайте для оригинала',
90
+ holdOriginal: 'Удерживайте для оригинала',
91
+ splitPosition: 'Позиция разделителя',
92
+ stressLabel: 'Визуальные тесты',
93
+ blurLabel: 'Размытие (пиксели)',
94
+ downscaleLabel: 'Предпросмотр на малом экране',
95
+ downscaleFull: '100%',
96
+ downscaleHalf: '50%',
97
+ downscaleQuarter: '25%',
98
+ downscaleEighth: '12.5%',
99
+ zoomLabel: 'Масштаб пикселей',
100
+ heatmapLabel: 'Тепловая карта границ',
101
+ heatmapHint: 'Подсвечивает зоны потери цветового различия при симуляции.',
102
+ originalView: 'Оригинальный сигнал',
103
+ simulatedView: 'Сигнал с симуляцией',
104
+ emptyCanvas: 'Выберите скриншот для начала анализа. Файл останется на вашем устройстве.',
105
+ sampleTitle: 'Цветовые зонды',
106
+ sampleInstructions: 'Выберите A или B и кликните на оригинальном изображении для выбора цвета.',
107
+ sampleA: 'Зонд A',
108
+ sampleB: 'Зонд B',
109
+ sampleAName: 'Значение зонда A',
110
+ sampleBName: 'Значение зонда B',
111
+ manualColor: 'Указать цвет вручную',
112
+ sampleAInitial: 'Маркер союзника',
113
+ sampleBInitial: 'Маркер врага',
114
+ noSample: 'Ожидание скриншота',
115
+ originalContrast: 'Исходный контраст',
116
+ simulatedContrast: 'Контраст с симуляцией',
117
+ separationRetained: 'Сохраненное различие',
118
+ statusStrong: 'Сигнал хорошо различим',
119
+ statusWatch: 'Проверьте в контексте',
120
+ statusReview: 'Требуется переработка',
121
+ statusPending: 'Нет данных',
122
+ measurementLabel: 'Измерение',
123
+ heuristicLabel: 'Эвристика',
124
+ manualReviewLabel: 'Статус проверки',
125
+ measurementHint: 'Рассчитывает коэффициент контрастности относительно яркости по стандарту WCAG.',
126
+ heuristicHint: 'Сравнивает цветовое расстояние до и после применения симуляции.',
127
+ promptTitle: 'Контрольные вопросы для дизайнера',
128
+ promptColorOnly: 'Могут ли игроки различать элементы без опоры только на цвет?',
129
+ promptChangingBackground: 'Остается ли текст читаемым на светлом, темном или динамичном фоне?',
130
+ promptMinimap: 'Различаются ли иконки на мини-карте формой или узором помимо цвета?',
131
+ promptStates: 'Являются ли состояния выбора, блокировки и перезарядки очевидными?',
132
+ promptShape: 'Подкрепляется ли каждый цветовой сигнал иконкой, текстом или звуком?',
133
+ findingLabel: 'Заметка команды',
134
+ findingPlaceholder: 'Пример: Контур врага сливается с красным эффектом урона',
135
+ addFinding: 'Добавить заметку',
136
+ findingsEmpty: 'Заметок пока нет.',
137
+ exportSheet: 'Скачать сравнение (PNG)',
138
+ exportReport: 'Скачать отчет JSON',
139
+ resetTool: 'Сбросить',
140
+ uploadError: 'Не удалось прочитать файл. Выберите PNG, JPEG или WebP.',
141
+ fileTooLarge: 'Размер файла превышает 16 МБ. Выберите меньший файл.',
142
+ imageReady: 'Изображение загружено. Выберите две точки для измерения.',
143
+ reportDownloaded: 'Отчет JSON скачан.',
144
+ sheetDownloaded: 'Сравнительное изображение скачано.',
145
+ localOnlyDisclosure: 'Обработка выполняется на 100% локально в вашем браузере.',
146
+ limitationDisclosure: 'Инструмент помогает в проверке дизайна, но не заменяет тестирование с игроками.',
147
+ reportTitle: 'Отчет проверки доступности UI игры',
148
+ reportFindingReview: 'Измеряемая пара цветов значительно теряет контраст при симуляции.',
149
+ },
150
+ seo: [
151
+ {
152
+ type: 'title',
153
+ level: 2,
154
+ text: 'Проверка доступности игрового интерфейса без передачи скриншотов',
155
+ },
156
+ {
157
+ type: 'paragraph',
158
+ html: 'Игровые интерфейсы должны оставаться читаемыми в условиях динамичной графики и спецэффектов. Этот локальный инструмент позволяет проверять скриншоты прямо в браузере с помощью симуляций дальтонизма.',
159
+ },
160
+ {
161
+ type: 'title',
162
+ level: 2,
163
+ text: 'Измерения, эвристика и ручной анализ',
164
+ },
165
+ {
166
+ type: 'table',
167
+ headers: ['Тип анализа', 'Что дает данный инструмент', 'Чего он не может гарантировать'],
168
+ rows: [
169
+ ['Измерение', 'Контрастность и относительная яркость WCAG для двух цветов', 'Полное автоматическое соответствие всей игры стандартам'],
170
+ ['Симуляция', 'Научные алгоритмы симуляции протанопии, дейтеранопии и тританопии', 'Точное воспроизведение восприятия каждого конкретного человека'],
171
+ ['Эвристика', 'Размытие, уменьшение масштаба и определение потери границ', 'Автоматическая оценка качества дизайна'],
172
+ ['Ручной анализ', 'Контрольный список вопросов и выгрузка отчетов', 'Замена полноценного тестирования с пользователями'],
173
+ ],
174
+ },
175
+ {
176
+ type: 'title',
177
+ level: 2,
178
+ text: 'Измеряйте цвета, влияющие на решения игрока',
179
+ },
180
+ {
181
+ type: 'paragraph',
182
+ html: 'Фокусируйте измерения на ключевых парах элементов, таких как союзник и враг. Если контраст падает при симуляции, добавляйте дополнительную индикацию формой или иконками.',
183
+ },
184
+ {
185
+ type: 'tip',
186
+ title: 'Используйте скриншоты из насыщенных игровых сцен',
187
+ html: 'Берите кадры из динамичных моментов игры с большим количеством эффектов вместо чистых меню для получения реалистичных результатов.',
188
+ },
189
+ {
190
+ type: 'title',
191
+ level: 2,
192
+ text: 'Используйте выгружаемый отчет в командной работе',
193
+ },
194
+ {
195
+ type: 'paragraph',
196
+ html: 'Файл отчета JSON и сравнительное изображение PNG можно прикреплять к задачам разработки для обсуждения исправлений UI.',
197
+ },
198
+ ],
199
+ faq,
200
+ howTo,
201
+ schemas: [softwareApplication, faqPage, howToSchema],
202
+ bibliography: bibliographyEntries,
203
+ };