@jjlmoya/utils-games-development 1.52.0 → 1.54.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 (70) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -1
  3. package/src/entries.ts +6 -2
  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/localizationSanitizer/app-client.ts +270 -0
  8. package/src/tool/localizationSanitizer/bibliography.astro +6 -0
  9. package/src/tool/localizationSanitizer/bibliography.ts +14 -0
  10. package/src/tool/localizationSanitizer/component.astro +116 -0
  11. package/src/tool/localizationSanitizer/csv-parser.ts +95 -0
  12. package/src/tool/localizationSanitizer/csv-sanitizer.ts +98 -0
  13. package/src/tool/localizationSanitizer/entry.ts +28 -0
  14. package/src/tool/localizationSanitizer/i18n/de.ts +176 -0
  15. package/src/tool/localizationSanitizer/i18n/en.ts +176 -0
  16. package/src/tool/localizationSanitizer/i18n/es.ts +176 -0
  17. package/src/tool/localizationSanitizer/i18n/fr.ts +176 -0
  18. package/src/tool/localizationSanitizer/i18n/id.ts +176 -0
  19. package/src/tool/localizationSanitizer/i18n/it.ts +176 -0
  20. package/src/tool/localizationSanitizer/i18n/ja.ts +176 -0
  21. package/src/tool/localizationSanitizer/i18n/ko.ts +176 -0
  22. package/src/tool/localizationSanitizer/i18n/nl.ts +176 -0
  23. package/src/tool/localizationSanitizer/i18n/pl.ts +176 -0
  24. package/src/tool/localizationSanitizer/i18n/pt.ts +176 -0
  25. package/src/tool/localizationSanitizer/i18n/ru.ts +176 -0
  26. package/src/tool/localizationSanitizer/i18n/sv.ts +176 -0
  27. package/src/tool/localizationSanitizer/i18n/tr.ts +176 -0
  28. package/src/tool/localizationSanitizer/i18n/zh.ts +176 -0
  29. package/src/tool/localizationSanitizer/index.ts +12 -0
  30. package/src/tool/localizationSanitizer/json-sanitizer.ts +118 -0
  31. package/src/tool/localizationSanitizer/localization-sanitizer.css +634 -0
  32. package/src/tool/localizationSanitizer/logic.test.ts +38 -0
  33. package/src/tool/localizationSanitizer/logic.ts +23 -0
  34. package/src/tool/localizationSanitizer/seo.astro +15 -0
  35. package/src/tool/localizationSanitizer/types.ts +55 -0
  36. package/src/tool/localizationSanitizer/ui.ts +39 -0
  37. package/src/tool/steamBbcodeTranslator/app-client.ts +125 -0
  38. package/src/tool/steamBbcodeTranslator/bbcode-parser.ts +110 -0
  39. package/src/tool/steamBbcodeTranslator/bibliography.astro +6 -0
  40. package/src/tool/steamBbcodeTranslator/bibliography.ts +14 -0
  41. package/src/tool/steamBbcodeTranslator/component.astro +83 -0
  42. package/src/tool/steamBbcodeTranslator/entry.ts +28 -0
  43. package/src/tool/steamBbcodeTranslator/html-parser.ts +42 -0
  44. package/src/tool/steamBbcodeTranslator/html-renderer.ts +71 -0
  45. package/src/tool/steamBbcodeTranslator/i18n/de.ts +207 -0
  46. package/src/tool/steamBbcodeTranslator/i18n/en.ts +236 -0
  47. package/src/tool/steamBbcodeTranslator/i18n/es.ts +207 -0
  48. package/src/tool/steamBbcodeTranslator/i18n/fr.ts +195 -0
  49. package/src/tool/steamBbcodeTranslator/i18n/id.ts +195 -0
  50. package/src/tool/steamBbcodeTranslator/i18n/it.ts +195 -0
  51. package/src/tool/steamBbcodeTranslator/i18n/ja.ts +195 -0
  52. package/src/tool/steamBbcodeTranslator/i18n/ko.ts +195 -0
  53. package/src/tool/steamBbcodeTranslator/i18n/nl.ts +195 -0
  54. package/src/tool/steamBbcodeTranslator/i18n/pl.ts +195 -0
  55. package/src/tool/steamBbcodeTranslator/i18n/pt.ts +195 -0
  56. package/src/tool/steamBbcodeTranslator/i18n/ru.ts +195 -0
  57. package/src/tool/steamBbcodeTranslator/i18n/sv.ts +195 -0
  58. package/src/tool/steamBbcodeTranslator/i18n/tr.ts +195 -0
  59. package/src/tool/steamBbcodeTranslator/i18n/zh.ts +195 -0
  60. package/src/tool/steamBbcodeTranslator/index.ts +12 -0
  61. package/src/tool/steamBbcodeTranslator/logic.test.ts +41 -0
  62. package/src/tool/steamBbcodeTranslator/logic.ts +96 -0
  63. package/src/tool/steamBbcodeTranslator/markdown-parser.ts +115 -0
  64. package/src/tool/steamBbcodeTranslator/markdown-renderer.ts +85 -0
  65. package/src/tool/steamBbcodeTranslator/seo.astro +15 -0
  66. package/src/tool/steamBbcodeTranslator/steam-bbcode-translator.css +392 -0
  67. package/src/tool/steamBbcodeTranslator/storage.ts +30 -0
  68. package/src/tool/steamBbcodeTranslator/types.ts +36 -0
  69. package/src/tool/steamBbcodeTranslator/ui.ts +18 -0
  70. package/src/tools.ts +4 -1
@@ -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およびUnityローカライズCSV整形ツール',
7
+ description: '翻訳CSVやJSONファイルの空セル、重複キー、壊れた行を検査し、ゲームエンジンに最適化されたクリーンなファイルをエクスポートします。',
8
+ ui: {
9
+ csvTab: 'CSVファイル',
10
+ jsonTab: 'JSONファイル',
11
+ dropTitle: '翻訳ファイルをドロップしてください',
12
+ dropSubtitle: 'ブラウザ上で構造を検証し、元ファイルはローカルに保持されます。',
13
+ browseButton: 'ファイルを選択',
14
+ sampleButton: 'サンプルを読み込む',
15
+ clearButton: 'クリア',
16
+ inputLabel: '翻訳ファイル入力',
17
+ formatLabel: 'フォーマット',
18
+ healthLabel: 'ファイルの状態',
19
+ readyStatus: 'インポート準備完了',
20
+ reviewStatus: '要確認',
21
+ emptyCellsLabel: '空セル',
22
+ duplicateKeysLabel: '重複キー',
23
+ malformedRowsLabel: '破損行',
24
+ cleanRowsLabel: '正常行',
25
+ issueListTitle: '検出項目',
26
+ noIssues: '問題は見つかりませんでした。',
27
+ previewTitle: '翻訳プレビュー',
28
+ previewSubtitle: '最初の数行にエクスポートされる正規化済み構造が表示されます。',
29
+ exportTitle: 'クリーンファイルをエクスポート',
30
+ exportSubtitle: '重複キーを排除し、不足列を補完してCSVエスケープを行います。',
31
+ downloadButton: 'クリーンファイルをダウンロード',
32
+ copyButton: '出力結果をコピー',
33
+ copiedMessage: 'クリーンな出力をクリップボードにコピーしました。',
34
+ emptyIssue: '空の翻訳セル',
35
+ duplicateIssue: '重複キーを除去',
36
+ malformedIssue: '列数または引用符の不一致',
37
+ parseIssue: 'ファイルを解析できませんでした。',
38
+ rowLabel: '行',
39
+ columnLabel: '列',
40
+ keyLabel: 'キー',
41
+ sampleFileName: 'localization-sample.csv',
42
+ privacyNote: 'ローカルブラウザ処理',
43
+ waitingTitle: 'ファイルを待機中',
44
+ waitingSubtitle: 'CSVまたはJSONファイルをドロップして検査を開始します。',
45
+ fileTypeNote: 'UTF8 CSVまたは構造化JSON',
46
+ },
47
+ seo: [
48
+ { type: 'title', level: 2, text: 'エンジンインポート時にローカライズファイルが破損する理由' },
49
+ {
50
+ type: 'paragraph',
51
+ html: '翻訳テーブルは編集が容易ですがフォーマットエラーが発生しやすい特徴があります。エスケープされていないカンマや引用符の欠落があると、列がずれ言語が乱れる原因になります。',
52
+ },
53
+ {
54
+ type: 'paragraph',
55
+ html: 'GodotやUnity Localizationは厳格なCSV構造を要求します。本ツールはインポート前に整合性をチェックし、安全なファイルを生成します。',
56
+ },
57
+ {
58
+ type: 'stats',
59
+ columns: 4,
60
+ items: [
61
+ { value: 'CSV', label: 'カンマ検証' },
62
+ { value: 'JSON', label: '配列/マップ対応' },
63
+ { value: '0 アップロード', label: '完全ローカル処理' },
64
+ { value: '1 クリック', label: '整形エクスポート' },
65
+ ],
66
+ },
67
+ { type: 'title', level: 2, text: '主なチェック機能' },
68
+ {
69
+ type: 'comparative',
70
+ columns: 2,
71
+ items: [
72
+ {
73
+ title: 'インポート前の問題検出',
74
+ description: '手動では見落としやすいエラー',
75
+ points: ['未翻訳の空セル', '重複する翻訳キー', '列数が合わない破損行', '不正な引用符構文'],
76
+ },
77
+ {
78
+ title: 'エクスポート時の正規化',
79
+ description: '自動補正処理',
80
+ points: ['足りない列のパディング', '余分な列の結合処理', '最初の重複キーの保持', '元ファイルの保護'],
81
+ },
82
+ ],
83
+ },
84
+ { type: 'title', level: 2, text: 'クリーンファイルの確認方法' },
85
+ {
86
+ type: 'paragraph',
87
+ html: '構造チェックは翻訳精度の確認ではありません。検出リストを参考に未翻訳部分を埋めてください。',
88
+ },
89
+ {
90
+ type: 'table',
91
+ headers: ['検出項目', '意味', '推奨される対応'],
92
+ rows: [
93
+ ['空セル', '言語列が空です', '翻訳を入力するか意図的な空値か確認'],
94
+ ['重複キー', '同じキーが複数存在します', '内容を確認して最初の行を採用'],
95
+ ['破損行', 'ヘッダーと列数が一致しません', '結合された最終列を確認'],
96
+ ['解析エラー', 'JSON構文エラー', 'インポート前にJSONを修正'],
97
+ ],
98
+ },
99
+ { type: 'title', level: 2, text: 'ゲーム開発におけるCSVルール' },
100
+ {
101
+ type: 'paragraph',
102
+ html: 'カンマや改行を含む文字列はダブルクォーテーションで囲む必要があります。',
103
+ },
104
+ {
105
+ type: 'tip',
106
+ title: 'オリジナルファイルを保管',
107
+ html: '作業前に必ず翻訳者から受け取った元ファイルのバックアップを取ってください。',
108
+ },
109
+ {
110
+ type: 'glossary',
111
+ items: [
112
+ { term: '翻訳キー', definition: 'ゲームコードから参照される文字列識別子。' },
113
+ { term: 'CSVフィールド', definition: '区切り文字間の個別の値。' },
114
+ { term: 'エスケープ', definition: '記号をテキストとして保持するための引用処理。' },
115
+ { term: 'ロケール', definition: 'jaやenなどの言語/地域識別コード。' },
116
+ ],
117
+ },
118
+ ],
119
+ faq: [
120
+ {
121
+ question: 'ファイルは外部サーバーに送信されますか?',
122
+ answer: 'いいえ、すべての処理はブラウザのメモリ内だけで行われます。',
123
+ },
124
+ {
125
+ question: 'CSVに余分なカンマがある場合はどうなりますか?',
126
+ answer: '破損行としてフラグが立てられ、余分なフィールドは最後の列に結合されます。',
127
+ },
128
+ {
129
+ question: '重複キーはどのように処理されますか?',
130
+ answer: '最初に出現した行が保持され、それ以降の重複行は除外されます。',
131
+ },
132
+ {
133
+ question: '翻訳の品質チェックも行えますか?',
134
+ answer: 'いいえ、本ツールはファイル構造と空セルの検証のみを行います。',
135
+ },
136
+ ],
137
+ howTo: [
138
+ { name: 'フォーマットを選択', text: 'CSVまたはJSONを選択します。' },
139
+ { name: '検出結果を確認', text: 'ファイルをドロップしてエラー一覧を確認します。' },
140
+ { name: 'エクスポートとテスト', text: '整形済みファイルをダウンロードしてゲームエンジンでテストします。' },
141
+ ],
142
+ schemas: [
143
+ {
144
+ '@context': 'https://schema.org',
145
+ '@type': 'SoftwareApplication',
146
+ name: 'GodotおよびUnityローカライズCSV整形ツール',
147
+ applicationCategory: 'DeveloperApplication',
148
+ operatingSystem: 'Any',
149
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'JPY' },
150
+ },
151
+ {
152
+ '@context': 'https://schema.org',
153
+ '@type': 'FAQPage',
154
+ mainEntity: [{
155
+ '@type': 'Question',
156
+ name: 'ファイルは外部サーバーに送信されますか?',
157
+ acceptedAnswer: { '@type': 'Answer', text: 'いいえ、すべての処理はブラウザのメモリ内だけで行われます。' },
158
+ }],
159
+ },
160
+ {
161
+ '@context': 'https://schema.org',
162
+ '@type': 'HowTo',
163
+ name: 'ローカライズファイルの整形手順',
164
+ step: [
165
+ { '@type': 'HowToStep', name: 'フォーマットを選択', text: 'CSVまたはJSONを選択します。' },
166
+ { '@type': 'HowToStep', name: '検出結果を確認', text: 'ファイルをドロップしてエラー一覧を確認します。' },
167
+ { '@type': 'HowToStep', name: 'エクスポートとテスト', text: '整形済みファイルをダウンロードしてゲームエンジンでテストします。' },
168
+ ],
169
+ },
170
+ ],
171
+ bibliography: [
172
+ { name: 'Godot ResourceImporterCSVTranslation ドキュメント', url: 'https://docs.godotengine.org/en/stable/classes/class_resourceimportercsvtranslation.html' },
173
+ { name: 'Unity Localization CSV インポート ドキュメント', url: 'https://docs.unity3d.com/Packages/com.unity.localization@1.5/manual/CSV.html' },
174
+ { name: 'RFC 4180 CSV 仕様', 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 및 Unity 로컬라이제이션 CSV 검증 및 정형 도구',
7
+ description: '번역 CSV 및 JSON 파일의 빈 셀, 중복 키, 손상된 행을 검사하고 게임 엔진에 즉시 임포트할 수 있는 정제된 파일을 내보냅니다.',
8
+ ui: {
9
+ csvTab: 'CSV 파일',
10
+ jsonTab: 'JSON 파일',
11
+ dropTitle: '번역 파일을 여기에 드롭하세요',
12
+ dropSubtitle: '브라우저에서 구조를 검사하며 원본 파일은 기기에 안전하게 유지됩니다.',
13
+ browseButton: '파일 탐색',
14
+ sampleButton: '샘플 로드',
15
+ clearButton: '초기화',
16
+ inputLabel: '번역 파일 입력',
17
+ formatLabel: '포맷',
18
+ healthLabel: '파일 상태',
19
+ readyStatus: '임포트 준비 완료',
20
+ reviewStatus: '검토 필요',
21
+ emptyCellsLabel: '빈 셀',
22
+ duplicateKeysLabel: '중복 키',
23
+ malformedRowsLabel: '손상된 행',
24
+ cleanRowsLabel: '정상 행',
25
+ issueListTitle: '검출 결과',
26
+ noIssues: '감지된 문제가 없습니다.',
27
+ previewTitle: '번역 미리보기',
28
+ previewSubtitle: '첫 번째 행들에 내보내질 정규화 구조가 표시됩니다.',
29
+ exportTitle: '정제된 파일 내보내기',
30
+ exportSubtitle: '중복 키를 제거하고 부족한 열을 채우며 CSV 이스케이프를 적용합니다.',
31
+ downloadButton: '정제 파일 다운로드',
32
+ copyButton: '결과 복사',
33
+ copiedMessage: '정제된 결과가 클립보드에 복사되었습니다.',
34
+ emptyIssue: '빈 번역 셀',
35
+ duplicateIssue: '중복 키 제거됨',
36
+ malformedIssue: '열 수 또는 따옴표 불일치',
37
+ parseIssue: '파일을 파싱할 수 없습니다.',
38
+ rowLabel: '행',
39
+ columnLabel: '열',
40
+ keyLabel: '키',
41
+ sampleFileName: 'localization-sample.csv',
42
+ privacyNote: '로컬 브라우저 처리',
43
+ waitingTitle: '파일 대기 중',
44
+ waitingSubtitle: 'CSV 또는 JSON 파일을 드롭하여 검사를 시작하세요.',
45
+ fileTypeNote: 'UTF8 CSV 또는 구조화된 JSON',
46
+ },
47
+ seo: [
48
+ { type: 'title', level: 2, text: '엔진 임포트 시 번역 파일 오류가 발생하는 이유' },
49
+ {
50
+ type: 'paragraph',
51
+ html: '번역 테이블은 편집하기 쉽지만 포맷 오류가 발생하기 쉽습니다. 문장 안의 쉼표나 따옴표 누락은 전체 언어 열을 어긋나게 만듭니다.',
52
+ },
53
+ {
54
+ type: 'paragraph',
55
+ html: 'Godot와 Unity Localization 패키지는 엄격한 CSV 포맷을 요구합니다. 본 도구는 임포트 전 구조를 검증하고 정상화합니다.',
56
+ },
57
+ {
58
+ type: 'stats',
59
+ columns: 4,
60
+ items: [
61
+ { value: 'CSV', label: '쉼표 검증' },
62
+ { value: 'JSON', label: '배열 및 맵 지원' },
63
+ { value: '0 업로드', label: '100% 로컬 처리' },
64
+ { value: '1 클릭', label: '정제 내보내기' },
65
+ ],
66
+ },
67
+ { type: 'title', level: 2, text: '검사 항목' },
68
+ {
69
+ type: 'comparative',
70
+ columns: 2,
71
+ items: [
72
+ {
73
+ title: '임포트 전 감지',
74
+ description: '육안으로 찾기 어려운 포맷 오류',
75
+ points: ['미번역 빈 셀', '중복 입력된 키', '열 수가 맞지 않는 손상 행', '잘못된 따옴표 구문'],
76
+ },
77
+ {
78
+ title: '내보내기 시 정규화',
79
+ description: '안전한 자동 보정',
80
+ points: ['부족한 열 패딩', '초과 열 결합 처리', '첫 번째 중복 키 유지', '원본 파일 보호'],
81
+ },
82
+ ],
83
+ },
84
+ { type: 'title', level: 2, text: '정제된 파일 검토 방법' },
85
+ {
86
+ type: 'paragraph',
87
+ html: '구조 정형이 언어적 검수를 대신하지는 않습니다. 검출 목록을 확인하여 누락된 번역을 보완하세요.',
88
+ },
89
+ {
90
+ type: 'table',
91
+ headers: ['검출 항목', '의미', '권장 조치'],
92
+ rows: [
93
+ ['빈 셀', '언어 열에 텍스트가 없음', '번역을 입력하거나 의도된 빈 값인지 확인'],
94
+ ['중복 키', '동일한 키가 여러 행에 존재', '내용을 비교한 뒤 첫 번째 행 적용'],
95
+ ['손상된 행', '헤더와 열 수가 불일치', '병합된 최종 열 확인'],
96
+ ['파싱 오류', '잘못된 JSON 구문', '임포트 전 JSON 수정'],
97
+ ],
98
+ },
99
+ { type: 'title', level: 2, text: '게임 번역용 CSV 규칙' },
100
+ {
101
+ type: 'paragraph',
102
+ html: '쉼표나 줄바꿈이 포함된 텍스트는 큰따옴표로 감싸야 합니다.',
103
+ },
104
+ {
105
+ type: 'tip',
106
+ title: '원본 파일 보관',
107
+ html: '번역가에게 전달받은 원본 파일의 백업을 반드시 유지하세요.',
108
+ },
109
+ {
110
+ type: 'glossary',
111
+ items: [
112
+ { term: '번역 키', definition: '게임 코드에서 식별자로 사용하는 고유 문자열.' },
113
+ { term: 'CSV 필드', definition: '구분자로 구분된 개별 값.' },
114
+ { term: '이스케이프', definition: '문장 부호를 텍스트로 유지하기 위한 따옴표 처리.' },
115
+ { term: '로케일', definition: 'ko, en, ja와 같은 언어 및 지역 코드.' },
116
+ ],
117
+ },
118
+ ],
119
+ faq: [
120
+ {
121
+ question: '파일이 서버로 업로드되나요?',
122
+ answer: '아니오, 모든 작업은 브라우저 내부에서만 실행됩니다.',
123
+ },
124
+ {
125
+ question: 'CSV 행에 쉼표가 더 있으면 어떻게 되나요?',
126
+ answer: '손상된 행으로 표시되며 초과 필드는 마지막 열로 병합됩니다.',
127
+ },
128
+ {
129
+ question: '중복 키는 어떻게 처리되나요?',
130
+ answer: '첫 번째 등장 행이 유지되고 이후 중복 행은 제거됩니다.',
131
+ },
132
+ {
133
+ question: '번역 품질도 검증하나요?',
134
+ answer: '아니오, 파일 구조와 빈 셀 유무만 검사합니다.',
135
+ },
136
+ ],
137
+ howTo: [
138
+ { name: '포맷 선택', text: 'CSV 또는 JSON을 선택합니다.' },
139
+ { name: '검출 결과 확인', text: '파일을 드롭하여 오류 항목을 검토합니다.' },
140
+ { name: '내보내기 및 테스트', text: '정제된 파일을 다운로드하여 게임 엔진에서 테스트합니다.' },
141
+ ],
142
+ schemas: [
143
+ {
144
+ '@context': 'https://schema.org',
145
+ '@type': 'SoftwareApplication',
146
+ name: 'Godot 및 Unity 로컬라이제이션 CSV 검증 및 정형 도구',
147
+ applicationCategory: 'DeveloperApplication',
148
+ operatingSystem: 'Any',
149
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'KRW' },
150
+ },
151
+ {
152
+ '@context': 'https://schema.org',
153
+ '@type': 'FAQPage',
154
+ mainEntity: [{
155
+ '@type': 'Question',
156
+ name: '파일이 서버로 업로드되나요?',
157
+ acceptedAnswer: { '@type': 'Answer', text: '아니오, 모든 작업은 브라우저 내부에서만 실행됩니다.' },
158
+ }],
159
+ },
160
+ {
161
+ '@context': 'https://schema.org',
162
+ '@type': 'HowTo',
163
+ name: '번역 파일 정제 절차',
164
+ step: [
165
+ { '@type': 'HowToStep', name: '포맷 선택', text: 'CSV 또는 JSON을 선택합니다.' },
166
+ { '@type': 'HowToStep', name: '검출 결과 확인', text: '파일을 드롭하여 오류 항목을 검토합니다.' },
167
+ { '@type': 'HowToStep', name: '내보내기 및 테스트', text: '정제된 파일을 다운로드하여 게임 엔진에서 테스트합니다.' },
168
+ ],
169
+ },
170
+ ],
171
+ bibliography: [
172
+ { name: 'Godot ResourceImporterCSVTranslation 문서', url: 'https://docs.godotengine.org/en/stable/classes/class_resourceimportercsvtranslation.html' },
173
+ { name: 'Unity Localization CSV 임포트 문서', url: 'https://docs.unity3d.com/Packages/com.unity.localization@1.5/manual/CSV.html' },
174
+ { name: 'RFC 4180 CSV 규격 문서', 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: 'lokalisatie-csv-opschonen-godot-unity',
6
+ title: 'Godot en Unity Lokalisatie CSV en JSON Opschoonhulp',
7
+ description: 'Inspecteer CSV of JSON vertaalbestanden op lege cellen, dubbele sleutels en beschadigde rijen en exporteer een schone kopie voor uw game engine.',
8
+ ui: {
9
+ csvTab: 'CSV bestand',
10
+ jsonTab: 'JSON bestand',
11
+ dropTitle: 'Sleep een vertaalbestand hierheen',
12
+ dropSubtitle: 'Inspecteer de structuur in uw browser en behoud het bronbestand op uw apparaat.',
13
+ browseButton: 'Bestanden zoeken',
14
+ sampleButton: 'Voorbeeld laden',
15
+ clearButton: 'Wis',
16
+ inputLabel: 'Invoer vertaalbestand',
17
+ formatLabel: 'Formaat',
18
+ healthLabel: 'Bestandsstatus',
19
+ readyStatus: 'Klaar voor import',
20
+ reviewStatus: 'Controle vereist',
21
+ emptyCellsLabel: 'Lege cellen',
22
+ duplicateKeysLabel: 'Dubbele sleutels',
23
+ malformedRowsLabel: 'Beschadigde rijen',
24
+ cleanRowsLabel: 'Schone rijen',
25
+ issueListTitle: 'Bevindingen',
26
+ noIssues: 'Geen problemen gevonden.',
27
+ previewTitle: 'Vertaalvoorbeeld',
28
+ previewSubtitle: 'De eerste rijen tonen de genormaliseerde structuur die geexporteerd wordt.',
29
+ exportTitle: 'Schoon bestand exporteren',
30
+ exportSubtitle: 'Dubbele sleutels worden verwijderd en ontbrekende kolommen opgevuld.',
31
+ downloadButton: 'Download schoon bestand',
32
+ copyButton: 'Kopieer resultaat',
33
+ copiedMessage: 'Resultaat gekopieerd naar klembord.',
34
+ emptyIssue: 'Lege vertaalcel',
35
+ duplicateIssue: 'Dubbele sleutel verwijderd',
36
+ malformedIssue: 'Kolom of aanhalingstekenartikel',
37
+ parseIssue: 'Bestand kon niet gelezen worden.',
38
+ rowLabel: 'Rij',
39
+ columnLabel: 'Kolom',
40
+ keyLabel: 'Sleutel',
41
+ sampleFileName: 'lokalisatie-voorbeeld.csv',
42
+ privacyNote: 'Lokale verwerking in browser',
43
+ waitingTitle: 'Wachten op bestand',
44
+ waitingSubtitle: 'Sleep een CSV of JSON bestand om de inspectie te starten.',
45
+ fileTypeNote: 'UTF8 CSV of gestructureerde JSON',
46
+ },
47
+ seo: [
48
+ { type: 'title', level: 2, text: 'Waarom lokalisatiebestanden fouten geven bij import' },
49
+ {
50
+ type: 'paragraph',
51
+ html: 'Vertaaltafels zijn eenvoudig aan te passen maar ook kwetsbaar voor opmaakfouten. Een komma in een tekst of een missend aanhalingsteken kan kolommen verschuiven.',
52
+ },
53
+ {
54
+ type: 'paragraph',
55
+ html: 'De Godot CSV importer en het Unity Localization pakket vereisen een strakke opbouw. Deze tool controleert uw bestanden vooraf.',
56
+ },
57
+ {
58
+ type: 'stats',
59
+ columns: 4,
60
+ items: [
61
+ { value: 'CSV', label: 'Kommacontrole' },
62
+ { value: 'JSON', label: 'Array & map ondersteuning' },
63
+ { value: '0 uploads', label: '100% lokaal' },
64
+ { value: '1 klik', label: 'Schone export' },
65
+ ],
66
+ },
67
+ { type: 'title', level: 2, text: 'Wat de tool controleert' },
68
+ {
69
+ type: 'comparative',
70
+ columns: 2,
71
+ items: [
72
+ {
73
+ title: 'Gedetecteerd voor import',
74
+ description: 'Moeilijk te vinden fouten in grote bestanden',
75
+ points: ['Leere cellen', 'Dubbele sleutels', 'Rijen met verkeerd aantal kolommen', 'Ongeldige aanhalingstekens'],
76
+ },
77
+ {
78
+ title: 'Genormaliseerd bij export',
79
+ description: 'Veilige automatische correcties',
80
+ points: ['Ontbrekende kolommen opgevuld', 'Extra kolommen samengevoegd', 'Eerste sleutel behouden', 'Origineel bestand blijft intact'],
81
+ },
82
+ ],
83
+ },
84
+ { type: 'title', level: 2, text: 'Het opgeschoonde bestand controleren' },
85
+ {
86
+ type: 'paragraph',
87
+ html: 'Structurele opschoning vervangt geen taalkundige controle. Gebruik de lijst met bevindingen om vertalingen aan te vullen.',
88
+ },
89
+ {
90
+ type: 'table',
91
+ headers: ['Bevinding', 'Betekenis', 'Vervolgactie'],
92
+ rows: [
93
+ ['Lege cel', 'Taalkolom bevat geen tekst', 'Vertaal of bevestig als bewust leeg'],
94
+ ['Dubbele sleutel', 'Meerdere rijen gebruiken dezelfde sleutel', 'Vergelijk rijen en gebruik de eerste'],
95
+ ['Beschadigde rij', 'Kolomaantal afwijkend', 'Controleer de samengevoegde kolom'],
96
+ ['Leesfout', 'JSON ongeldig', 'Herstel syntaxis voor import'],
97
+ ],
98
+ },
99
+ { type: 'title', level: 2, text: 'CSV conventies voor games' },
100
+ {
101
+ type: 'paragraph',
102
+ html: 'Tekst met komma s of nieuwe regels moet altijd tussen dubbele aanhalingstekens staan.',
103
+ },
104
+ {
105
+ type: 'tip',
106
+ title: 'Bewaar het origineel',
107
+ html: 'Behoud altijd het originele bronbestand van de vertaler ter vergelijking.',
108
+ },
109
+ {
110
+ type: 'glossary',
111
+ items: [
112
+ { term: 'Vertaalsleutel', definition: 'Unieke id gebruikt door de game code.' },
113
+ { term: 'CSV veld', definition: 'Enkele waarde tussen scheidingstekens.' },
114
+ { term: 'Escaping', definition: 'Aanhalingstekens om leestekens als tekst te behouden.' },
115
+ { term: 'Locale', definition: 'Taal en regio id zoals nl, en of ja.' },
116
+ ],
117
+ },
118
+ ],
119
+ faq: [
120
+ {
121
+ question: 'Worden er bestanden geupload?',
122
+ answer: 'Nee, alle verwerking vindt lokaal plaats in de browser.',
123
+ },
124
+ {
125
+ question: 'Wat gebeurt er bij extra komma s in een rij?',
126
+ answer: 'De rij wordt gemarkeerd en extra velden worden samengevoegd in de laatste kolom.',
127
+ },
128
+ {
129
+ question: 'Hoe worden dubbele sleutels opgelost?',
130
+ answer: 'De eerste rij blijft behouden, latere rijen worden weggelaten.',
131
+ },
132
+ {
133
+ question: 'Controleert de tool de vertaalkwaliteit?',
134
+ answer: 'Nee, alleen de bestandsstructuur en ontbrekende cellen.',
135
+ },
136
+ ],
137
+ howTo: [
138
+ { name: 'Kies formaat', text: 'Selecteer CSV of JSON.' },
139
+ { name: 'Controleer bevindingen', text: 'Sleep het bestand en bekijk de foutenlijst.' },
140
+ { name: 'Exporteer en test', text: 'Download het schone bestand en importeer het in uw engine.' },
141
+ ],
142
+ schemas: [
143
+ {
144
+ '@context': 'https://schema.org',
145
+ '@type': 'SoftwareApplication',
146
+ name: 'Godot en Unity Lokalisatie CSV en JSON Opschoonhulp',
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: 'Worden er bestanden geupload?',
157
+ acceptedAnswer: { '@type': 'Answer', text: 'Nee, alle verwerking vindt lokaal plaats in de browser.' },
158
+ }],
159
+ },
160
+ {
161
+ '@context': 'https://schema.org',
162
+ '@type': 'HowTo',
163
+ name: 'Lokalisatiebestand opschonen',
164
+ step: [
165
+ { '@type': 'HowToStep', name: 'Kies formaat', text: 'Selecteer CSV of JSON.' },
166
+ { '@type': 'HowToStep', name: 'Controleer bevindingen', text: 'Sleep het bestand en bekijk de foutenlijst.' },
167
+ { '@type': 'HowToStep', name: 'Exporteer en test', text: 'Download het schone bestand en importeer het in uw engine.' },
168
+ ],
169
+ },
170
+ ],
171
+ bibliography: [
172
+ { name: 'Godot ResourceImporterCSVTranslation Documentatie', url: 'https://docs.godotengine.org/en/stable/classes/class_resourceimportercsvtranslation.html' },
173
+ { name: 'Unity Localization CSV Import Documentatie', url: 'https://docs.unity3d.com/Packages/com.unity.localization@1.5/manual/CSV.html' },
174
+ { name: 'RFC 4180 CSV Specificatie', url: 'https://datatracker.ietf.org/doc/html/rfc4180' },
175
+ ],
176
+ };