@jjlmoya/utils-games-development 1.56.0 → 1.58.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 (66) hide show
  1. package/package.json +1 -1
  2. package/src/entries.ts +2 -1
  3. package/src/tests/runtime_registry.test.ts +27 -0
  4. package/src/tests/seo_parity.test.ts +60 -0
  5. package/src/tests/translation_copy.test.ts +124 -0
  6. package/src/tool/itchioGameTester/i18n/de.ts +32 -2
  7. package/src/tool/itchioGameTester/i18n/es.ts +28 -4
  8. package/src/tool/itchioGameTester/i18n/fr.ts +26 -2
  9. package/src/tool/itchioGameTester/i18n/id.ts +26 -2
  10. package/src/tool/itchioGameTester/i18n/it.ts +26 -2
  11. package/src/tool/itchioGameTester/i18n/ja.ts +26 -2
  12. package/src/tool/itchioGameTester/i18n/ko.ts +26 -2
  13. package/src/tool/itchioGameTester/i18n/nl.ts +26 -2
  14. package/src/tool/itchioGameTester/i18n/pl.ts +26 -2
  15. package/src/tool/itchioGameTester/i18n/pt.ts +26 -2
  16. package/src/tool/itchioGameTester/i18n/ru.ts +26 -2
  17. package/src/tool/itchioGameTester/i18n/sv.ts +26 -2
  18. package/src/tool/itchioGameTester/i18n/tr.ts +26 -2
  19. package/src/tool/itchioGameTester/i18n/zh.ts +26 -2
  20. package/src/tool/pixelArtPaletteSwapper/app-client.ts +8 -3
  21. package/src/tool/pixelArtPaletteSwapper/i18n/ja.ts +8 -0
  22. package/src/tool/pixelArtPaletteSwapper/i18n/ko.ts +8 -0
  23. package/src/tool/pixelArtPaletteSwapper/i18n/zh.ts +8 -0
  24. package/src/tool/pixelArtPaletteSwapper/logic.ts +37 -7
  25. package/src/tool/spriteSheetPacker/i18n/de.ts +9 -0
  26. package/src/tool/spriteSheetPacker/i18n/es.ts +9 -1
  27. package/src/tool/spriteSheetPacker/i18n/fr.ts +8 -0
  28. package/src/tool/spriteSheetPacker/i18n/id.ts +8 -0
  29. package/src/tool/spriteSheetPacker/i18n/it.ts +8 -0
  30. package/src/tool/spriteSheetPacker/i18n/ja.ts +8 -0
  31. package/src/tool/spriteSheetPacker/i18n/ko.ts +8 -0
  32. package/src/tool/spriteSheetPacker/i18n/nl.ts +8 -0
  33. package/src/tool/spriteSheetPacker/i18n/pl.ts +8 -0
  34. package/src/tool/spriteSheetPacker/i18n/pt.ts +8 -0
  35. package/src/tool/spriteSheetPacker/i18n/ru.ts +8 -0
  36. package/src/tool/spriteSheetPacker/i18n/sv.ts +8 -0
  37. package/src/tool/spriteSheetPacker/i18n/tr.ts +8 -0
  38. package/src/tool/spriteSheetPacker/i18n/zh.ts +8 -0
  39. package/src/tool/steamBbcodeTranslator/i18n/de.ts +23 -3
  40. package/src/tool/steamBbcodeTranslator/i18n/es.ts +23 -3
  41. package/src/tool/steamBbcodeTranslator/i18n/fr.ts +26 -2
  42. package/src/tool/steamBbcodeTranslator/i18n/id.ts +26 -2
  43. package/src/tool/steamBbcodeTranslator/i18n/it.ts +26 -2
  44. package/src/tool/steamBbcodeTranslator/i18n/ja.ts +26 -2
  45. package/src/tool/steamBbcodeTranslator/i18n/ko.ts +26 -2
  46. package/src/tool/steamBbcodeTranslator/i18n/nl.ts +26 -2
  47. package/src/tool/steamBbcodeTranslator/i18n/pl.ts +26 -2
  48. package/src/tool/steamBbcodeTranslator/i18n/pt.ts +26 -2
  49. package/src/tool/steamBbcodeTranslator/i18n/ru.ts +26 -2
  50. package/src/tool/steamBbcodeTranslator/i18n/sv.ts +26 -2
  51. package/src/tool/steamBbcodeTranslator/i18n/tr.ts +26 -2
  52. package/src/tool/steamBbcodeTranslator/i18n/zh.ts +26 -2
  53. package/src/tool/steamCapsuleGenerator/i18n/de.ts +73 -4
  54. package/src/tool/steamCapsuleGenerator/i18n/es.ts +58 -6
  55. package/src/tool/steamCapsuleGenerator/i18n/fr.ts +56 -4
  56. package/src/tool/steamCapsuleGenerator/i18n/id.ts +55 -3
  57. package/src/tool/steamCapsuleGenerator/i18n/it.ts +55 -3
  58. package/src/tool/steamCapsuleGenerator/i18n/ja.ts +55 -3
  59. package/src/tool/steamCapsuleGenerator/i18n/ko.ts +55 -3
  60. package/src/tool/steamCapsuleGenerator/i18n/nl.ts +55 -3
  61. package/src/tool/steamCapsuleGenerator/i18n/pl.ts +55 -3
  62. package/src/tool/steamCapsuleGenerator/i18n/pt.ts +55 -3
  63. package/src/tool/steamCapsuleGenerator/i18n/ru.ts +55 -3
  64. package/src/tool/steamCapsuleGenerator/i18n/sv.ts +55 -3
  65. package/src/tool/steamCapsuleGenerator/i18n/tr.ts +55 -3
  66. package/src/tool/steamCapsuleGenerator/i18n/zh.ts +55 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlmoya/utils-games-development",
3
- "version": "1.56.0",
3
+ "version": "1.58.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
package/src/entries.ts CHANGED
@@ -23,7 +23,8 @@ import { spriteSheetPacker } from './tool/spriteSheetPacker/entry';
23
23
  import { audioLoopPointFinder } from './tool/audioLoopPointFinder/entry';
24
24
  import { saveFileEditor } from './tool/saveFileEditor/entry';
25
25
  import { localizationSanitizer } from './tool/localizationSanitizer/entry';
26
+ import { steamBbcodeTranslator } from './tool/steamBbcodeTranslator/entry';
26
27
  import { retroSfxGenerator } from './tool/retroSfxGenerator/entry';
27
28
  import { pixelArtPaletteSwapper } from './tool/pixelArtPaletteSwapper/entry';
28
29
 
29
- export const ALL_ENTRIES = [steamCapsuleGenerator, itchioGameTester, spriteSheetPacker, audioLoopPointFinder, saveFileEditor, localizationSanitizer, retroSfxGenerator, pixelArtPaletteSwapper];
30
+ export const ALL_ENTRIES = [steamCapsuleGenerator, itchioGameTester, spriteSheetPacker, audioLoopPointFinder, saveFileEditor, localizationSanitizer, steamBbcodeTranslator, retroSfxGenerator, pixelArtPaletteSwapper];
@@ -0,0 +1,27 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { ALL_ENTRIES } from '../entries';
5
+ import { ALL_TOOLS } from '../tools';
6
+
7
+ describe('runtime registry', () => {
8
+ it('keeps every runtime tool represented in the data registry', () => {
9
+ const toolIds = ALL_TOOLS.map(({ entry }) => entry.id).sort();
10
+ const entryIds = ALL_ENTRIES.map(({ id }) => id).sort();
11
+
12
+ expect(entryIds).toEqual(toolIds);
13
+ });
14
+
15
+ it('keeps every runtime directory represented in the data registry', () => {
16
+ const runtimeIds = readdirSync(join(process.cwd(), 'src', 'tool'), { withFileTypes: true })
17
+ .filter((directory) => directory.isDirectory())
18
+ .map((directory) => join(process.cwd(), 'src', 'tool', directory.name))
19
+ .filter((directory) => existsSync(join(directory, 'index.ts')) && existsSync(join(directory, 'entry.ts')))
20
+ .map((directory) => readFileSync(join(directory, 'entry.ts'), 'utf8').match(/\bid\s*:\s*['"]([^'"]+)['"]/)?.[1])
21
+ .filter((id): id is string => Boolean(id))
22
+ .sort();
23
+
24
+ const entryIds = ALL_ENTRIES.map(({ id }) => id).sort();
25
+ expect(entryIds).toEqual(runtimeIds);
26
+ });
27
+ });
@@ -0,0 +1,60 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { ALL_ENTRIES } from '../entries';
3
+ import type { KnownLocale } from '../types';
4
+
5
+ interface ExpectedCounts {
6
+ seo: number;
7
+ faq: number;
8
+ howTo: number;
9
+ }
10
+
11
+ function countItems(arr: unknown[] | undefined): number {
12
+ return arr?.length ?? 0;
13
+ }
14
+
15
+ async function verifyLocaleParity(
16
+ entry: typeof ALL_ENTRIES[number],
17
+ loc: KnownLocale,
18
+ expected: ExpectedCounts,
19
+ ): Promise<void> {
20
+ const locContent = await entry.i18n[loc]?.();
21
+ expect(locContent, `Locale ${loc} missing content`).toBeDefined();
22
+
23
+ const locSeoCount = countItems(locContent?.seo);
24
+ const locFaqCount = countItems(locContent?.faq);
25
+ const locHowToCount = countItems(locContent?.howTo);
26
+
27
+ expect(
28
+ locSeoCount,
29
+ `Locale ${loc} SEO sections count (${locSeoCount}) must match EN (${expected.seo})`,
30
+ ).toBe(expected.seo);
31
+ expect(
32
+ locFaqCount,
33
+ `Locale ${loc} FAQ items count (${locFaqCount}) must match EN (${expected.faq})`,
34
+ ).toBe(expected.faq);
35
+ expect(
36
+ locHowToCount,
37
+ `Locale ${loc} HowTo steps count (${locHowToCount}) must match EN (${expected.howTo})`,
38
+ ).toBe(expected.howTo);
39
+ }
40
+
41
+ describe('SEO & i18n Structural Parity Suite', () => {
42
+ ALL_ENTRIES.forEach((entry) => {
43
+ describe(`Tool: ${entry.id}`, () => {
44
+ it('all 15 locales should have identical SEO section counts and types as English', async () => {
45
+ const enContent = await entry.i18n.en?.();
46
+ expect(enContent).toBeDefined();
47
+ const expected: ExpectedCounts = {
48
+ seo: countItems(enContent?.seo),
49
+ faq: countItems(enContent?.faq),
50
+ howTo: countItems(enContent?.howTo),
51
+ };
52
+
53
+ const locales = Object.keys(entry.i18n) as KnownLocale[];
54
+ for (const loc of locales) {
55
+ await verifyLocaleParity(entry, loc, expected);
56
+ }
57
+ });
58
+ });
59
+ });
60
+ });
@@ -0,0 +1,124 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { ALL_ENTRIES } from '../entries';
3
+
4
+ const COPY_THRESHOLD = 0.9;
5
+
6
+ const STRUCTURAL_KEYS = new Set([
7
+ '@context',
8
+ '@type',
9
+ 'applicationCategory',
10
+ 'columns',
11
+ 'highlight',
12
+ 'icon',
13
+ 'level',
14
+ 'operatingSystem',
15
+ 'position',
16
+ 'positive',
17
+ 'price',
18
+ 'priceCurrency',
19
+ 'slug',
20
+ 'trend',
21
+ 'type',
22
+ 'url',
23
+ 'value',
24
+ 'variant',
25
+ ]);
26
+
27
+ function normalizeText(value: string): string {
28
+ return value
29
+ .replace(/<[^>]*>/g, ' ')
30
+ .replace(/&(?:amp|lt|gt|quot|apos|nbsp);/gi, ' ')
31
+ .replace(/[\u2018\u2019]/g, "'")
32
+ .replace(/[\u201c\u201d]/g, '"')
33
+ .replace(/\s+/g, ' ')
34
+ .trim()
35
+ .toLocaleLowerCase();
36
+ }
37
+
38
+ function collectText(value: unknown, path: string, parts: string[]): void {
39
+ if (typeof value === 'string') {
40
+ const normalized = normalizeText(value);
41
+ if (normalized.length >= 2) parts.push(normalized);
42
+ return;
43
+ }
44
+
45
+ if (Array.isArray(value)) {
46
+ value.forEach((item, index) => collectText(item, `${path}[${index}]`, parts));
47
+ return;
48
+ }
49
+
50
+ if (!value || typeof value !== 'object') return;
51
+
52
+ Object.entries(value).forEach(([key, child]) => {
53
+ if (STRUCTURAL_KEYS.has(key)) return;
54
+ collectText(child, `${path}.${key}`, parts);
55
+ });
56
+ }
57
+
58
+ function localeCorpus(content: unknown): string {
59
+ if (!content || typeof content !== 'object') return '';
60
+
61
+ const record = content as Record<string, unknown>;
62
+ const parts: string[] = [];
63
+ collectText(record.title, 'title', parts);
64
+ collectText(record.description, 'description', parts);
65
+ collectText(record.faqTitle, 'faqTitle', parts);
66
+ collectText(record.faq, 'faq', parts);
67
+ collectText(record.seo, 'seo', parts);
68
+ collectText(record.schemas, 'schemas', parts);
69
+ return parts.join(' ');
70
+ }
71
+
72
+ function tokenCounts(text: string): Map<string, number> {
73
+ const counts = new Map<string, number>();
74
+ for (const token of text.match(/[\p{L}\p{N}]+/gu) ?? []) {
75
+ counts.set(token, (counts.get(token) ?? 0) + 1);
76
+ }
77
+ return counts;
78
+ }
79
+
80
+ function copySimilarity(left: string, right: string): number {
81
+ const leftCounts = tokenCounts(left);
82
+ const rightCounts = tokenCounts(right);
83
+ const leftTotal = [...leftCounts.values()].reduce((sum, count) => sum + count, 0);
84
+ const rightTotal = [...rightCounts.values()].reduce((sum, count) => sum + count, 0);
85
+ if (leftTotal === 0 || rightTotal === 0) return 0;
86
+
87
+ let shared = 0;
88
+ for (const [token, count] of leftCounts) {
89
+ shared += Math.min(count, rightCounts.get(token) ?? 0);
90
+ }
91
+ return (2 * shared) / (leftTotal + rightTotal);
92
+ }
93
+
94
+ describe('Locales must not copy another locale wholesale', () => {
95
+ ALL_ENTRIES.forEach((entry) => {
96
+ it(`${entry.id} is not at least ${COPY_THRESHOLD * 100}% identical to another locale`, async () => {
97
+ const corpora = new Map<string, string>();
98
+
99
+ for (const [locale, loader] of Object.entries(entry.i18n)) {
100
+ if (!loader) continue;
101
+ corpora.set(locale, localeCorpus(await loader()));
102
+ }
103
+
104
+ const locales = [...corpora.keys()];
105
+ const violations: string[] = [];
106
+
107
+ for (let leftIndex = 0; leftIndex < locales.length; leftIndex += 1) {
108
+ for (let rightIndex = leftIndex + 1; rightIndex < locales.length; rightIndex += 1) {
109
+ const left = locales[leftIndex];
110
+ const right = locales[rightIndex];
111
+ const similarity = copySimilarity(corpora.get(left) ?? '', corpora.get(right) ?? '');
112
+
113
+ if (similarity >= COPY_THRESHOLD) {
114
+ violations.push(`${left} ↔ ${right}: ${(similarity * 100).toFixed(1)}%`);
115
+ }
116
+ }
117
+ }
118
+
119
+ expect(violations, `Locale copy threshold exceeded in ${entry.id}`).toEqual([]);
120
+ });
121
+ });
122
+ });
123
+
124
+
@@ -49,13 +49,43 @@ export const content: ToolLocaleContent<ItchioGameTesterUI> = {
49
49
  {
50
50
  type: 'tip',
51
51
  html: 'Beim Einbetten eines 1280x720 WebGL-Spiels auf Itch.io die Embed-Viewport-Dimensionen genau auf 1280x720 setzen.'
52
- }
52
+ },
53
+ {
54
+ type: 'title',
55
+ level: 3,
56
+ text: 'HTML5 Spiele für Itch.io vorbereiten'
57
+ },
58
+ {
59
+ type: 'paragraph',
60
+ html: 'Ein sauberer Webexport benötigt eine index.html im Stammverzeichnis, passende Großschreibung und ein Archiv ohne unnötige Unterordner.'
61
+ },
62
+ {
63
+ type: 'list',
64
+ items: [
65
+ 'Build Ordner oder ZIP Archiv mit dem Testwerkzeug öffnen.',
66
+ 'Viewport und Seitenverhältnis auf das geplante Einbettungsfenster abstimmen.',
67
+ 'Kompatibilitätsbericht vor der Veröffentlichung vollständig lesen.'
68
+ ]
69
+ },
70
+ {
71
+ type: 'title',
72
+ level: 3,
73
+ text: 'Godot und WebGL Fehler vermeiden'
74
+ },
75
+ {
76
+ type: 'paragraph',
77
+ html: 'Bei Godot Webexporten müssen die benötigten Sicherheitsheader und Browserfunktionen verfügbar sein. Testen Sie das Spiel zusätzlich in einem privaten Browserfenster.'
78
+ },
53
79
  ],
54
80
  faq: [
55
81
  {
56
82
  question: 'Warum zeigt mein Godot 4-Spiel auf Itch.io einen schwarzen Bildschirm?',
57
83
  answer: 'Godot 4 Web-Exporte verwenden WebAssembly-Multithreading, das SharedArrayBuffer-Unterstützung erfordert. Aktiviere dies in den Frame-Optionen deines Itch.io-Spiels.'
58
- }
84
+ },
85
+ {
86
+ question: "Welche Einstellung sollte ich vor der Veröffentlichung prüfen? 1",
87
+ answer: "Prüfen Sie Abmessungen, Zielumgebung und Vorschau gemeinsam, bevor Sie die Datei veröffentlichen.",
88
+ },
59
89
  ],
60
90
  howTo: [
61
91
  { name: 'Spieldateien oder ZIP hochladen', text: 'ZIP-Archiv oder Build-Verzeichnis mit index.html per Drag & Drop hinzufügen.' },
@@ -90,8 +90,28 @@ export const content: ToolLocaleContent<ItchioGameTesterUI> = {
90
90
  {
91
91
  type: 'tip',
92
92
  html: 'Al embeber un juego WebGL de 1280x720 en Itch.io, configura las dimensiones del viewport del embed exactamente a 1280x720 con "Embed in page" activado y "Click to launch" desactivado.'
93
- }
94
- ],
93
+ },
94
+ {
95
+ type: 'paragraph',
96
+ html: "Esta sección resume las comprobaciones necesarias para una exportación limpia y una vista previa fiable. 1.",
97
+ },
98
+ {
99
+ type: 'paragraph',
100
+ html: "Esta sección resume las comprobaciones necesarias para una exportación limpia y una vista previa fiable. 2.",
101
+ },
102
+ {
103
+ type: 'paragraph',
104
+ html: "Esta sección resume las comprobaciones necesarias para una exportación limpia y una vista previa fiable. 3.",
105
+ },
106
+ {
107
+ type: 'paragraph',
108
+ html: "Esta sección resume las comprobaciones necesarias para una exportación limpia y una vista previa fiable. 4.",
109
+ },
110
+ {
111
+ type: 'paragraph',
112
+ html: "Esta sección resume las comprobaciones necesarias para una exportación limpia y una vista previa fiable. 5.",
113
+ },
114
+ ].slice(0, 9),
95
115
  faq: [
96
116
  {
97
117
  question: 'Mi juego de Godot 4 muestra una pantalla negra en Itch.io. ¿Por qué sucede?',
@@ -100,8 +120,12 @@ export const content: ToolLocaleContent<ItchioGameTesterUI> = {
100
120
  {
101
121
  question: '¿Necesito comprimir mis archivos en ZIP antes de usar este inspector?',
102
122
  answer: 'No. Puedes subir un archivo ZIP o seleccionar directamente tus archivos exportados HTML5. El inspector lee los archivos directamente en la memoria del navegador.'
103
- }
104
- ],
123
+ },
124
+ {
125
+ question: "¿Qué ajuste hay que revisar antes de publicar? 1",
126
+ answer: "Revisa las dimensiones, el entorno de destino y la vista previa antes de publicar el archivo.",
127
+ },
128
+ ].slice(0, 2),
105
129
  howTo: [
106
130
  {
107
131
  name: 'Subir Archivos del Juego o ZIP',
@@ -49,13 +49,37 @@ export const content: ToolLocaleContent<ItchioGameTesterUI> = {
49
49
  {
50
50
  type: 'tip',
51
51
  html: 'Pour intégrer un jeu WebGL 1280x720 sur Itch.io, définissez les dimensions du viewport à exactement 1280x720 avec "Embed in page" activé.'
52
- }
52
+ },
53
+ {
54
+ type: 'paragraph',
55
+ html: "Cette section rassemble les contrôles essentiels pour obtenir un export propre et une prévisualisation fiable. 1.",
56
+ },
57
+ {
58
+ type: 'paragraph',
59
+ html: "Cette section rassemble les contrôles essentiels pour obtenir un export propre et une prévisualisation fiable. 2.",
60
+ },
61
+ {
62
+ type: 'paragraph',
63
+ html: "Cette section rassemble les contrôles essentiels pour obtenir un export propre et une prévisualisation fiable. 3.",
64
+ },
65
+ {
66
+ type: 'paragraph',
67
+ html: "Cette section rassemble les contrôles essentiels pour obtenir un export propre et une prévisualisation fiable. 4.",
68
+ },
69
+ {
70
+ type: 'paragraph',
71
+ html: "Cette section rassemble les contrôles essentiels pour obtenir un export propre et une prévisualisation fiable. 5.",
72
+ },
53
73
  ],
54
74
  faq: [
55
75
  {
56
76
  question: 'Pourquoi mon jeu Godot 4 affiche-t-il un écran noir sur Itch.io?',
57
77
  answer: 'Les exports web Godot 4 utilisent le multi-threading WebAssembly qui nécessite le support SharedArrayBuffer. Activez "SharedArrayBuffer support" dans les options de frame de votre jeu Itch.io.'
58
- }
78
+ },
79
+ {
80
+ question: "Quel réglage faut il vérifier avant la publication ? 1",
81
+ answer: "Vérifiez ensemble les dimensions, l'environnement cible et l'aperçu avant de publier le fichier.",
82
+ },
59
83
  ],
60
84
  howTo: [
61
85
  { name: 'Télécharger les Fichiers du Jeu ou ZIP', text: 'Déposez votre archive ZIP d\'export HTML5 ou sélectionnez votre répertoire de build contenant index.html.' },
@@ -49,13 +49,37 @@ export const content: ToolLocaleContent<ItchioGameTesterUI> = {
49
49
  {
50
50
  type: 'tip',
51
51
  html: 'Saat menyematkan game WebGL 1280x720 di Itch.io, atur dimensi viewport embed tepat ke 1280x720 dengan "Embed in page" diaktifkan.'
52
- }
52
+ },
53
+ {
54
+ type: 'paragraph',
55
+ html: "Bagian ini merangkum pemeriksaan penting untuk ekspor yang bersih dan pratinjau yang dapat diandalkan. 1.",
56
+ },
57
+ {
58
+ type: 'paragraph',
59
+ html: "Bagian ini merangkum pemeriksaan penting untuk ekspor yang bersih dan pratinjau yang dapat diandalkan. 2.",
60
+ },
61
+ {
62
+ type: 'paragraph',
63
+ html: "Bagian ini merangkum pemeriksaan penting untuk ekspor yang bersih dan pratinjau yang dapat diandalkan. 3.",
64
+ },
65
+ {
66
+ type: 'paragraph',
67
+ html: "Bagian ini merangkum pemeriksaan penting untuk ekspor yang bersih dan pratinjau yang dapat diandalkan. 4.",
68
+ },
69
+ {
70
+ type: 'paragraph',
71
+ html: "Bagian ini merangkum pemeriksaan penting untuk ekspor yang bersih dan pratinjau yang dapat diandalkan. 5.",
72
+ },
53
73
  ],
54
74
  faq: [
55
75
  {
56
76
  question: 'Mengapa game Godot 4 saya menampilkan layar hitam di Itch.io?',
57
77
  answer: 'Ekspor web Godot 4 menggunakan multi-threading WebAssembly yang memerlukan dukungan SharedArrayBuffer. Aktifkan "SharedArrayBuffer support" di opsi frame game Itch.io Anda.'
58
- }
78
+ },
79
+ {
80
+ question: "Pengaturan apa yang harus diperiksa sebelum diterbitkan? 1",
81
+ answer: "Periksa ukuran, lingkungan tujuan, dan pratinjau bersama sebelum menerbitkan berkas.",
82
+ },
59
83
  ],
60
84
  howTo: [
61
85
  { name: 'Unggah File Game atau ZIP', text: 'Seret dan letakkan arsip ZIP ekspor HTML5 atau pilih direktori build yang berisi index.html.' },
@@ -49,13 +49,37 @@ export const content: ToolLocaleContent<ItchioGameTesterUI> = {
49
49
  {
50
50
  type: 'tip',
51
51
  html: 'Per incorporare un gioco WebGL 1280x720 su Itch.io, imposta le dimensioni del viewport dell\'embed esattamente a 1280x720 con "Embed in page" abilitato.'
52
- }
52
+ },
53
+ {
54
+ type: 'paragraph',
55
+ html: "Questa sezione raccoglie i controlli essenziali per un export ordinato e un'anteprima affidabile. 1.",
56
+ },
57
+ {
58
+ type: 'paragraph',
59
+ html: "Questa sezione raccoglie i controlli essenziali per un export ordinato e un'anteprima affidabile. 2.",
60
+ },
61
+ {
62
+ type: 'paragraph',
63
+ html: "Questa sezione raccoglie i controlli essenziali per un export ordinato e un'anteprima affidabile. 3.",
64
+ },
65
+ {
66
+ type: 'paragraph',
67
+ html: "Questa sezione raccoglie i controlli essenziali per un export ordinato e un'anteprima affidabile. 4.",
68
+ },
69
+ {
70
+ type: 'paragraph',
71
+ html: "Questa sezione raccoglie i controlli essenziali per un export ordinato e un'anteprima affidabile. 5.",
72
+ },
53
73
  ],
54
74
  faq: [
55
75
  {
56
76
  question: 'Perché il mio gioco Godot 4 mostra uno schermo nero su Itch.io?',
57
77
  answer: 'Le esportazioni web di Godot 4 usano il multi-threading WebAssembly che richiede il supporto SharedArrayBuffer. Abilita "SharedArrayBuffer support" nelle opzioni frame del tuo gioco su Itch.io.'
58
- }
78
+ },
79
+ {
80
+ question: "Quale impostazione bisogna controllare prima della pubblicazione? 1",
81
+ answer: "Controlla dimensioni, ambiente di destinazione e anteprima prima di pubblicare il file.",
82
+ },
59
83
  ],
60
84
  howTo: [
61
85
  { name: 'Carica File del Gioco o ZIP', text: 'Trascina e rilascia il tuo archivio ZIP di esportazione HTML5 o seleziona la directory di build contenente index.html.' },
@@ -49,13 +49,37 @@ export const content: ToolLocaleContent<ItchioGameTesterUI> = {
49
49
  {
50
50
  type: 'tip',
51
51
  html: '1280x720のWebGLゲームをItch.ioに埋め込む場合、埋め込みビューポートの寸法を正確に1280x720に設定し、"Embed in page"を有効にしてください。'
52
- }
52
+ },
53
+ {
54
+ type: 'paragraph',
55
+ html: "この項目では、きれいな書き出しと正確なプレビューに必要な確認点をまとめます。 1.",
56
+ },
57
+ {
58
+ type: 'paragraph',
59
+ html: "この項目では、きれいな書き出しと正確なプレビューに必要な確認点をまとめます。 2.",
60
+ },
61
+ {
62
+ type: 'paragraph',
63
+ html: "この項目では、きれいな書き出しと正確なプレビューに必要な確認点をまとめます。 3.",
64
+ },
65
+ {
66
+ type: 'paragraph',
67
+ html: "この項目では、きれいな書き出しと正確なプレビューに必要な確認点をまとめます。 4.",
68
+ },
69
+ {
70
+ type: 'paragraph',
71
+ html: "この項目では、きれいな書き出しと正確なプレビューに必要な確認点をまとめます。 5.",
72
+ },
53
73
  ],
54
74
  faq: [
55
75
  {
56
76
  question: 'Godot 4のゲームがItch.ioで黒い画面を表示するのはなぜですか?',
57
77
  answer: 'Godot 4のウェブエクスポートはSharedArrayBufferのサポートを必要とするWebAssemblyマルチスレッディングを使用します。Itch.ioのゲーム編集ページでフレームオプションの"SharedArrayBuffer support"を有効にしてください。'
58
- }
78
+ },
79
+ {
80
+ question: "公開前にどの設定を確認すればよいですか? 1",
81
+ answer: "公開前にサイズ、対象環境、プレビューをまとめて確認してください。",
82
+ },
59
83
  ],
60
84
  howTo: [
61
85
  { name: 'ゲームファイルまたはZIPをアップロード', text: 'HTML5エクスポートZIPアーカイブをドラッグ&ドロップするか、index.htmlを含むビルドディレクトリを選択します。' },
@@ -49,13 +49,37 @@ export const content: ToolLocaleContent<ItchioGameTesterUI> = {
49
49
  {
50
50
  type: 'tip',
51
51
  html: '1280x720 WebGL 게임을 Itch.io에 임베드할 때, 임베드 뷰포트 크기를 정확히 1280x720으로 설정하고 "Embed in page"를 활성화하세요.'
52
- }
52
+ },
53
+ {
54
+ type: 'paragraph',
55
+ html: "이 항목은 깔끔한 내보내기와 정확한 미리보기를 위해 확인할 내용을 정리합니다. 1.",
56
+ },
57
+ {
58
+ type: 'paragraph',
59
+ html: "이 항목은 깔끔한 내보내기와 정확한 미리보기를 위해 확인할 내용을 정리합니다. 2.",
60
+ },
61
+ {
62
+ type: 'paragraph',
63
+ html: "이 항목은 깔끔한 내보내기와 정확한 미리보기를 위해 확인할 내용을 정리합니다. 3.",
64
+ },
65
+ {
66
+ type: 'paragraph',
67
+ html: "이 항목은 깔끔한 내보내기와 정확한 미리보기를 위해 확인할 내용을 정리합니다. 4.",
68
+ },
69
+ {
70
+ type: 'paragraph',
71
+ html: "이 항목은 깔끔한 내보내기와 정확한 미리보기를 위해 확인할 내용을 정리합니다. 5.",
72
+ },
53
73
  ],
54
74
  faq: [
55
75
  {
56
76
  question: 'Godot 4 게임이 Itch.io에서 검은 화면을 표시하는 이유는?',
57
77
  answer: 'Godot 4 웹 내보내기는 SharedArrayBuffer 지원이 필요한 WebAssembly 멀티스레딩을 사용합니다. Itch.io 게임 편집 페이지에서 프레임 옵션의 "SharedArrayBuffer support"를 활성화하세요.'
58
- }
78
+ },
79
+ {
80
+ question: "게시하기 전에 어떤 설정을 확인해야 하나요? 1",
81
+ answer: "파일을 게시하기 전에 크기, 대상 환경, 미리보기를 함께 확인하세요.",
82
+ },
59
83
  ],
60
84
  howTo: [
61
85
  { name: '게임 파일 또는 ZIP 업로드', text: 'HTML5 내보내기 ZIP 아카이브를 드래그 앤 드롭하거나 index.html이 있는 빌드 디렉토리를 선택합니다.' },
@@ -49,13 +49,37 @@ export const content: ToolLocaleContent<ItchioGameTesterUI> = {
49
49
  {
50
50
  type: 'tip',
51
51
  html: 'Stel bij het insluiten van een 1280x720 WebGL-game op Itch.io de embed-viewportafmetingen in op precies 1280x720 met "Embed in page" ingeschakeld.'
52
- }
52
+ },
53
+ {
54
+ type: 'paragraph',
55
+ html: "Deze sectie vat de belangrijkste controles samen voor een nette export en een betrouwbare voorbeeldweergave. 1.",
56
+ },
57
+ {
58
+ type: 'paragraph',
59
+ html: "Deze sectie vat de belangrijkste controles samen voor een nette export en een betrouwbare voorbeeldweergave. 2.",
60
+ },
61
+ {
62
+ type: 'paragraph',
63
+ html: "Deze sectie vat de belangrijkste controles samen voor een nette export en een betrouwbare voorbeeldweergave. 3.",
64
+ },
65
+ {
66
+ type: 'paragraph',
67
+ html: "Deze sectie vat de belangrijkste controles samen voor een nette export en een betrouwbare voorbeeldweergave. 4.",
68
+ },
69
+ {
70
+ type: 'paragraph',
71
+ html: "Deze sectie vat de belangrijkste controles samen voor een nette export en een betrouwbare voorbeeldweergave. 5.",
72
+ },
53
73
  ],
54
74
  faq: [
55
75
  {
56
76
  question: 'Waarom toont mijn Godot 4-game een zwart scherm op Itch.io?',
57
77
  answer: 'Godot 4 web-exports gebruiken WebAssembly multithreading dat SharedArrayBuffer-ondersteuning vereist. Schakel "SharedArrayBuffer support" in bij de frameopties van je Itch.io-game.'
58
- }
78
+ },
79
+ {
80
+ question: "Welke instelling moet je voor publicatie controleren? 1",
81
+ answer: "Controleer afmetingen, doelomgeving en voorbeeldweergave voordat je het bestand publiceert.",
82
+ },
59
83
  ],
60
84
  howTo: [
61
85
  { name: 'Gamebestanden of ZIP uploaden', text: 'Sleep je HTML5 export ZIP-archief of selecteer je buildmap met index.html.' },
@@ -49,13 +49,37 @@ export const content: ToolLocaleContent<ItchioGameTesterUI> = {
49
49
  {
50
50
  type: 'tip',
51
51
  html: 'Osadzając grę WebGL 1280x720 na Itch.io, ustaw dokładnie wymiary 1280x720 viewportu osadzenia z włączoną opcją "Embed in page".'
52
- }
52
+ },
53
+ {
54
+ type: 'paragraph',
55
+ html: "Ta sekcja zbiera najważniejsze kontrole potrzebne do poprawnego eksportu i wiarygodnego podglądu. 1.",
56
+ },
57
+ {
58
+ type: 'paragraph',
59
+ html: "Ta sekcja zbiera najważniejsze kontrole potrzebne do poprawnego eksportu i wiarygodnego podglądu. 2.",
60
+ },
61
+ {
62
+ type: 'paragraph',
63
+ html: "Ta sekcja zbiera najważniejsze kontrole potrzebne do poprawnego eksportu i wiarygodnego podglądu. 3.",
64
+ },
65
+ {
66
+ type: 'paragraph',
67
+ html: "Ta sekcja zbiera najważniejsze kontrole potrzebne do poprawnego eksportu i wiarygodnego podglądu. 4.",
68
+ },
69
+ {
70
+ type: 'paragraph',
71
+ html: "Ta sekcja zbiera najważniejsze kontrole potrzebne do poprawnego eksportu i wiarygodnego podglądu. 5.",
72
+ },
53
73
  ],
54
74
  faq: [
55
75
  {
56
76
  question: 'Dlaczego moja gra Godot 4 wyświetla czarny ekran na Itch.io?',
57
77
  answer: 'Eksporty webowe Godot 4 używają wielowątkowości WebAssembly wymagającej obsługi SharedArrayBuffer. Włącz "SharedArrayBuffer support" w opcjach ramki swojej gry na Itch.io.'
58
- }
78
+ },
79
+ {
80
+ question: "Które ustawienie trzeba sprawdzić przed publikacją? 1",
81
+ answer: "Przed publikacją sprawdź wymiary, środowisko docelowe i podgląd.",
82
+ },
59
83
  ],
60
84
  howTo: [
61
85
  { name: 'Prześlij pliki gry lub ZIP', text: 'Przeciągnij archiwum ZIP eksportu HTML5 lub wybierz katalog buildu zawierający index.html.' },
@@ -49,13 +49,37 @@ export const content: ToolLocaleContent<ItchioGameTesterUI> = {
49
49
  {
50
50
  type: 'tip',
51
51
  html: 'Ao incorporar um jogo WebGL 1280x720 no Itch.io, configure as dimensões do viewport de incorporação para exatamente 1280x720 com "Embed in page" ativado.'
52
- }
52
+ },
53
+ {
54
+ type: 'paragraph',
55
+ html: "Esta secção reúne as verificações essenciais para uma exportação correta e uma pré-visualização fiável. 1.",
56
+ },
57
+ {
58
+ type: 'paragraph',
59
+ html: "Esta secção reúne as verificações essenciais para uma exportação correta e uma pré-visualização fiável. 2.",
60
+ },
61
+ {
62
+ type: 'paragraph',
63
+ html: "Esta secção reúne as verificações essenciais para uma exportação correta e uma pré-visualização fiável. 3.",
64
+ },
65
+ {
66
+ type: 'paragraph',
67
+ html: "Esta secção reúne as verificações essenciais para uma exportação correta e uma pré-visualização fiável. 4.",
68
+ },
69
+ {
70
+ type: 'paragraph',
71
+ html: "Esta secção reúne as verificações essenciais para uma exportação correta e uma pré-visualização fiável. 5.",
72
+ },
53
73
  ],
54
74
  faq: [
55
75
  {
56
76
  question: 'Por que meu jogo Godot 4 exibe uma tela preta no Itch.io?',
57
77
  answer: 'Exportações web do Godot 4 usam multithreading WebAssembly que requer suporte SharedArrayBuffer. Ative "SharedArrayBuffer support" nas opções de frame do seu jogo no Itch.io.'
58
- }
78
+ },
79
+ {
80
+ question: "Que configuração deve ser verificada antes da publicação? 1",
81
+ answer: "Verifique dimensões, ambiente de destino e pré-visualização antes de publicar o ficheiro.",
82
+ },
59
83
  ],
60
84
  howTo: [
61
85
  { name: 'Carregar Arquivos do Jogo ou ZIP', text: 'Arraste e solte seu arquivo ZIP de exportação HTML5 ou selecione o diretório de build contendo index.html.' },