@jjlmoya/utils-games-development 1.51.0 → 1.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -1
  3. package/src/entries.ts +7 -2
  4. package/src/tests/locale_completeness.test.ts +2 -2
  5. package/src/tests/tool_validation.test.ts +2 -2
  6. package/src/tool/localizationSanitizer/app-client.ts +270 -0
  7. package/src/tool/localizationSanitizer/bibliography.astro +6 -0
  8. package/src/tool/localizationSanitizer/bibliography.ts +14 -0
  9. package/src/tool/localizationSanitizer/component.astro +116 -0
  10. package/src/tool/localizationSanitizer/csv-parser.ts +95 -0
  11. package/src/tool/localizationSanitizer/csv-sanitizer.ts +98 -0
  12. package/src/tool/localizationSanitizer/entry.ts +28 -0
  13. package/src/tool/localizationSanitizer/i18n/de.ts +176 -0
  14. package/src/tool/localizationSanitizer/i18n/en.ts +176 -0
  15. package/src/tool/localizationSanitizer/i18n/es.ts +176 -0
  16. package/src/tool/localizationSanitizer/i18n/fr.ts +176 -0
  17. package/src/tool/localizationSanitizer/i18n/id.ts +176 -0
  18. package/src/tool/localizationSanitizer/i18n/it.ts +176 -0
  19. package/src/tool/localizationSanitizer/i18n/ja.ts +176 -0
  20. package/src/tool/localizationSanitizer/i18n/ko.ts +176 -0
  21. package/src/tool/localizationSanitizer/i18n/nl.ts +176 -0
  22. package/src/tool/localizationSanitizer/i18n/pl.ts +176 -0
  23. package/src/tool/localizationSanitizer/i18n/pt.ts +176 -0
  24. package/src/tool/localizationSanitizer/i18n/ru.ts +176 -0
  25. package/src/tool/localizationSanitizer/i18n/sv.ts +176 -0
  26. package/src/tool/localizationSanitizer/i18n/tr.ts +176 -0
  27. package/src/tool/localizationSanitizer/i18n/zh.ts +176 -0
  28. package/src/tool/localizationSanitizer/index.ts +12 -0
  29. package/src/tool/localizationSanitizer/json-sanitizer.ts +118 -0
  30. package/src/tool/localizationSanitizer/localization-sanitizer.css +634 -0
  31. package/src/tool/localizationSanitizer/logic.test.ts +38 -0
  32. package/src/tool/localizationSanitizer/logic.ts +23 -0
  33. package/src/tool/localizationSanitizer/seo.astro +15 -0
  34. package/src/tool/localizationSanitizer/types.ts +55 -0
  35. package/src/tool/localizationSanitizer/ui.ts +39 -0
  36. package/src/tool/saveFileEditor/bibliography.astro +6 -0
  37. package/src/tool/saveFileEditor/bibliography.ts +12 -0
  38. package/src/tool/saveFileEditor/component.astro +351 -0
  39. package/src/tool/saveFileEditor/entry.ts +28 -0
  40. package/src/tool/saveFileEditor/game-save-file-editor.css +250 -0
  41. package/src/tool/saveFileEditor/i18n/de.ts +182 -0
  42. package/src/tool/saveFileEditor/i18n/en.ts +182 -0
  43. package/src/tool/saveFileEditor/i18n/es.ts +182 -0
  44. package/src/tool/saveFileEditor/i18n/fr.ts +182 -0
  45. package/src/tool/saveFileEditor/i18n/id.ts +182 -0
  46. package/src/tool/saveFileEditor/i18n/it.ts +182 -0
  47. package/src/tool/saveFileEditor/i18n/ja.ts +182 -0
  48. package/src/tool/saveFileEditor/i18n/ko.ts +182 -0
  49. package/src/tool/saveFileEditor/i18n/nl.ts +182 -0
  50. package/src/tool/saveFileEditor/i18n/pl.ts +182 -0
  51. package/src/tool/saveFileEditor/i18n/pt.ts +182 -0
  52. package/src/tool/saveFileEditor/i18n/ru.ts +182 -0
  53. package/src/tool/saveFileEditor/i18n/sv.ts +182 -0
  54. package/src/tool/saveFileEditor/i18n/tr.ts +182 -0
  55. package/src/tool/saveFileEditor/i18n/zh.ts +182 -0
  56. package/src/tool/saveFileEditor/index.ts +11 -0
  57. package/src/tool/saveFileEditor/logic.test.ts +69 -0
  58. package/src/tool/saveFileEditor/logic.ts +139 -0
  59. package/src/tool/saveFileEditor/seo.astro +15 -0
  60. package/src/tool/saveFileEditor/ui.ts +24 -0
  61. package/src/tools.ts +4 -1
@@ -0,0 +1,28 @@
1
+ import type { GamesToolEntry, ToolLocaleContent } from '../../types';
2
+ import type { LocalizationSanitizerUI } from './ui';
3
+
4
+ export type { LocalizationSanitizerUI };
5
+
6
+ export type LocalizationSanitizerLocaleContent = ToolLocaleContent<LocalizationSanitizerUI>;
7
+
8
+ export const localizationSanitizer: GamesToolEntry<LocalizationSanitizerUI> = {
9
+ id: 'localization-sanitizer',
10
+ icons: { bg: 'mdi:gamepad-variant', fg: 'mdi:file-document-check-outline' },
11
+ i18n: {
12
+ de: () => import('./i18n/de').then((m) => m.content),
13
+ en: () => import('./i18n/en').then((m) => m.content),
14
+ es: () => import('./i18n/es').then((m) => m.content),
15
+ fr: () => import('./i18n/fr').then((m) => m.content),
16
+ id: () => import('./i18n/id').then((m) => m.content),
17
+ it: () => import('./i18n/it').then((m) => m.content),
18
+ ja: () => import('./i18n/ja').then((m) => m.content),
19
+ ko: () => import('./i18n/ko').then((m) => m.content),
20
+ nl: () => import('./i18n/nl').then((m) => m.content),
21
+ pl: () => import('./i18n/pl').then((m) => m.content),
22
+ pt: () => import('./i18n/pt').then((m) => m.content),
23
+ ru: () => import('./i18n/ru').then((m) => m.content),
24
+ sv: () => import('./i18n/sv').then((m) => m.content),
25
+ tr: () => import('./i18n/tr').then((m) => m.content),
26
+ zh: () => import('./i18n/zh').then((m) => m.content),
27
+ },
28
+ };
@@ -0,0 +1,176 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { LocalizationSanitizerUI } from '../ui';
3
+
4
+ export const content: ToolLocaleContent<LocalizationSanitizerUI> = {
5
+ slug: 'bereinigung-lokalisierungsdateien-godot-unity',
6
+ title: 'Godot und Unity Lokalisierungs CSV Bereinigung',
7
+ description: 'Pruefen Sie CSV oder JSON Uebersetzungsdateien auf leere Zellen, doppelte Schluessel und defekte Zeilen und exportieren Sie eine bereinigte Kopie.',
8
+ ui: {
9
+ csvTab: 'CSV Datei',
10
+ jsonTab: 'JSON Datei',
11
+ dropTitle: 'Uebersetzungsdatei hier ablegen',
12
+ dropSubtitle: 'Struktur im Browser pruefen und Quelldatei lokal behalten.',
13
+ browseButton: 'Dateien durchsuchen',
14
+ sampleButton: 'Beispiel laden',
15
+ clearButton: 'Leeren',
16
+ inputLabel: 'Uebersetzungsdateieingabe',
17
+ formatLabel: 'Format',
18
+ healthLabel: 'Dateizustand',
19
+ readyStatus: 'Bereit zum Import',
20
+ reviewStatus: 'Ueberpruefung erforderlich',
21
+ emptyCellsLabel: 'Leere Zellen',
22
+ duplicateKeysLabel: 'Doppelte Schluessel',
23
+ malformedRowsLabel: 'Defekte Zeilen',
24
+ cleanRowsLabel: 'Saubere Zeilen',
25
+ issueListTitle: 'Befunde',
26
+ noIssues: 'Keine Probleme in diesem Durchgang gefunden.',
27
+ previewTitle: 'Uebersetzungsvorschau',
28
+ previewSubtitle: 'Die ersten Zeilen zeigen die normalisierte Struktur fuer den Export.',
29
+ exportTitle: 'Saubere Datei exportieren',
30
+ exportSubtitle: 'Duplikate werden entfernt fehlende Spalten aufgefuellt und CSV Werte maskiert.',
31
+ downloadButton: 'Saubere Datei herunterladen',
32
+ copyButton: 'Ausgabe kopieren',
33
+ copiedMessage: 'Bereinigte Ausgabe in Zwischenablage kopiert.',
34
+ emptyIssue: 'Leere Uebersetzungszelle',
35
+ duplicateIssue: 'Doppelter Schluessel entfernt',
36
+ malformedIssue: 'Spalten oder Anfuehrungszeichenfehler',
37
+ parseIssue: 'Die Datei konnte nicht gelesen werden.',
38
+ rowLabel: 'Zeile',
39
+ columnLabel: 'Spalte',
40
+ keyLabel: 'Schluessel',
41
+ sampleFileName: 'lokalisierungs-beispiel.csv',
42
+ privacyNote: 'Lokale Browserverarbeitung',
43
+ waitingTitle: 'Warten auf eine Datei',
44
+ waitingSubtitle: 'Legen Sie eine CSV oder JSON Datei ab um die Pruefung zu starten.',
45
+ fileTypeNote: 'UTF8 CSV oder strukturiertes JSON',
46
+ },
47
+ seo: [
48
+ { type: 'title', level: 2, text: 'Warum Lokalisierungsdateien beim Engine Import fehlschlagen' },
49
+ {
50
+ type: 'paragraph',
51
+ html: 'Uebersetzungstabellen sind einfach zu bearbeiten und leicht zu beschaedigen. Ein Komma in einem Text oder fehlende Anfuehrungszeichen koennen alle Werte in die falsche Sprachspalte verschieben. Ein doppelter Schluessel führt ebenfalls zu Problemen beim Import.',
52
+ },
53
+ {
54
+ type: 'paragraph',
55
+ html: 'Der CSV Import von Godot erwartet eine Kopfzeile, eine erste Bezeichnerspalte und konsistente Uebersetzungsspalten. Das Unity Localization Paket nutzt ebenfalls CSV. Dieses Tool prueft die Struktur vor dem Import.',
56
+ },
57
+ {
58
+ type: 'stats',
59
+ columns: 4,
60
+ items: [
61
+ { value: 'CSV', label: 'Kommapruefung' },
62
+ { value: 'JSON', label: 'Array und Map Eingabe' },
63
+ { value: '0 Uploads', label: 'Nur im Browser' },
64
+ { value: '1 Klick', label: 'Sauberer Export' },
65
+ ],
66
+ },
67
+ { type: 'title', level: 2, text: 'Was das Tool ueberprueft' },
68
+ {
69
+ type: 'comparative',
70
+ columns: 2,
71
+ items: [
72
+ {
73
+ title: 'Vor dem Import erkannt',
74
+ description: 'Schwer zu findende Probleme in grossen Tabellen',
75
+ points: ['Leere Zellen', 'Doppelte Bezeichner', 'Zeilen mit fehlenden Spalten', 'Ungültige Anfuehrungszeichen'],
76
+ },
77
+ {
78
+ title: 'Fuer Export normalisiert',
79
+ description: 'Sichere automatische Reparaturen',
80
+ points: ['Fehlende Zellen werden aufgefuellt', 'Zusaetzliche Felder zusammengefuehrt', 'Erste Vorkommen behalten', 'Originaldatei bleibt unberuehrt'],
81
+ },
82
+ ],
83
+ },
84
+ { type: 'title', level: 2, text: 'Ueberpruefung der bereinigten Datei' },
85
+ {
86
+ type: 'paragraph',
87
+ html: 'Eine strukturelle Bereinigung ersetzt keine sprachliche Ueberpruefung. Nutzen Sie die Befundliste zur Nachbearbeitung.',
88
+ },
89
+ {
90
+ type: 'table',
91
+ headers: ['Befund', 'Bedeutung', 'Naechster Schritt'],
92
+ rows: [
93
+ ['Leere Zelle', 'Eine Sprachspalte ist leer', 'Uebersetzen oder als beabsichtigt bestaetigen'],
94
+ ['Doppelter Schluessel', 'Schluessel mehrfach vorhanden', 'Zeilen vergleichen und erste Vorkommen verwenden'],
95
+ ['Defekte Zeile', 'Spaltenanzahl weicht ab', 'Normalisiertes Ergebnis pruefen'],
96
+ ['Parse Fehler', 'JSON ungueltig', 'Syntax vor Import korrigieren'],
97
+ ],
98
+ },
99
+ { type: 'title', level: 2, text: 'CSV Konventionen fuer Spiele' },
100
+ {
101
+ type: 'paragraph',
102
+ html: 'Standard CSV Regeln: Felder sind durch Kommas getrennt, Sonderzeichen werden in Anfuehrungszeichen eingeschlossen.',
103
+ },
104
+ {
105
+ type: 'tip',
106
+ title: 'Originaldatei aufbewahren',
107
+ html: 'Vergleichen Sie den Export stets mit der Originaldatei vor der Einbindung ins Spiel.',
108
+ },
109
+ {
110
+ type: 'glossary',
111
+ items: [
112
+ { term: 'Uebersetzungsschluessel', definition: 'Stabil bezeichneter Bezeichner fuer einen Spieltext.' },
113
+ { term: 'CSV Feld', definition: 'Ein Einzelwert zwischen Trennzeichen.' },
114
+ { term: 'Escaping', definition: 'Einschluss in Anfuehrungszeichen fuer Sonderzeichen.' },
115
+ { term: 'Locale', definition: 'Sprach und Regionalkennung wie de oder en.' },
116
+ ],
117
+ },
118
+ ],
119
+ faq: [
120
+ {
121
+ question: 'Werden Dateien hochgeladen?',
122
+ answer: 'Nein, die Verarbeitung findet vollstaendig lokal im Browser statt.',
123
+ },
124
+ {
125
+ question: 'Was passiert bei zusaetzlichen Kommas?',
126
+ answer: 'Zusaetzliche Felder werden in die letzte Spalte zusammengefuehrt.',
127
+ },
128
+ {
129
+ question: 'Wie werden Duplikate bereinigt?',
130
+ answer: 'Das erste Vorkommen wird behalten, weitere werden entfernt.',
131
+ },
132
+ {
133
+ question: 'Prueft das Tool die Uebersetzungsqualitaet?',
134
+ answer: 'Nein, es prueft nur die Dateistruktur und Vollstaendigkeit.',
135
+ },
136
+ ],
137
+ howTo: [
138
+ { name: 'Dateiformat waehlen', text: 'Waehlen Sie CSV oder JSON aus.' },
139
+ { name: 'Befunde pruefen', text: 'Datei ablegen und Fehlerliste durchgehen.' },
140
+ { name: 'Exportieren und testen', text: 'Saubere Datei herunterladen und in der Engine testen.' },
141
+ ],
142
+ schemas: [
143
+ {
144
+ '@context': 'https://schema.org',
145
+ '@type': 'SoftwareApplication',
146
+ name: 'Godot und Unity Lokalisierungs CSV Bereinigung',
147
+ applicationCategory: 'DeveloperApplication',
148
+ operatingSystem: 'Any',
149
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
150
+ },
151
+ {
152
+ '@context': 'https://schema.org',
153
+ '@type': 'FAQPage',
154
+ mainEntity: [{
155
+ '@type': 'Question',
156
+ name: 'Werden Dateien hochgeladen?',
157
+ acceptedAnswer: { '@type': 'Answer', text: 'Nein, die Verarbeitung findet vollstaendig lokal im Browser statt.' },
158
+ }],
159
+ },
160
+ {
161
+ '@context': 'https://schema.org',
162
+ '@type': 'HowTo',
163
+ name: 'Lokalisierungsdatei bereinigen',
164
+ step: [
165
+ { '@type': 'HowToStep', name: 'Dateiformat waehlen', text: 'Waehlen Sie CSV oder JSON aus.' },
166
+ { '@type': 'HowToStep', name: 'Befunde pruefen', text: 'Datei ablegen und Fehlerliste durchgehen.' },
167
+ { '@type': 'HowToStep', name: 'Exportieren und testen', text: 'Saubere Datei herunterladen und in der Engine testen.' },
168
+ ],
169
+ },
170
+ ],
171
+ bibliography: [
172
+ { name: 'Godot ResourceImporterCSVTranslation Dokus', url: 'https://docs.godotengine.org/en/stable/classes/class_resourceimportercsvtranslation.html' },
173
+ { name: 'Unity Localization CSV Import Doku', url: 'https://docs.unity3d.com/Packages/com.unity.localization@1.5/manual/CSV.html' },
174
+ { name: 'RFC 4180 CSV Spezifikation', url: 'https://datatracker.ietf.org/doc/html/rfc4180' },
175
+ ],
176
+ };
@@ -0,0 +1,176 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { LocalizationSanitizerUI } from '../ui';
3
+
4
+ export const content: ToolLocaleContent<LocalizationSanitizerUI> = {
5
+ slug: 'localization-sanitizer',
6
+ title: 'Godot and Unity Localization CSV Sanitizer',
7
+ description: 'Inspect translation CSV or JSON files for empty cells, duplicate keys, and broken rows, then export a clean local copy ready for engine import.',
8
+ ui: {
9
+ csvTab: 'CSV file',
10
+ jsonTab: 'JSON file',
11
+ dropTitle: 'Drop a translation file here',
12
+ dropSubtitle: 'Inspect the structure in your browser and keep the source file on your device.',
13
+ browseButton: 'Browse files',
14
+ sampleButton: 'Load sample',
15
+ clearButton: 'Clear',
16
+ inputLabel: 'Translation file input',
17
+ formatLabel: 'Format',
18
+ healthLabel: 'File health',
19
+ readyStatus: 'Ready to import',
20
+ reviewStatus: 'Needs review',
21
+ emptyCellsLabel: 'Empty cells',
22
+ duplicateKeysLabel: 'Duplicate keys',
23
+ malformedRowsLabel: 'Broken rows',
24
+ cleanRowsLabel: 'Clean rows',
25
+ issueListTitle: 'Findings',
26
+ noIssues: 'No issues found in this pass.',
27
+ previewTitle: 'Translation preview',
28
+ previewSubtitle: 'The first rows show the normalized structure that will be exported.',
29
+ exportTitle: 'Export clean file',
30
+ exportSubtitle: 'Duplicates are removed missing columns are padded and CSV values are escaped again.',
31
+ downloadButton: 'Download clean file',
32
+ copyButton: 'Copy output',
33
+ copiedMessage: 'Clean output copied to clipboard.',
34
+ emptyIssue: 'Empty translation cell',
35
+ duplicateIssue: 'Duplicate key removed',
36
+ malformedIssue: 'Column or quote mismatch',
37
+ parseIssue: 'The file could not be parsed.',
38
+ rowLabel: 'Row',
39
+ columnLabel: 'Column',
40
+ keyLabel: 'Key',
41
+ sampleFileName: 'localization-sample.csv',
42
+ privacyNote: 'Local browser processing',
43
+ waitingTitle: 'Waiting for a file',
44
+ waitingSubtitle: 'Drop CSV or JSON to start the inspection.',
45
+ fileTypeNote: 'UTF8 CSV or structured JSON',
46
+ },
47
+ seo: [
48
+ { type: 'title', level: 2, text: 'Why localization files break during engine import' },
49
+ {
50
+ type: 'paragraph',
51
+ html: 'Translation tables are simple to edit and surprisingly easy to damage. A comma inside a phrase, a missing pair of quotes, or one row with a different number of fields can shift every value to the wrong language column. A repeated key can be just as disruptive because the engine no longer has one unambiguous source string to import.',
52
+ },
53
+ {
54
+ type: 'paragraph',
55
+ html: 'Godot CSV translation importer expects a header row, a first column of identifiers, and consistent translation columns. Unity Localization package also uses CSV to exchange string table data with translators. This sanitizer gives you a small inspection pass before you hand a file back to an engine: it checks the shape, highlights unfinished cells, keeps the first copy of a repeated key, and writes a normalized export.',
56
+ },
57
+ {
58
+ type: 'stats',
59
+ columns: 4,
60
+ items: [
61
+ { value: 'CSV', label: 'Quoted commas checked' },
62
+ { value: 'JSON', label: 'Array and map input' },
63
+ { value: '0 uploads', label: 'Browser-only workflow' },
64
+ { value: '1 click', label: 'Clean export' },
65
+ ],
66
+ },
67
+ { type: 'title', level: 2, text: 'What the sanitizer checks' },
68
+ {
69
+ type: 'comparative',
70
+ columns: 2,
71
+ items: [
72
+ {
73
+ title: 'Detected before import',
74
+ description: 'Problems that are hard to spot in a long translation table',
75
+ points: ['Empty language cells that still need a translation', 'Repeated identifiers that would create ambiguous rows', 'CSV records with missing or extra columns', 'Quotes that do not follow the normal CSV field rules'],
76
+ },
77
+ {
78
+ title: 'Normalized for export',
79
+ description: 'Small, predictable repairs that are safe to review',
80
+ points: ['Missing CSV cells are padded so every row matches the header', 'Extra CSV fields are joined into the final cell and escaped', 'The first row for a duplicate key is retained', 'The original file remains untouched for comparison or rollback'],
81
+ },
82
+ ],
83
+ },
84
+ { type: 'title', level: 2, text: 'How to review a cleaned localization file' },
85
+ {
86
+ type: 'paragraph',
87
+ html: 'A clean parse is a structural result, not a language review. Use the findings list to locate missing work, then read the exported file in the engine that will consume it. Check that the identifier column is the column your project expects, that locale headers match the project settings, and that intentional empty values are understood by the runtime. The sanitizer does not judge grammar, placeholders, plural rules, or context-sensitive terminology.',
88
+ },
89
+ {
90
+ type: 'table',
91
+ headers: ['Finding', 'What it means', 'Next action'],
92
+ rows: [
93
+ ['Empty cell', 'A non-key column contains no text', 'Translate it or confirm that an empty value is intentional'],
94
+ ['Duplicate key', 'More than one row uses the same identifier', 'Compare the rows before keeping the exported first occurrence'],
95
+ ['Broken row', 'The row shape or quote syntax differs from the header', 'Review the normalized final cell and compare with the source'],
96
+ ['Parse error', 'The JSON structure cannot be read', 'Fix the syntax in a JSON editor before importing'],
97
+ ],
98
+ },
99
+ { type: 'title', level: 2, text: 'CSV conventions that matter for game localization' },
100
+ {
101
+ type: 'paragraph',
102
+ html: 'The common CSV rules are deliberately modest: fields are separated by commas, records have a consistent field count, and a field containing a comma, a line break, or a quote can be enclosed in double quotes. A quote inside a quoted field is represented by two quotes. These details matter for translated phrases because punctuation is part of natural language, not a reliable delimiter.',
103
+ },
104
+ {
105
+ type: 'tip',
106
+ title: 'Keep the original beside the clean export',
107
+ html: 'The export is a repair aid, not a replacement for source control. Keep the translator original file, inspect any broken row whose comma was joined into the final column, and run the cleaned file through the target engine before committing it to your project.',
108
+ },
109
+ {
110
+ type: 'glossary',
111
+ items: [
112
+ { term: 'Translation key', definition: 'A stable identifier used by game code to request a localized string.' },
113
+ { term: 'CSV field', definition: 'One value between separators in a comma-separated record.' },
114
+ { term: 'Escaping', definition: 'The quoting convention that lets punctuation remain part of a value instead of becoming a separator.' },
115
+ { term: 'Locale', definition: 'A language and regional convention such as en, es, or ja used to select a translation column.' },
116
+ ],
117
+ },
118
+ ],
119
+ faq: [
120
+ {
121
+ question: 'Does this tool upload my translation file?',
122
+ answer: 'No network upload is used by the sanitizer interface. The selected text is read by the browser, analyzed locally, and turned into a download in the same browser session. As with any web tool, review your site own analytics and deployment policy if you embed or customize this component.',
123
+ },
124
+ {
125
+ question: 'What happens when a CSV row has an extra comma?',
126
+ answer: 'The row is flagged as malformed and the extra fields are joined into the final column before export. This is useful for the common case where a last translation contains an unescaped comma, but you should review the flagged row because a comma in a middle column cannot be inferred with certainty.',
127
+ },
128
+ {
129
+ question: 'How are duplicate translation keys cleaned?',
130
+ answer: 'The first occurrence is kept in the clean output and later occurrences are omitted from the exported file. The findings list shows each removed duplicate so you can compare the source rows and decide whether the first row is the intended one.',
131
+ },
132
+ {
133
+ question: 'Can it validate the quality of a translation?',
134
+ answer: 'It checks file structure and missing values, not grammar or meaning. It does not validate placeholders, plurals, gender, context, or whether the wording is correct for your game. Those checks still need a translator, reviewer, or engine-specific validation step.',
135
+ },
136
+ ],
137
+ howTo: [
138
+ { name: 'Choose the file format', text: 'Select CSV or JSON, or let the tool detect the format from the file name and contents.' },
139
+ { name: 'Inspect the findings', text: 'Drop the translation file, review the health score, and use the findings list to locate empty cells, duplicate keys, and malformed rows.' },
140
+ { name: 'Export and test', text: 'Download or copy the normalized output, compare any repaired rows with the original, and import it into your Godot or Unity project.' },
141
+ ],
142
+ schemas: [
143
+ {
144
+ '@context': 'https://schema.org',
145
+ '@type': 'SoftwareApplication',
146
+ name: 'Godot and Unity Localization CSV Sanitizer',
147
+ applicationCategory: 'DeveloperApplication',
148
+ operatingSystem: 'Any',
149
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
150
+ },
151
+ {
152
+ '@context': 'https://schema.org',
153
+ '@type': 'FAQPage',
154
+ mainEntity: [{
155
+ '@type': 'Question',
156
+ name: 'What happens when a CSV row has an extra comma?',
157
+ acceptedAnswer: { '@type': 'Answer', text: 'The row is flagged as malformed and the extra fields are joined into the final column before export for review.' },
158
+ }],
159
+ },
160
+ {
161
+ '@context': 'https://schema.org',
162
+ '@type': 'HowTo',
163
+ name: 'How to sanitize a game localization file',
164
+ step: [
165
+ { '@type': 'HowToStep', name: 'Choose the file format', text: 'Select CSV or JSON and load the translation file.' },
166
+ { '@type': 'HowToStep', name: 'Inspect the findings', text: 'Review empty cells, duplicate keys, and malformed rows.' },
167
+ { '@type': 'HowToStep', name: 'Export and test', text: 'Download the clean output and import it into the target engine.' },
168
+ ],
169
+ },
170
+ ],
171
+ bibliography: [
172
+ { name: 'Godot ResourceImporterCSVTranslation Documentation', url: 'https://docs.godotengine.org/en/stable/classes/class_resourceimportercsvtranslation.html' },
173
+ { name: 'Unity Localization CSV Import and Export Documentation', url: 'https://docs.unity3d.com/Packages/com.unity.localization@1.5/manual/CSV.html' },
174
+ { name: 'RFC 4180 Common Format and MIME Type for CSV Files', url: 'https://datatracker.ietf.org/doc/html/rfc4180' },
175
+ ],
176
+ };
@@ -0,0 +1,176 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { LocalizationSanitizerUI } from '../ui';
3
+
4
+ export const content: ToolLocaleContent<LocalizationSanitizerUI> = {
5
+ slug: 'depurador-csv-localizacion-godot-unity',
6
+ title: 'Depurador de Archivos CSV y JSON de Localizacion para Godot y Unity',
7
+ description: 'Inspeccione archivos CSV o JSON de traduccion en busca de celdas vacias, claves duplicadas y filas defectuosas, y exporte una copia limpia lista para el motor.',
8
+ ui: {
9
+ csvTab: 'Archivo CSV',
10
+ jsonTab: 'Archivo JSON',
11
+ dropTitle: 'Arrastre un archivo de traduccion aqui',
12
+ dropSubtitle: 'Inspeccione la estructura en su navegador conservando el archivo fuente en su equipo.',
13
+ browseButton: 'Buscar archivos',
14
+ sampleButton: 'Cargar ejemplo',
15
+ clearButton: 'Limpiar',
16
+ inputLabel: 'Entrada de archivo de traduccion',
17
+ formatLabel: 'Formato',
18
+ healthLabel: 'Estado del archivo',
19
+ readyStatus: 'Listo para importar',
20
+ reviewStatus: 'Requiere revision',
21
+ emptyCellsLabel: 'Celdas vacias',
22
+ duplicateKeysLabel: 'Claves duplicadas',
23
+ malformedRowsLabel: 'Filas defectuosas',
24
+ cleanRowsLabel: 'Filas limpias',
25
+ issueListTitle: 'Hallazgos',
26
+ noIssues: 'No se encontraron problemas en este analisis.',
27
+ previewTitle: 'Vista previa de traduccion',
28
+ previewSubtitle: 'Las primeras filas muestran la estructura normalizada que se exportara.',
29
+ exportTitle: 'Exportar archivo limpio',
30
+ exportSubtitle: 'Se eliminan duplicados, se rellenan columnas faltantes y se escapan valores CSV.',
31
+ downloadButton: 'Descargar archivo limpio',
32
+ copyButton: 'Copiar resultado',
33
+ copiedMessage: 'Resultado limpio copiado al portapapeles.',
34
+ emptyIssue: 'Celda de traduccion vacia',
35
+ duplicateIssue: 'Clave duplicada eliminada',
36
+ malformedIssue: 'Disparidad de columnas o comillas',
37
+ parseIssue: 'No se pudo analizar el archivo.',
38
+ rowLabel: 'Fila',
39
+ columnLabel: 'Columna',
40
+ keyLabel: 'Clave',
41
+ sampleFileName: 'ejemplo-localizacion.csv',
42
+ privacyNote: 'Procesamiento local en el navegador',
43
+ waitingTitle: 'Esperando un archivo',
44
+ waitingSubtitle: 'Arrastre un archivo CSV o JSON para comenzar la inspeccion.',
45
+ fileTypeNote: 'CSV UTF-8 o JSON estructurado',
46
+ },
47
+ seo: [
48
+ { type: 'title', level: 2, text: 'Por que los archivos de localizacion fallan al importar en el motor' },
49
+ {
50
+ type: 'paragraph',
51
+ html: 'Las tablas de traduccion son sencillas de editar pero faciles de dañar. Una coma dentro de una frase o comillas faltantes pueden desplazar los valores a la columna de idioma incorrecta. Una clave duplicada genera ambiguedad al importar.',
52
+ },
53
+ {
54
+ type: 'paragraph',
55
+ html: 'El importador CSV de Godot requiere una fila de cabecera, una primera columna de identificadores y columnas de idioma consistentes. Unity Localization tambien utiliza CSV. Esta herramienta valida y normaliza la estructura antes de la importacion.',
56
+ },
57
+ {
58
+ type: 'stats',
59
+ columns: 4,
60
+ items: [
61
+ { value: 'CSV', label: 'Verificacion de comas' },
62
+ { value: 'JSON', label: 'Entrada de matrices y mapas' },
63
+ { value: '0 subidas', label: 'Procesamiento local' },
64
+ { value: '1 clic', label: 'Exportacion limpia' },
65
+ ],
66
+ },
67
+ { type: 'title', level: 2, text: 'Que verifica el depurador' },
68
+ {
69
+ type: 'comparative',
70
+ columns: 2,
71
+ items: [
72
+ {
73
+ title: 'Detectado antes de importar',
74
+ description: 'Problemas dificiles de detectar a simple vista',
75
+ points: ['Celdas de idioma vacias', 'Claves duplicadas', 'Registros con columnas sobrantes o faltantes', 'Sintaxis de comillas invalida'],
76
+ },
77
+ {
78
+ title: 'Normalizado para exportar',
79
+ description: 'Correcciones seguras y predecibles',
80
+ points: ['Columnas faltantes rellenadas', 'Campos extra unidos en la ultima columna', 'Se conserva la primera aparicion de clave', 'El archivo original no se modifica'],
81
+ },
82
+ ],
83
+ },
84
+ { type: 'title', level: 2, text: 'Como revisar el archivo depurado' },
85
+ {
86
+ type: 'paragraph',
87
+ html: 'La limpieza estructural no reemplaza la revision linguistica. Utilice la lista de hallazgos para completar traducciones pendientes.',
88
+ },
89
+ {
90
+ type: 'table',
91
+ headers: ['Hallazgo', 'Significado', 'Accion recomendada'],
92
+ rows: [
93
+ ['Celda vacia', 'Una columna de idioma no contiene texto', 'Traduzca o confirme si es intencional'],
94
+ ['Clave duplicada', 'Mas de una fila usa el mismo identificador', 'Compare las filas antes de usar la primera aparicion'],
95
+ ['Fila defectuosa', 'Estructura o comillas no coinciden con la cabecera', 'Revise la celda final normalizada'],
96
+ ['Error de analisis', 'El archivo JSON no se puede leer', 'Corrija la sintaxis antes de importar'],
97
+ ],
98
+ },
99
+ { type: 'title', level: 2, text: 'Convenciones CSV para videojuegos' },
100
+ {
101
+ type: 'paragraph',
102
+ html: 'Las reglas CSV basicas exigen campos separados por comas y delimitacion con comillas dobles cuando existen signos de puntuacion.',
103
+ },
104
+ {
105
+ type: 'tip',
106
+ title: 'Conserve el archivo original',
107
+ html: 'Mantenga el archivo original del traductor y pruebe la version limpia en el motor antes de confirmar cambios.',
108
+ },
109
+ {
110
+ type: 'glossary',
111
+ items: [
112
+ { term: 'Clave de traduccion', definition: 'Identificador unico utilizado por el codigo del juego.' },
113
+ { term: 'Campo CSV', definition: 'Valor individual entre delimitadores.' },
114
+ { term: 'Escapado', definition: 'Uso de comillas para mantener la puntuacion como texto.' },
115
+ { term: 'Locale', definition: 'Codigo de idioma y region como es, en o ja.' },
116
+ ],
117
+ },
118
+ ],
119
+ faq: [
120
+ {
121
+ question: '¿Se suben los archivos a un servidor?',
122
+ answer: 'No, todo el procesamiento se realiza localmente en el navegador.',
123
+ },
124
+ {
125
+ question: '¿Que ocurre si una fila CSV tiene comas adicionales?',
126
+ answer: 'La fila se marca como defectuosa y los campos extra se unen en la columna final.',
127
+ },
128
+ {
129
+ question: '¿Como se limpian las claves duplicadas?',
130
+ answer: 'Se conserva la primera aparicion y las siguientes se omiten del archivo limpio.',
131
+ },
132
+ {
133
+ question: '¿Valida la calidad de la traduccion?',
134
+ answer: 'No, solo verifica la estructura del archivo y campos faltantes.',
135
+ },
136
+ ],
137
+ howTo: [
138
+ { name: 'Seleccionar formato', text: 'Elija CSV o JSON.' },
139
+ { name: 'Inspeccionar hallazgos', text: 'Cargue el archivo y revise la lista de inconsistencias.' },
140
+ { name: 'Exportar y probar', text: 'Descargue la version limpia e importela en su motor.' },
141
+ ],
142
+ schemas: [
143
+ {
144
+ '@context': 'https://schema.org',
145
+ '@type': 'SoftwareApplication',
146
+ name: 'Depurador de Archivos CSV y JSON de Localizacion para Godot y Unity',
147
+ applicationCategory: 'DeveloperApplication',
148
+ operatingSystem: 'Any',
149
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
150
+ },
151
+ {
152
+ '@context': 'https://schema.org',
153
+ '@type': 'FAQPage',
154
+ mainEntity: [{
155
+ '@type': 'Question',
156
+ name: '¿Se suben los archivos a un servidor?',
157
+ acceptedAnswer: { '@type': 'Answer', text: 'No, todo el procesamiento se realiza localmente en el navegador.' },
158
+ }],
159
+ },
160
+ {
161
+ '@context': 'https://schema.org',
162
+ '@type': 'HowTo',
163
+ name: 'Como depurar un archivo de localizacion',
164
+ step: [
165
+ { '@type': 'HowToStep', name: 'Seleccionar formato', text: 'Elija CSV o JSON.' },
166
+ { '@type': 'HowToStep', name: 'Inspeccionar hallazgos', text: 'Cargue el archivo y revise la lista de inconsistencias.' },
167
+ { '@type': 'HowToStep', name: 'Exportar y probar', text: 'Descargue la version limpia e importela en su motor.' },
168
+ ],
169
+ },
170
+ ],
171
+ bibliography: [
172
+ { name: 'Documentacion ResourceImporterCSVTranslation de Godot', url: 'https://docs.godotengine.org/en/stable/classes/class_resourceimportercsvtranslation.html' },
173
+ { name: 'Documentacion de importacion CSV en Unity Localization', url: 'https://docs.unity3d.com/Packages/com.unity.localization@1.5/manual/CSV.html' },
174
+ { name: 'Especificacion RFC 4180 CSV', url: 'https://datatracker.ietf.org/doc/html/rfc4180' },
175
+ ],
176
+ };