@jjlmoya/utils-audiovisual 1.7.0 → 1.9.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 (152) hide show
  1. package/package.json +2 -1
  2. package/src/category/i18n/de.ts +198 -0
  3. package/src/category/i18n/id.ts +198 -0
  4. package/src/category/i18n/it.ts +198 -0
  5. package/src/category/i18n/ja.ts +198 -0
  6. package/src/category/i18n/ko.ts +198 -0
  7. package/src/category/i18n/nl.ts +198 -0
  8. package/src/category/i18n/pl.ts +198 -0
  9. package/src/category/i18n/pt.ts +198 -0
  10. package/src/category/i18n/ru.ts +198 -0
  11. package/src/category/i18n/sv.ts +198 -0
  12. package/src/category/i18n/tr.ts +198 -0
  13. package/src/category/i18n/zh.ts +198 -0
  14. package/src/category/index.ts +31 -3
  15. package/src/tests/i18n_coverage.test.ts +36 -0
  16. package/src/tests/slug_uniqueness.test.ts +81 -0
  17. package/src/tool/chromaticLens/i18n/de.ts +246 -0
  18. package/src/tool/chromaticLens/i18n/id.ts +246 -0
  19. package/src/tool/chromaticLens/i18n/it.ts +246 -0
  20. package/src/tool/chromaticLens/i18n/ja.ts +246 -0
  21. package/src/tool/chromaticLens/i18n/ko.ts +246 -0
  22. package/src/tool/chromaticLens/i18n/nl.ts +246 -0
  23. package/src/tool/chromaticLens/i18n/pl.ts +246 -0
  24. package/src/tool/chromaticLens/i18n/pt.ts +246 -0
  25. package/src/tool/chromaticLens/i18n/ru.ts +246 -0
  26. package/src/tool/chromaticLens/i18n/sv.ts +246 -0
  27. package/src/tool/chromaticLens/i18n/tr.ts +246 -0
  28. package/src/tool/chromaticLens/i18n/zh.ts +246 -0
  29. package/src/tool/chromaticLens/index.ts +15 -7
  30. package/src/tool/collageMaker/i18n/de.ts +233 -0
  31. package/src/tool/collageMaker/i18n/id.ts +233 -0
  32. package/src/tool/collageMaker/i18n/it.ts +233 -0
  33. package/src/tool/collageMaker/i18n/ja.ts +233 -0
  34. package/src/tool/collageMaker/i18n/ko.ts +233 -0
  35. package/src/tool/collageMaker/i18n/nl.ts +233 -0
  36. package/src/tool/collageMaker/i18n/pl.ts +233 -0
  37. package/src/tool/collageMaker/i18n/pt.ts +233 -0
  38. package/src/tool/collageMaker/i18n/ru.ts +233 -0
  39. package/src/tool/collageMaker/i18n/sv.ts +233 -0
  40. package/src/tool/collageMaker/i18n/tr.ts +233 -0
  41. package/src/tool/collageMaker/i18n/zh.ts +233 -0
  42. package/src/tool/collageMaker/index.ts +15 -6
  43. package/src/tool/exifCleaner/i18n/de.ts +277 -0
  44. package/src/tool/exifCleaner/i18n/fr.ts +1 -1
  45. package/src/tool/exifCleaner/i18n/id.ts +277 -0
  46. package/src/tool/exifCleaner/i18n/it.ts +277 -0
  47. package/src/tool/exifCleaner/i18n/ja.ts +277 -0
  48. package/src/tool/exifCleaner/i18n/ko.ts +277 -0
  49. package/src/tool/exifCleaner/i18n/nl.ts +277 -0
  50. package/src/tool/exifCleaner/i18n/pl.ts +277 -0
  51. package/src/tool/exifCleaner/i18n/pt.ts +277 -0
  52. package/src/tool/exifCleaner/i18n/ru.ts +277 -0
  53. package/src/tool/exifCleaner/i18n/sv.ts +277 -0
  54. package/src/tool/exifCleaner/i18n/tr.ts +277 -0
  55. package/src/tool/exifCleaner/i18n/zh.ts +277 -0
  56. package/src/tool/exifCleaner/index.ts +16 -8
  57. package/src/tool/imageCompressor/i18n/de.ts +242 -0
  58. package/src/tool/imageCompressor/i18n/en.ts +1 -1
  59. package/src/tool/imageCompressor/i18n/es.ts +1 -1
  60. package/src/tool/imageCompressor/i18n/id.ts +242 -0
  61. package/src/tool/imageCompressor/i18n/it.ts +242 -0
  62. package/src/tool/imageCompressor/i18n/ja.ts +242 -0
  63. package/src/tool/imageCompressor/i18n/ko.ts +242 -0
  64. package/src/tool/imageCompressor/i18n/nl.ts +242 -0
  65. package/src/tool/imageCompressor/i18n/pl.ts +242 -0
  66. package/src/tool/imageCompressor/i18n/pt.ts +242 -0
  67. package/src/tool/imageCompressor/i18n/ru.ts +242 -0
  68. package/src/tool/imageCompressor/i18n/sv.ts +242 -0
  69. package/src/tool/imageCompressor/i18n/tr.ts +242 -0
  70. package/src/tool/imageCompressor/i18n/zh.ts +244 -0
  71. package/src/tool/imageCompressor/index.ts +15 -7
  72. package/src/tool/printQualityCalculator/i18n/de.ts +261 -0
  73. package/src/tool/printQualityCalculator/i18n/fr.ts +1 -1
  74. package/src/tool/printQualityCalculator/i18n/id.ts +261 -0
  75. package/src/tool/printQualityCalculator/i18n/it.ts +261 -0
  76. package/src/tool/printQualityCalculator/i18n/ja.ts +261 -0
  77. package/src/tool/printQualityCalculator/i18n/ko.ts +261 -0
  78. package/src/tool/printQualityCalculator/i18n/nl.ts +261 -0
  79. package/src/tool/printQualityCalculator/i18n/pl.ts +261 -0
  80. package/src/tool/printQualityCalculator/i18n/pt.ts +261 -0
  81. package/src/tool/printQualityCalculator/i18n/ru.ts +261 -0
  82. package/src/tool/printQualityCalculator/i18n/sv.ts +261 -0
  83. package/src/tool/printQualityCalculator/i18n/tr.ts +261 -0
  84. package/src/tool/printQualityCalculator/i18n/zh.ts +261 -0
  85. package/src/tool/printQualityCalculator/index.ts +15 -7
  86. package/src/tool/privacyBlur/i18n/de.ts +238 -0
  87. package/src/tool/privacyBlur/i18n/id.ts +238 -0
  88. package/src/tool/privacyBlur/i18n/it.ts +238 -0
  89. package/src/tool/privacyBlur/i18n/ja.ts +238 -0
  90. package/src/tool/privacyBlur/i18n/ko.ts +238 -0
  91. package/src/tool/privacyBlur/i18n/nl.ts +238 -0
  92. package/src/tool/privacyBlur/i18n/pl.ts +238 -0
  93. package/src/tool/privacyBlur/i18n/pt.ts +238 -0
  94. package/src/tool/privacyBlur/i18n/ru.ts +238 -0
  95. package/src/tool/privacyBlur/i18n/sv.ts +238 -0
  96. package/src/tool/privacyBlur/i18n/tr.ts +238 -0
  97. package/src/tool/privacyBlur/i18n/zh.ts +238 -0
  98. package/src/tool/privacyBlur/index.ts +15 -7
  99. package/src/tool/subtitleSync/i18n/de.ts +241 -0
  100. package/src/tool/subtitleSync/i18n/fr.ts +5 -5
  101. package/src/tool/subtitleSync/i18n/id.ts +241 -0
  102. package/src/tool/subtitleSync/i18n/it.ts +241 -0
  103. package/src/tool/subtitleSync/i18n/ja.ts +241 -0
  104. package/src/tool/subtitleSync/i18n/ko.ts +241 -0
  105. package/src/tool/subtitleSync/i18n/nl.ts +241 -0
  106. package/src/tool/subtitleSync/i18n/pl.ts +241 -0
  107. package/src/tool/subtitleSync/i18n/pt.ts +241 -0
  108. package/src/tool/subtitleSync/i18n/ru.ts +241 -0
  109. package/src/tool/subtitleSync/i18n/sv.ts +241 -0
  110. package/src/tool/subtitleSync/i18n/tr.ts +241 -0
  111. package/src/tool/subtitleSync/i18n/zh.ts +241 -0
  112. package/src/tool/subtitleSync/index.ts +15 -7
  113. package/src/tool/timelapseCalculator/i18n/de.ts +169 -0
  114. package/src/tool/timelapseCalculator/i18n/fr.ts +2 -2
  115. package/src/tool/timelapseCalculator/i18n/id.ts +169 -0
  116. package/src/tool/timelapseCalculator/i18n/it.ts +169 -0
  117. package/src/tool/timelapseCalculator/i18n/ja.ts +169 -0
  118. package/src/tool/timelapseCalculator/i18n/ko.ts +169 -0
  119. package/src/tool/timelapseCalculator/i18n/nl.ts +169 -0
  120. package/src/tool/timelapseCalculator/i18n/pl.ts +169 -0
  121. package/src/tool/timelapseCalculator/i18n/pt.ts +169 -0
  122. package/src/tool/timelapseCalculator/i18n/ru.ts +169 -0
  123. package/src/tool/timelapseCalculator/i18n/sv.ts +169 -0
  124. package/src/tool/timelapseCalculator/i18n/tr.ts +169 -0
  125. package/src/tool/timelapseCalculator/i18n/zh.ts +169 -0
  126. package/src/tool/timelapseCalculator/index.ts +16 -8
  127. package/src/tool/tvDistance/i18n/de.ts +223 -0
  128. package/src/tool/tvDistance/i18n/id.ts +223 -0
  129. package/src/tool/tvDistance/i18n/it.ts +223 -0
  130. package/src/tool/tvDistance/i18n/ja.ts +223 -0
  131. package/src/tool/tvDistance/i18n/ko.ts +223 -0
  132. package/src/tool/tvDistance/i18n/nl.ts +223 -0
  133. package/src/tool/tvDistance/i18n/pl.ts +223 -0
  134. package/src/tool/tvDistance/i18n/pt.ts +223 -0
  135. package/src/tool/tvDistance/i18n/ru.ts +223 -0
  136. package/src/tool/tvDistance/i18n/sv.ts +223 -0
  137. package/src/tool/tvDistance/i18n/tr.ts +223 -0
  138. package/src/tool/tvDistance/i18n/zh.ts +223 -0
  139. package/src/tool/tvDistance/index.ts +15 -7
  140. package/src/tool/videoFrameExtractor/i18n/de.ts +235 -0
  141. package/src/tool/videoFrameExtractor/i18n/id.ts +235 -0
  142. package/src/tool/videoFrameExtractor/i18n/it.ts +235 -0
  143. package/src/tool/videoFrameExtractor/i18n/ja.ts +235 -0
  144. package/src/tool/videoFrameExtractor/i18n/ko.ts +235 -0
  145. package/src/tool/videoFrameExtractor/i18n/nl.ts +235 -0
  146. package/src/tool/videoFrameExtractor/i18n/pl.ts +235 -0
  147. package/src/tool/videoFrameExtractor/i18n/pt.ts +235 -0
  148. package/src/tool/videoFrameExtractor/i18n/ru.ts +235 -0
  149. package/src/tool/videoFrameExtractor/i18n/sv.ts +235 -0
  150. package/src/tool/videoFrameExtractor/i18n/tr.ts +235 -0
  151. package/src/tool/videoFrameExtractor/i18n/zh.ts +235 -0
  152. package/src/tool/videoFrameExtractor/index.ts +16 -8
@@ -0,0 +1,238 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { PrivacyBlurUI, PrivacyBlurLocaleContent } from '../index';
3
+
4
+ const slug = 'online-privacy-editor-pixelate-blur-faces-photos';
5
+ const title = '온라인 프라이버시 에디터: 사진 속 얼굴 모자이크 및 숨기기';
6
+ const description = '사진의 민감한 부분을 검열하여 신원을 보호하세요. 얼굴 모자이크, 문서 블러 처리 또는 개인 정보 가리기를 100% 로컬 환경에서 수행합니다.';
7
+
8
+ const ui: PrivacyBlurUI = {
9
+ toolPixel: "모자이크",
10
+ toolBlur: "블러",
11
+ toolSolid: "색 채우기",
12
+ intensityLabel: "강도",
13
+ undoButton: "되돌리기",
14
+ downloadButton: "저장하기",
15
+ dropTitle: "프라이버시 에디터",
16
+ dropSubtitle: "이미지를 여기로 드래그하거나 클릭하여 시작하세요",
17
+ privacySecureLabel: "100% 로컬",
18
+ offlineLabel: "오프라인",
19
+ autoDetectFaces: "자동 감지",
20
+ loadingModels: "모델 로드 중...",
21
+ noFacesDetected: "자동으로 감지된 얼굴이 없습니다.",
22
+ faqTitle: "자주 묻는 질문",
23
+ bibliographyTitle: "참고 문헌"
24
+ };
25
+
26
+ const faq: PrivacyBlurLocaleContent['faq'] = [
27
+ {
28
+ question: "내 사진이 서버에 업로드되나요?",
29
+ answer: "아니요. 프라이버시 에디터는 브라우저 내부에서만 작동합니다. 모든 수정 작업은 로컬에서 이루어지며 기기 외부로 데이터가 전송되지 않습니다.",
30
+ },
31
+ {
32
+ question: "자동 얼굴 감지는 어떻게 작동하나요?",
33
+ answer: "외부 연결 없이 안면 특징을 식별하기 위해 브라우저에서 실행되는 경량 신경망(TinyFaceDetector)을 사용합니다.",
34
+ },
35
+ ];
36
+
37
+ const howTo: PrivacyBlurLocaleContent['howTo'] = [
38
+ {
39
+ name: "사진 업로드",
40
+ text: "숨기고 싶은 민감한 정보가 포함된 이미지를 드래그하거나 선택하세요.",
41
+ },
42
+ {
43
+ name: "도구 선택",
44
+ text: "필요한 개인정보 보호 수준에 따라 모자이크, 블러 또는 색 채우기 중 하나를 선택하세요.",
45
+ },
46
+ {
47
+ name: "영역 표시",
48
+ text: "보호하려는 구역(얼굴, 번호판, 이름 등)을 클릭하고 드래그하세요.",
49
+ },
50
+ {
51
+ name: "결과 저장",
52
+ text: "원본 데이터를 복구할 수 없는 상태로 처리된 이미지를 다운로드하세요.",
53
+ },
54
+ ];
55
+
56
+ const bibliography: PrivacyBlurLocaleContent['bibliography'] = [
57
+ {
58
+ name: "프라이버시 설계(Privacy by Design, PbD) - AGPD",
59
+ url: "https://www.aepd.es/es/guias-y-herramientas/guias/guia-de-privacidad-desde-el-diseno",
60
+ },
61
+ ];
62
+
63
+ const seo: PrivacyBlurLocaleContent['seo'] = [
64
+ {
65
+ type: 'summary',
66
+ title: '프라이버시 에디터: 모자이크, 블러 및 가리기',
67
+ items: [
68
+ '세 가지 도구: 모자이크, 블러, 색 채우기',
69
+ 'AI 기반 자동 얼굴 감지(TinyFaceDetector)',
70
+ '100% 로컬 처리 - 사진이 브라우저를 떠나지 않음',
71
+ '워터마크 없음, 제한 없음, 완전 무료'
72
+ ]
73
+ },
74
+ { type: 'title', text: '디지털 프라이버시: 시각적 데이터를 보호하는 방법', level: 2 },
75
+ { type: 'paragraph', html: '소셜 미디어 시대에 무분별한 사진 공유는 민감한 개인 정보를 노출할 수 있습니다. 당사의 도구는 사진을 인터넷에 올리기 전 중요한 정보(얼굴, 번호판, 이름, 주소)를 숨길 수 있게 하여 개인 정보를 완벽하게 제어할 수 있도록 돕습니다.' },
76
+
77
+ { type: 'stats', items: [
78
+ { value: '3', label: '차단 방식', icon: 'mdi:tools' },
79
+ { value: '100%', label: '로컬 프라이버시', icon: 'mdi:shield-check' },
80
+ { value: 'AI', label: '얼굴 감지', icon: 'mdi:brain' }
81
+ ], columns: 3 },
82
+
83
+ { type: 'title', text: '세 가지 차단 방식 설명', level: 3 },
84
+ { type: 'comparative', items: [
85
+ {
86
+ title: '모자이크 (Pixelate)',
87
+ description: '영역을 격자로 나누어 식별이 불가능하게 만듦',
88
+ icon: 'mdi:blur',
89
+ points: [
90
+ '최대의 비가역적 난독화',
91
+ '얼굴 인식 기술로부터 가장 안전함',
92
+ '무언가 가려졌음이 시각적으로 명확함',
93
+ '권장: 공공장소 사진 속 얼굴'
94
+ ]
95
+ },
96
+ {
97
+ title: '블러 (Blur)',
98
+ description: '가우시안 평활화 - 더 자연스러운 외형',
99
+ icon: 'mdi:blur-off',
100
+ points: [
101
+ '더 우아하고 시각적인 외관',
102
+ '색조의 일관성 유지',
103
+ '수학적으로 (이론상) 가역적일 수 있음',
104
+ '권장: 덜 민감한 정보'
105
+ ],
106
+ highlight: true
107
+ },
108
+ {
109
+ title: '색 채우기 (Solid)',
110
+ description: '불투명한 색상 블록 - 최대 프라이버시',
111
+ icon: 'mdi:rectangle',
112
+ points: [
113
+ '시각적으로 노골적인 숨김',
114
+ '가장 높은 법적/기술적 보안 수준',
115
+ '사진의 전체적인 구도를 바꿈',
116
+ '권장: 문서, 매우 민감한 데이터'
117
+ ]
118
+ }
119
+ ], columns: 3 },
120
+
121
+ { type: 'title', text: 'AI를 이용한 자동 얼굴 감지', level: 3 },
122
+ { type: 'paragraph', html: '당사의 도구는 브라우저 내부에서 얼굴을 자동으로 식별하는 컴팩트한 신경망인 TinyFaceDetector를 사용합니다.' },
123
+ { type: 'list', items: [
124
+ '<strong>100% 로컬:</strong> AI 모델이 외부 서버가 아닌 사용자의 GPU/CPU에서 직접 실행됩니다.',
125
+ '<strong>오프라인 작동:</strong> 최초 로드 후에는 인터넷 연결 없이도 작동합니다.',
126
+ '<strong>프라이버시 보장:</strong> Google이나 OpenAI, 그리고 당사를 포함하여 누구도 얼굴을 볼 수 없습니다.',
127
+ '<strong>원클릭 자동화:</strong> 얼굴을 감지하고 클릭 한 번으로 숨길 영역을 선택할 수 있습니다.'
128
+ ], icon: 'mdi:check' },
129
+
130
+ { type: 'card', title: 'Privacy by Design', html: '브라우저의 로컬 GPU와 CPU를 사용하여 이미지를 처리함으로써 원본 사진이 사용자의 기기를 절대 떠나지 않음을 보장합니다. 작업 중에 마음이 바뀌더라도 어떠한 데이터도 전송되지 않습니다. 이것이 디지털 프라이버시의 최고 기준입니다.' },
131
+
132
+ { type: 'title', text: '프라이버시 활용 사례', level: 3 },
133
+ { type: 'table', headers: ['민감 정보', '권장 방식', '시급성'], rows: [
134
+ ['타인의 얼굴', '모자이크 또는 블러', '치명적'],
135
+ ['차량 번호판', '모자이크 (비가역적)', '치명적'],
136
+ ['신분증 문서', '색 채우기 또는 모자이크', '치명적'],
137
+ ['기록된 이름/주소', '색 채우기 또는 모자이크', '높음'],
138
+ ['전화번호', '모자이크 또는 색 채우기', '높음'],
139
+ ['의료 정보', '색 채우기', '치명적'],
140
+ ['노출된 WiFi 비번 등', '모자이크', '중간']
141
+ ] },
142
+
143
+ { type: 'proscons', items: [
144
+ {
145
+ pro: '완벽한 프라이버시: 100% 로컬 처리, 서버 없음, 저장 없음',
146
+ con: 'Canvas 및 WebGL을 지원하는 현대적인 브라우저 필요'
147
+ },
148
+ {
149
+ pro: '자동 얼굴 감지로 수작업 시간 절약',
150
+ con: 'AI가 완벽하지 않음 - 측면 얼굴이나 가려진 얼굴은 감지되지 않을 수 있음'
151
+ },
152
+ {
153
+ pro: '보안과 미관 사이에서 세 가지 방식 선택 가능',
154
+ con: '고급 옵션(스마트 왜곡, 주변 채우기 등)은 없음'
155
+ },
156
+ {
157
+ pro: '완전 무료, 광고 없음, 제한 없음',
158
+ con: '포토샵과 같은 전문 소프트웨어의 대체용은 아님'
159
+ }
160
+ ], proTitle: '장점', conTitle: '제한 사항' },
161
+
162
+ { type: 'diagnostic', variant: 'warning', title: '경고: 블러 처리는 100% 안전하지 않습니다', icon: 'mdi:alert', badge: '보안', html: '가우시안 블러는 정교한 알고리즘을 통해 수학적으로 복구될 수 있는 가능성이 있습니다. 정보가 매우 중요하다면(법적 문서, 신원 정보) <strong>모자이크 또는 색 채우기</strong>를 사용하세요. 블러는 보기에는 좋지만 보안성은 상대적으로 낮습니다.' },
163
+
164
+ { type: 'glossary', items: [
165
+ {
166
+ term: '모자이크 (Pixelation)',
167
+ definition: '영역을 균일한 색상 블록으로 나누어 해상도를 낮추는 방식입니다. 비가역적이며 AI 얼굴 인식에 대한 최대 방어 수단입니다.'
168
+ },
169
+ {
170
+ term: '가우시안 블러 (Gaussian Blur)',
171
+ definition: '정규 분포에 기반한 수학적 평활화 기법입니다. 이론적으로는 복구가 가능하지만 실제로는 매우 어렵습니다.'
172
+ },
173
+ {
174
+ term: '색 채우기 (Solid Cover)',
175
+ definition: '균일한 색상의 불투명 블록입니다. 최고의 보안과 법적 프라이버시를 제공하지만 시각적으로는 투박할 수 있습니다.'
176
+ },
177
+ {
178
+ term: 'TinyFaceDetector',
179
+ definition: '얼굴 감지를 위한 경량 합성곱 신경망(CNN)입니다. 외부 서버 없이 브라우저 내에서 직접 실행됩니다.'
180
+ },
181
+ {
182
+ term: '프라이버시 설계 (Privacy by Design, PbD)',
183
+ definition: '프라이버시를 나중에 추가하는 것이 아니라 시스템 설계 단계부터 통합하는 접근 방식입니다. 당사의 로컬 처리 방식이 이에 해당합니다.'
184
+ }
185
+ ] },
186
+
187
+ { type: 'message', title: '사용자가 제어하는 프라이버시', ariaLabel: '개인정보 보호 정보', html: '당사는 사용자의 사진을 외부 서버에 저장하거나 처리하지 않습니다. 추적용 쿠키도, 편집 내역도 없습니다. 당사는 사용자의 이미지를 볼 수 없으므로 무엇을 숨겼는지 알지 못합니다. 완전한 통제, 완전한 프라이버시, 완전한 자유를 누리세요.' },
188
+
189
+ { type: 'title', text: 'SNS에 안전하게 공유하기', level: 3 },
190
+ { type: 'paragraph', html: '인터넷에 사진을 올리기 전 스스로에게 물어보세요. "공개하고 싶지 않은 정보가 포함되어 있나요?" 아이의 얼굴, 번호판, 주소, 문서 번호 등. 지금 2분만 프라이버시 관리에 투자하면 장래의 문제를 예방할 수 있습니다.' }
191
+ ];
192
+
193
+ const faqSchema: WithContext<FAQPage> = {
194
+ '@context': 'https://schema.org',
195
+ '@type': 'FAQPage',
196
+ mainEntity: faq.map((item) => ({
197
+ '@type': 'Question',
198
+ name: item.question,
199
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
200
+ })),
201
+ };
202
+
203
+ const howToSchema: WithContext<HowTo> = {
204
+ '@context': 'https://schema.org',
205
+ '@type': 'HowTo',
206
+ name: title,
207
+ description,
208
+ step: howTo.map((step) => ({
209
+ '@type': 'HowToStep',
210
+ name: step.name,
211
+ text: step.text,
212
+ })),
213
+ };
214
+
215
+ const appSchema: WithContext<SoftwareApplication> = {
216
+ '@context': 'https://schema.org',
217
+ '@type': 'SoftwareApplication',
218
+ name: title,
219
+ description,
220
+ applicationCategory: 'UtilitiesApplication',
221
+ operatingSystem: 'Web',
222
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
223
+ inLanguage: 'ko',
224
+ };
225
+
226
+ export const content: PrivacyBlurLocaleContent = {
227
+ slug,
228
+ title,
229
+ description,
230
+ ui,
231
+ seo,
232
+ faqTitle: "자주 묻는 질문",
233
+ faq,
234
+ bibliographyTitle: "참고 문헌",
235
+ bibliography,
236
+ howTo,
237
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
238
+ };
@@ -0,0 +1,238 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { PrivacyBlurUI, PrivacyBlurLocaleContent } from '../index';
3
+
4
+ const slug = 'online-privacyeditor-pixelate-blur-faces-fotos';
5
+ const title = 'Online Privacy Editor: Gezichten in foto\'s verpixelen en verbergen';
6
+ const description = 'Bescherm je identiteit door gevoelige delen van je foto\'s te censureren. Verpixel gezichten, vervaag documenten of dek privé-informatie 100% lokaal af.';
7
+
8
+ const ui: PrivacyBlurUI = {
9
+ toolPixel: "Verpixelen",
10
+ toolBlur: "Vervagen",
11
+ toolSolid: "Vlak",
12
+ intensityLabel: "Intensiteit",
13
+ undoButton: "Ongedaan maken",
14
+ downloadButton: "Opslaan",
15
+ dropTitle: "Privacy Editor",
16
+ dropSubtitle: "Sleep je afbeelding hierheen of klik om te beginnen",
17
+ privacySecureLabel: "100% Lokaal",
18
+ offlineLabel: "Offline",
19
+ autoDetectFaces: "Auto Detectie",
20
+ loadingModels: "Modellen laden...",
21
+ noFacesDetected: "Geen gezichten automatisch gedetecteerd.",
22
+ faqTitle: "Veelgestelde Vragen",
23
+ bibliographyTitle: "Referenties"
24
+ };
25
+
26
+ const faq: PrivacyBlurLocaleContent['faq'] = [
27
+ {
28
+ question: "Worden mijn foto's naar een server geüpload?",
29
+ answer: "Nee. De privacy editor werkt volledig in je browser. Pixels worden lokaal gewijzigd en er wordt niets buiten je apparaat verzonden.",
30
+ },
31
+ {
32
+ question: "Hoe werkt automatische gezichtsdetectie?",
33
+ answer: "We gebruiken een lichtgewicht neuraal netwerk (TinyFaceDetector) dat in je browser draait om gezichtskenmerken te identificeren zonder een externe verbinding nodig te hebben.",
34
+ },
35
+ ];
36
+
37
+ const howTo: PrivacyBlurLocaleContent['howTo'] = [
38
+ {
39
+ name: "Upload je foto",
40
+ text: "Sleep of selecteer de afbeelding die gevoelige informatie bevat die je wilt verbergen.",
41
+ },
42
+ {
43
+ name: "Kies de tool",
44
+ text: "Kies tussen verpixelen, vervagen of een vlakke dekking, afhankelijk van het privacyniveau dat je nodig hebt.",
45
+ },
46
+ {
47
+ name: "Markeer het gebied",
48
+ text: "Klik en sleep over de zone die je wilt beschermen (gezichten, nummerplaten, namen, enz.).",
49
+ },
50
+ {
51
+ name: "Sla het resultaat op",
52
+ text: "Download de bewerkte afbeelding met de zekerheid dat de originele gegevens ontoegankelijk zijn.",
53
+ },
54
+ ];
55
+
56
+ const bibliography: PrivacyBlurLocaleContent['bibliography'] = [
57
+ {
58
+ name: "Privacy by Design (PbD) - AGPD",
59
+ url: "https://www.aepd.es/es/guias-y-herramientas/guias/guia-de-privacidad-desde-el-diseno",
60
+ },
61
+ ];
62
+
63
+ const seo: PrivacyBlurLocaleContent['seo'] = [
64
+ {
65
+ type: 'summary',
66
+ title: 'Privacy Editor: Verpixelen, Vervagen en Verbergen',
67
+ items: [
68
+ 'Drie bewerkingstools: Verpixelen, Vervagen, Vlakke Dekking',
69
+ 'Automatische gezichtsdetectie met AI (TinyFaceDetector)',
70
+ '100% lokale verwerking - je foto\'s verlaten de browser nooit',
71
+ 'Geen watermerken, geen limieten, volledig gratis'
72
+ ]
73
+ },
74
+ { type: 'title', text: 'Digitale Privacy: Hoe je Visuele Gegevens Kunt Beschermen', level: 2 },
75
+ { type: 'paragraph', html: 'In het tijdperk van sociale media kan het ongecontroleerd delen van foto\'s gevoelige persoonsgegevens blootleggen. Met onze tool kun je kritieke informatie (gezichten, nummerplaten, namen, adressen) verbergen voordat je ze naar internet uploadt, zodat je privacy volledig onder jouw controle blijft.' },
76
+
77
+ { type: 'stats', items: [
78
+ { value: '3', label: 'Verbergingsmethoden', icon: 'mdi:tools' },
79
+ { value: '100%', label: 'Lokale Privacy', icon: 'mdi:shield-check' },
80
+ { value: 'AI', label: 'Gezichtsdetectie', icon: 'mdi:brain' }
81
+ ], columns: 3 },
82
+
83
+ { type: 'title', text: 'Uitleg van de Drie Verbergingsmethoden', level: 3 },
84
+ { type: 'comparative', items: [
85
+ {
86
+ title: 'Verpixelen',
87
+ description: 'Verdeelt het gebied in vierkantjes, onmogelijk te herkennen',
88
+ icon: 'mdi:blur',
89
+ points: [
90
+ 'Maximale onomkeerbare versluiering',
91
+ 'Veiliger tegen gezichtsherkenning',
92
+ 'Zichtbaar, duidelijk dat er iets verborgen is',
93
+ 'Ideaal: gezichten op openbare foto\'s'
94
+ ]
95
+ },
96
+ {
97
+ title: 'Vervagen (Blur)',
98
+ description: 'Gaussiaanse vervaging - natuurlijker uiterlijk',
99
+ icon: 'mdi:blur-off',
100
+ points: [
101
+ 'Eleganter visueel uiterlijk',
102
+ 'Behoudt enige tonale samenhang',
103
+ 'Mathematisch omkeerbaar (theoretisch)',
104
+ 'Ideaal: minder gevoelige informatie'
105
+ ],
106
+ highlight: true
107
+ },
108
+ {
109
+ title: 'Vlakke Dekking',
110
+ description: 'Ondoorzichtig kleurblok - maximale privacy',
111
+ icon: 'mdi:rectangle',
112
+ points: [
113
+ 'Zichtbare, duidelijke verberging',
114
+ 'Maximale juridische veiligheid/privacy',
115
+ 'Verandert de visuele compositie',
116
+ 'Ideaal: documenten, gevoelige gegevens'
117
+ ]
118
+ }
119
+ ], columns: 3 },
120
+
121
+ { type: 'title', text: 'Automatische Gezichtsdetectie met AI', level: 3 },
122
+ { type: 'paragraph', html: 'Onze tool gebruikt TinyFaceDetector, een compact neuraal netwerk dat rechtstreeks in je browser draait om gezichten automatisch te identificeren:' },
123
+ { type: 'list', items: [
124
+ '<strong>100% Lokaal:</strong> Het AI-model draait op jouw GPU/CPU, niet op externe servers.',
125
+ '<strong>Geen Internet:</strong> Na de eerste download werkt het volledig offline.',
126
+ '<strong>Privacy Gegarandeerd:</strong> Niemand ziet de gezichten: Google niet, OpenAI niet, en wij ook niet.',
127
+ '<strong>Automatisch in Eén Klik:</strong> Detecteert gezichten en laat je met één klik kiezen om ze te verbergen.'
128
+ ], icon: 'mdi:check' },
129
+
130
+ { type: 'card', title: 'Privacy by Design', html: 'Door afbeeldingen te verwerken met de lokale GPU en CPU van je browser, garanderen we dat originele foto\'s je apparaat nooit verlaten. Zelfs als je je bedenkt, is er niets verzonden. Dit is de maximale standaard voor digitale privacy.' },
131
+
132
+ { type: 'title', text: 'Privacy Use Cases', level: 3 },
133
+ { type: 'table', headers: ['Gevoelige Informatie', 'Aanbevolen Methode', 'Urgentie'], rows: [
134
+ ['Gezichten van mensen', 'Verpixelen of Vervagen', 'Kritiek'],
135
+ ['Nummerplaten van voertuigen', 'Verpixelen (onomkeerbaar)', 'Kritiek'],
136
+ ['Identiteitsbewijzen', 'Vlakke Dekking of Verpixelen', 'Kritiek'],
137
+ ['Geschreven namen/adressen', 'Vlakke Dekking of Verpixelen', 'Hoog'],
138
+ ['Telefoonnummers', 'Verpixelen of Vlak', 'Hoog'],
139
+ ['Medische informatie', 'Vlakke Dekking', 'Kritiek'],
140
+ ['Zichtbare WiFi-signalen', 'Verpixelen', 'Gemiddeld']
141
+ ] },
142
+
143
+ { type: 'proscons', items: [
144
+ {
145
+ pro: 'Totale privacy: 100% lokale verwerking, geen servers, geen opslag',
146
+ con: 'Vereist een moderne browser met ondersteuning voor Canvas en WebGL'
147
+ },
148
+ {
149
+ pro: 'Automatische gezichtsdetectie bespaart handmatige tijd',
150
+ con: 'AI is niet perfect - gezichten in profiel of gedeeltelijke gezichten worden mogelijk niet herkend'
151
+ },
152
+ {
153
+ pro: 'Drie methoden maken keuze tussen veiligheid vs esthetiek mogelijk',
154
+ con: 'Geen geavanceerde opties (smart warp, context vulling)'
155
+ },
156
+ {
157
+ pro: 'Volledig gratis, geen advertenties, geen limieten',
158
+ con: 'Niet gelijkwaardig aan professionele software zoals Photoshop'
159
+ }
160
+ ], proTitle: 'Voordelen', conTitle: 'Beperkingen' },
161
+
162
+ { type: 'diagnostic', variant: 'warning', title: 'Waarschuwing: Vervagen is NIET 100% veilig', icon: 'mdi:alert', badge: 'Beveiliging', html: 'Gaussiaanse vervaging is mathematisch omkeerbaar via geavanceerde inverse algoritmen. Als informatie KRITIEK is (juridische documenten, identiteit), gebruik dan <strong>Verpixelen of Vlakke Dekking</strong>. Vervagen is esthetisch beter maar minder veilig.' },
163
+
164
+ { type: 'glossary', items: [
165
+ {
166
+ term: 'Verpixelen',
167
+ definition: 'Resolutie verminderen door het gebied te verdelen in uniforme kleurblokken. Onomkeerbaar. Maximale beveiliging tegen AI-gezichtsherkenning.'
168
+ },
169
+ {
170
+ term: 'Gaussiaanse Vervaging',
171
+ definition: 'Mathematische afvlakking gebaseerd op de normale verdeling. Theoretisch omkeerbaar via deconvolution, maar in de praktijk erg moeilijk.'
172
+ },
173
+ {
174
+ term: 'Vlakke Dekking',
175
+ definition: 'Ondoorzichtig blok van egale kleur. Maximale beveiliging, maximale juridische privacy, visueel minder elegant.'
176
+ },
177
+ {
178
+ term: 'TinyFaceDetector',
179
+ definition: 'Lichtgewicht convolutioneel neuraal netwerk (CNN) voor het detecteren van gezichten. Draait lokaal in de browser zonder een externe server nodig te hebben.'
180
+ },
181
+ {
182
+ term: 'Privacy by Design (PbD)',
183
+ definition: 'Benadering waarbij privacy vanaf het systeemontwerp wordt geïntegreerd, niet later toegevoegd. Onze lokale benadering is Privacy by Design.'
184
+ }
185
+ ] },
186
+
187
+ { type: 'message', title: 'Privacy in Jouw Controle', ariaLabel: 'Informatie over privacybescherming', html: 'We bewaren of verwerken je foto\'s niet op externe servers. Er zijn geen trackingcookies. Geen bewerkingsgeschiedenis. We weten niet wat je verbergt omdat we je afbeeldingen nooit zien. Volledige controle, volledige privacy, volledige vrijheid.' },
188
+
189
+ { type: 'title', text: 'Veilig Delen op Sociale Netwerken', level: 3 },
190
+ { type: 'paragraph', html: 'Vraag jezelf af voordat je een foto op internet plaatst: is er informatie waarvan ik liever niet wil dat deze openbaar is? Gezichten van kinderen, nummerplaten, adressen, documentnummers. Een privacysessie van 2 minuten nu voorkomt jarenlange problemen.' }
191
+ ];
192
+
193
+ const faqSchema: WithContext<FAQPage> = {
194
+ '@context': 'https://schema.org',
195
+ '@type': 'FAQPage',
196
+ mainEntity: faq.map((item) => ({
197
+ '@type': 'Question',
198
+ name: item.question,
199
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
200
+ })),
201
+ };
202
+
203
+ const howToSchema: WithContext<HowTo> = {
204
+ '@context': 'https://schema.org',
205
+ '@type': 'HowTo',
206
+ name: title,
207
+ description,
208
+ step: howTo.map((step) => ({
209
+ '@type': 'HowToStep',
210
+ name: step.name,
211
+ text: step.text,
212
+ })),
213
+ };
214
+
215
+ const appSchema: WithContext<SoftwareApplication> = {
216
+ '@context': 'https://schema.org',
217
+ '@type': 'SoftwareApplication',
218
+ name: title,
219
+ description,
220
+ applicationCategory: 'UtilitiesApplication',
221
+ operatingSystem: 'Web',
222
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
223
+ inLanguage: 'nl',
224
+ };
225
+
226
+ export const content: PrivacyBlurLocaleContent = {
227
+ slug,
228
+ title,
229
+ description,
230
+ ui,
231
+ seo,
232
+ faqTitle: "Veelgestelde Vragen",
233
+ faq,
234
+ bibliographyTitle: "Referenties",
235
+ bibliography,
236
+ howTo,
237
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
238
+ };