@jjlmoya/utils-audiovisual 1.6.0 → 1.8.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 (175) hide show
  1. package/package.json +59 -58
  2. package/src/category/i18n/de.ts +198 -0
  3. package/src/category/i18n/fr.ts +1 -1
  4. package/src/category/i18n/id.ts +198 -0
  5. package/src/category/i18n/it.ts +198 -0
  6. package/src/category/i18n/ja.ts +198 -0
  7. package/src/category/i18n/ko.ts +198 -0
  8. package/src/category/i18n/nl.ts +198 -0
  9. package/src/category/i18n/pl.ts +198 -0
  10. package/src/category/i18n/pt.ts +198 -0
  11. package/src/category/i18n/ru.ts +198 -0
  12. package/src/category/i18n/sv.ts +198 -0
  13. package/src/category/i18n/tr.ts +198 -0
  14. package/src/category/i18n/zh.ts +198 -0
  15. package/src/category/index.ts +31 -3
  16. package/src/tests/i18n_coverage.test.ts +36 -0
  17. package/src/tests/schemas_fulfillment.test.ts +23 -0
  18. package/src/tests/title_quality.test.ts +55 -0
  19. package/src/tool/chromaticLens/i18n/de.ts +246 -0
  20. package/src/tool/chromaticLens/i18n/en.ts +1 -1
  21. package/src/tool/chromaticLens/i18n/es.ts +1 -1
  22. package/src/tool/chromaticLens/i18n/fr.ts +1 -1
  23. package/src/tool/chromaticLens/i18n/id.ts +246 -0
  24. package/src/tool/chromaticLens/i18n/it.ts +246 -0
  25. package/src/tool/chromaticLens/i18n/ja.ts +246 -0
  26. package/src/tool/chromaticLens/i18n/ko.ts +246 -0
  27. package/src/tool/chromaticLens/i18n/nl.ts +246 -0
  28. package/src/tool/chromaticLens/i18n/pl.ts +246 -0
  29. package/src/tool/chromaticLens/i18n/pt.ts +246 -0
  30. package/src/tool/chromaticLens/i18n/ru.ts +246 -0
  31. package/src/tool/chromaticLens/i18n/sv.ts +246 -0
  32. package/src/tool/chromaticLens/i18n/tr.ts +246 -0
  33. package/src/tool/chromaticLens/i18n/zh.ts +246 -0
  34. package/src/tool/chromaticLens/index.ts +15 -7
  35. package/src/tool/collageMaker/i18n/de.ts +233 -0
  36. package/src/tool/collageMaker/i18n/en.ts +1 -1
  37. package/src/tool/collageMaker/i18n/es.ts +1 -1
  38. package/src/tool/collageMaker/i18n/fr.ts +1 -1
  39. package/src/tool/collageMaker/i18n/id.ts +233 -0
  40. package/src/tool/collageMaker/i18n/it.ts +233 -0
  41. package/src/tool/collageMaker/i18n/ja.ts +233 -0
  42. package/src/tool/collageMaker/i18n/ko.ts +233 -0
  43. package/src/tool/collageMaker/i18n/nl.ts +233 -0
  44. package/src/tool/collageMaker/i18n/pl.ts +233 -0
  45. package/src/tool/collageMaker/i18n/pt.ts +233 -0
  46. package/src/tool/collageMaker/i18n/ru.ts +233 -0
  47. package/src/tool/collageMaker/i18n/sv.ts +233 -0
  48. package/src/tool/collageMaker/i18n/tr.ts +233 -0
  49. package/src/tool/collageMaker/i18n/zh.ts +233 -0
  50. package/src/tool/collageMaker/index.ts +15 -6
  51. package/src/tool/exifCleaner/i18n/de.ts +277 -0
  52. package/src/tool/exifCleaner/i18n/en.ts +2 -2
  53. package/src/tool/exifCleaner/i18n/es.ts +2 -2
  54. package/src/tool/exifCleaner/i18n/fr.ts +4 -4
  55. package/src/tool/exifCleaner/i18n/id.ts +277 -0
  56. package/src/tool/exifCleaner/i18n/it.ts +277 -0
  57. package/src/tool/exifCleaner/i18n/ja.ts +277 -0
  58. package/src/tool/exifCleaner/i18n/ko.ts +277 -0
  59. package/src/tool/exifCleaner/i18n/nl.ts +277 -0
  60. package/src/tool/exifCleaner/i18n/pl.ts +277 -0
  61. package/src/tool/exifCleaner/i18n/pt.ts +277 -0
  62. package/src/tool/exifCleaner/i18n/ru.ts +277 -0
  63. package/src/tool/exifCleaner/i18n/sv.ts +277 -0
  64. package/src/tool/exifCleaner/i18n/tr.ts +277 -0
  65. package/src/tool/exifCleaner/i18n/zh.ts +277 -0
  66. package/src/tool/exifCleaner/index.ts +16 -8
  67. package/src/tool/imageCompressor/i18n/de.ts +242 -0
  68. package/src/tool/imageCompressor/i18n/en.ts +2 -2
  69. package/src/tool/imageCompressor/i18n/es.ts +2 -2
  70. package/src/tool/imageCompressor/i18n/id.ts +242 -0
  71. package/src/tool/imageCompressor/i18n/it.ts +242 -0
  72. package/src/tool/imageCompressor/i18n/ja.ts +242 -0
  73. package/src/tool/imageCompressor/i18n/ko.ts +242 -0
  74. package/src/tool/imageCompressor/i18n/nl.ts +242 -0
  75. package/src/tool/imageCompressor/i18n/pl.ts +242 -0
  76. package/src/tool/imageCompressor/i18n/pt.ts +242 -0
  77. package/src/tool/imageCompressor/i18n/ru.ts +242 -0
  78. package/src/tool/imageCompressor/i18n/sv.ts +242 -0
  79. package/src/tool/imageCompressor/i18n/tr.ts +242 -0
  80. package/src/tool/imageCompressor/i18n/zh.ts +244 -0
  81. package/src/tool/imageCompressor/index.ts +15 -7
  82. package/src/tool/printQualityCalculator/i18n/de.ts +261 -0
  83. package/src/tool/printQualityCalculator/i18n/en.ts +2 -2
  84. package/src/tool/printQualityCalculator/i18n/es.ts +3 -3
  85. package/src/tool/printQualityCalculator/i18n/fr.ts +3 -3
  86. package/src/tool/printQualityCalculator/i18n/id.ts +261 -0
  87. package/src/tool/printQualityCalculator/i18n/it.ts +261 -0
  88. package/src/tool/printQualityCalculator/i18n/ja.ts +261 -0
  89. package/src/tool/printQualityCalculator/i18n/ko.ts +261 -0
  90. package/src/tool/printQualityCalculator/i18n/nl.ts +261 -0
  91. package/src/tool/printQualityCalculator/i18n/pl.ts +261 -0
  92. package/src/tool/printQualityCalculator/i18n/pt.ts +261 -0
  93. package/src/tool/printQualityCalculator/i18n/ru.ts +261 -0
  94. package/src/tool/printQualityCalculator/i18n/sv.ts +261 -0
  95. package/src/tool/printQualityCalculator/i18n/tr.ts +261 -0
  96. package/src/tool/printQualityCalculator/i18n/zh.ts +261 -0
  97. package/src/tool/printQualityCalculator/index.ts +15 -7
  98. package/src/tool/privacyBlur/i18n/de.ts +238 -0
  99. package/src/tool/privacyBlur/i18n/en.ts +1 -1
  100. package/src/tool/privacyBlur/i18n/es.ts +1 -1
  101. package/src/tool/privacyBlur/i18n/fr.ts +1 -1
  102. package/src/tool/privacyBlur/i18n/id.ts +238 -0
  103. package/src/tool/privacyBlur/i18n/it.ts +238 -0
  104. package/src/tool/privacyBlur/i18n/ja.ts +238 -0
  105. package/src/tool/privacyBlur/i18n/ko.ts +238 -0
  106. package/src/tool/privacyBlur/i18n/nl.ts +238 -0
  107. package/src/tool/privacyBlur/i18n/pl.ts +238 -0
  108. package/src/tool/privacyBlur/i18n/pt.ts +238 -0
  109. package/src/tool/privacyBlur/i18n/ru.ts +238 -0
  110. package/src/tool/privacyBlur/i18n/sv.ts +238 -0
  111. package/src/tool/privacyBlur/i18n/tr.ts +238 -0
  112. package/src/tool/privacyBlur/i18n/zh.ts +238 -0
  113. package/src/tool/privacyBlur/index.ts +15 -7
  114. package/src/tool/subtitleSync/i18n/de.ts +241 -0
  115. package/src/tool/subtitleSync/i18n/en.ts +1 -1
  116. package/src/tool/subtitleSync/i18n/es.ts +1 -1
  117. package/src/tool/subtitleSync/i18n/fr.ts +8 -8
  118. package/src/tool/subtitleSync/i18n/id.ts +241 -0
  119. package/src/tool/subtitleSync/i18n/it.ts +241 -0
  120. package/src/tool/subtitleSync/i18n/ja.ts +241 -0
  121. package/src/tool/subtitleSync/i18n/ko.ts +241 -0
  122. package/src/tool/subtitleSync/i18n/nl.ts +241 -0
  123. package/src/tool/subtitleSync/i18n/pl.ts +241 -0
  124. package/src/tool/subtitleSync/i18n/pt.ts +241 -0
  125. package/src/tool/subtitleSync/i18n/ru.ts +241 -0
  126. package/src/tool/subtitleSync/i18n/sv.ts +241 -0
  127. package/src/tool/subtitleSync/i18n/tr.ts +241 -0
  128. package/src/tool/subtitleSync/i18n/zh.ts +241 -0
  129. package/src/tool/subtitleSync/index.ts +15 -7
  130. package/src/tool/timelapseCalculator/i18n/de.ts +169 -0
  131. package/src/tool/timelapseCalculator/i18n/fr.ts +2 -2
  132. package/src/tool/timelapseCalculator/i18n/id.ts +169 -0
  133. package/src/tool/timelapseCalculator/i18n/it.ts +169 -0
  134. package/src/tool/timelapseCalculator/i18n/ja.ts +169 -0
  135. package/src/tool/timelapseCalculator/i18n/ko.ts +169 -0
  136. package/src/tool/timelapseCalculator/i18n/nl.ts +169 -0
  137. package/src/tool/timelapseCalculator/i18n/pl.ts +169 -0
  138. package/src/tool/timelapseCalculator/i18n/pt.ts +169 -0
  139. package/src/tool/timelapseCalculator/i18n/ru.ts +169 -0
  140. package/src/tool/timelapseCalculator/i18n/sv.ts +169 -0
  141. package/src/tool/timelapseCalculator/i18n/tr.ts +169 -0
  142. package/src/tool/timelapseCalculator/i18n/zh.ts +169 -0
  143. package/src/tool/timelapseCalculator/index.ts +16 -8
  144. package/src/tool/tvDistance/i18n/de.ts +223 -0
  145. package/src/tool/tvDistance/i18n/en.ts +1 -1
  146. package/src/tool/tvDistance/i18n/es.ts +1 -1
  147. package/src/tool/tvDistance/i18n/fr.ts +1 -1
  148. package/src/tool/tvDistance/i18n/id.ts +223 -0
  149. package/src/tool/tvDistance/i18n/it.ts +223 -0
  150. package/src/tool/tvDistance/i18n/ja.ts +223 -0
  151. package/src/tool/tvDistance/i18n/ko.ts +223 -0
  152. package/src/tool/tvDistance/i18n/nl.ts +223 -0
  153. package/src/tool/tvDistance/i18n/pl.ts +223 -0
  154. package/src/tool/tvDistance/i18n/pt.ts +223 -0
  155. package/src/tool/tvDistance/i18n/ru.ts +223 -0
  156. package/src/tool/tvDistance/i18n/sv.ts +223 -0
  157. package/src/tool/tvDistance/i18n/tr.ts +223 -0
  158. package/src/tool/tvDistance/i18n/zh.ts +223 -0
  159. package/src/tool/tvDistance/index.ts +15 -7
  160. package/src/tool/videoFrameExtractor/i18n/de.ts +235 -0
  161. package/src/tool/videoFrameExtractor/i18n/en.ts +1 -1
  162. package/src/tool/videoFrameExtractor/i18n/es.ts +1 -1
  163. package/src/tool/videoFrameExtractor/i18n/fr.ts +1 -1
  164. package/src/tool/videoFrameExtractor/i18n/id.ts +235 -0
  165. package/src/tool/videoFrameExtractor/i18n/it.ts +235 -0
  166. package/src/tool/videoFrameExtractor/i18n/ja.ts +235 -0
  167. package/src/tool/videoFrameExtractor/i18n/ko.ts +235 -0
  168. package/src/tool/videoFrameExtractor/i18n/nl.ts +235 -0
  169. package/src/tool/videoFrameExtractor/i18n/pl.ts +235 -0
  170. package/src/tool/videoFrameExtractor/i18n/pt.ts +235 -0
  171. package/src/tool/videoFrameExtractor/i18n/ru.ts +235 -0
  172. package/src/tool/videoFrameExtractor/i18n/sv.ts +235 -0
  173. package/src/tool/videoFrameExtractor/i18n/tr.ts +235 -0
  174. package/src/tool/videoFrameExtractor/i18n/zh.ts +235 -0
  175. package/src/tool/videoFrameExtractor/index.ts +16 -8
@@ -0,0 +1,277 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ExifCleanerUI, ExifCleanerLocaleContent } from '../index';
3
+
4
+ const slug = 'exif-metadata-cleaner-remove-gps-photo-privacy';
5
+ const title = 'EXIF 元数据清除工具:从照片中删除 GPS 和隐藏数据';
6
+ const description = '免费在线工具,在分享图像前擦除 EXIF 元数据、GPS 坐标和相机规格。100% 私密:无需将照片上传到互联网即可工作。';
7
+
8
+ const ui: ExifCleanerUI = {
9
+ dropTitle: "将图像拖到此处",
10
+ dropSubtitle: "删除 GPS 元数据、相机型号和隐藏设置。",
11
+ dropLocalInfo: "100% 本地处理。不会向云端上传任何内容。",
12
+ selectButton: "选择图像",
13
+ processingText: "正在清除元数据...",
14
+ analysisCompleted: "分析完成",
15
+ downloadButton: "下载干净的图像",
16
+ resetButton: "清除另一张图像",
17
+ privacyRiskTitle: "检测到隐私风险:",
18
+ gpsLabel: "GPS:",
19
+ gpsDetected: "已检测到",
20
+ gpsNotFound: "未找到",
21
+ cameraLabel: "相机:",
22
+ softwareLabel: "软件:",
23
+ dateLabel: "日期:",
24
+ otherTechnicalDetails: "其他技术细节",
25
+ noMetadataFound: "未找到可读的 EXIF 元数据。",
26
+ alreadyCleanInfo: "图像可能已经很干净了。",
27
+ previewLabel: "预览",
28
+ faqTitle: "关于照片隐私的常见问题",
29
+ bibliographyTitle: "资源和 EXIF 技术文档",
30
+ };
31
+
32
+ const faq: ExifCleanerLocaleContent['faq'] = [
33
+ {
34
+ question: "什么是 EXIF 元数据?",
35
+ answer: "EXIF(可交换图像文件格式)是相机或手机在每张照片内部保存的隐藏信息。它包括确切日期、设备型号、拍摄设置(ISO、光圈),以及最重要的,拍照地点的 GPS 坐标。",
36
+ },
37
+ {
38
+ question: "使用这个在线工具安全吗?",
39
+ answer: "是的,因为处理是在浏览器中 100% 本地进行的。您的照片绝不会上传到任何服务器;清除过程直接在您设备的内存中进行,确保绝对隐私。",
40
+ },
41
+ {
42
+ question: "清除工具具体删除了哪些数据?",
43
+ answer: "它擦除所有 EXIF 标签(GPS、相机品牌、序列号)、IPTC(版权、作者)和 XMP(编辑历史)。您的图像变得“干净”,仅保留视觉像素。",
44
+ },
45
+ {
46
+ question: "清除元数据会损失画质吗?",
47
+ answer: "不会。我们只删除文件的技术数据“页眉”。图像数据(像素)保持一致,因此视觉质量完全不受影响。",
48
+ },
49
+ ];
50
+
51
+ const howTo: ExifCleanerLocaleContent['howTo'] = [
52
+ {
53
+ name: "选择图像",
54
+ text: "拖动您的照片或从文件浏览器中选择它们。您可以同时处理多张照片。",
55
+ },
56
+ {
57
+ name: "分析当前数据",
58
+ text: "工具将向您显示它检测到的敏感信息(例如,“已检测到 GPS 坐标”)。",
59
+ },
60
+ {
61
+ name: "处理并清除",
62
+ text: "点击清除按钮立即删除所有元数据标签。",
63
+ },
64
+ {
65
+ name: "下载安全照片",
66
+ text: "保存新版本的图像,现在已匿名化,可以安全地在社交媒体上分享。",
67
+ },
68
+ ];
69
+
70
+ const bibliography: ExifCleanerLocaleContent['bibliography'] = [
71
+ {
72
+ name: "可交换图像文件格式 (EXIF) - 维基百科",
73
+ url: "https://zh.wikipedia.org/wiki/EXIF",
74
+ },
75
+ {
76
+ name: "W3C - 图像中的元数据",
77
+ url: "https://www.w3.org/community/image-metadata/",
78
+ },
79
+ ];
80
+
81
+ const seo: ExifCleanerLocaleContent['seo'] = [
82
+ {
83
+ type: 'summary',
84
+ title: 'EXIF 元数据清除工具:保护您的隐私',
85
+ items: [
86
+ '立即从照片中删除 GPS 坐标和位置信息',
87
+ '擦除相机型号、序列号和技术信息',
88
+ '100% 基于浏览器的处理 - 您的图像绝不会离开您的设备',
89
+ '保持视觉质量 - 仅删除隐藏数据'
90
+ ]
91
+ },
92
+ { type: 'title', text: '数字摄影中的隐私和 EXIF 元数据完整指南', level: 2 },
93
+ { type: 'paragraph', html: '您是否想过在向社交媒体上传照片时分享了多少个人信息?EXIF 元数据就像一个<strong>无形的指纹</strong>,可以揭示从您的精确家庭住址到摄影器材价格的一切信息。本指南解释了如何有效保护您的隐私。' },
94
+
95
+ { type: 'stats', items: [
96
+ { value: '100%', label: '隐私 - 本地处理', icon: 'mdi:shield-check' },
97
+ { value: '0%', label: '服务器上存储的数据', icon: 'mdi:database' },
98
+ { value: '即时', label: '元数据删除', icon: 'mdi:lightning-bolt' }
99
+ ], columns: 3 },
100
+
101
+ { type: 'title', text: '照片中隐藏了哪些信息?', level: 3 },
102
+ { type: 'paragraph', html: '超过 90% 的数字照片包含可能危及您安全的敏感信息。以下是可能泄露的所有数据:' },
103
+ { type: 'list', items: [
104
+ '<strong>GPS 坐标:</strong> 拍摄的确切纬度和经度(家庭住址、工作单位、经常访问的地方)。',
105
+ '<strong>设备识别:</strong> 相机或智能手机的品牌、型号和序列号(有价值的信息)。',
106
+ '<strong>技术设置:</strong> ISO、光圈 (f/)、曝光时间和焦距(允许识别您的特定器材)。',
107
+ '<strong>确切日期和时间:</strong> 您日常活动的完整时间线。',
108
+ '<strong>编辑历史:</strong> 使用的软件、编辑软件和最后修改日期。',
109
+ '<strong>版权数据:</strong> 摄影师、版权和个人笔记。'
110
+ ] },
111
+
112
+ { type: 'title', text: '真实安全风险:使用案例', level: 3 },
113
+ { type: 'comparative', items: [
114
+ {
115
+ title: '专业摄影师',
116
+ description: '通过序列号识别出的昂贵设备被盗的风险',
117
+ icon: 'mdi:camera',
118
+ points: [
119
+ '窃贼寻找拥有昂贵器材的摄影师',
120
+ 'GPS 识别所有者的家庭住址',
121
+ '序列号方便在暗网转卖'
122
+ ]
123
+ },
124
+ {
125
+ title: '父母和博主',
126
+ description: '极端危险:儿童的实时位置',
127
+ icon: 'mdi:alert',
128
+ points: [
129
+ '掠夺者使用 OSINT 追踪位置',
130
+ '掠夺者可以识别日常生活习惯',
131
+ '面临骚扰和身体追踪的风险'
132
+ ],
133
+ highlight: true
134
+ },
135
+ {
136
+ title: '社交媒体用户',
137
+ description: '个人和职业隐私曝光',
138
+ icon: 'mdi:share-variant',
139
+ points: [
140
+ '从办公室发布内容会泄露工作场所位置',
141
+ '地理位置允许推断大致薪资',
142
+ '公开数据允许有针对性的画像'
143
+ ]
144
+ },
145
+ {
146
+ title: '旅行者和游牧者',
147
+ description: '无人居住的房屋面临失窃危险',
148
+ icon: 'mdi:map',
149
+ points: [
150
+ '发布的 GPS 指明旅行期间家中无人',
151
+ '设备数据吸引犯罪分子',
152
+ '旅行历史揭示日程安排和模式'
153
+ ]
154
+ }
155
+ ], columns: 2 },
156
+
157
+ { type: 'title', text: '此工具的工作原理', level: 3 },
158
+ { type: 'list', items: [
159
+ '<strong>1. 选择您的图像:</strong> 拖动照片或使用选择器。您可以同时处理多张照片。',
160
+ '<strong>2. 自动分析:</strong> 工具检测并显示所有存在的元数据(GPS、相机型号、日期等)。',
161
+ '<strong>3. 即时清除:</strong> 一键删除 100% 的有害元数据。',
162
+ '<strong>4. 安全下载:</strong> 接收已匿名化的图像,随时可以在网络上安全分享。',
163
+ '<strong>5. 无残留:</strong> 干净的图像保留其所有的原始视觉质量。'
164
+ ], icon: 'mdi:check' },
165
+
166
+ { type: 'card', title: '隐私技术', icon: 'mdi:shield-check', html: '此工具使用<strong>浏览器的 Canvas API</strong> 逐像素创建图像的干净副本,确保:<br><br>- 不向服务器发送数据<br>- 您的图像绝不会离开您的设备<br>- 100% 匿名且安全处理<br>- 即使没有互联网连接也可以使用(初始加载后)' },
167
+
168
+ { type: 'title', text: '删除了哪些具体数据?', level: 3 },
169
+ { type: 'table', headers: ['元数据类型', '示例', '风险'], rows: [
170
+ ['EXIF(可交换)', 'GPS、ISO、光圈、快门速度、相机型号', '至关重要'],
171
+ ['IPTC(发布)', '版权、作者、关键词、场景位置', '高'],
172
+ ['XMP (XML)', '编辑历史、使用的软件、进行的编辑', '中'],
173
+ ['基本文件数据', '创建日期、确切时间、设备', '高']
174
+ ] },
175
+
176
+ { type: 'proscons', items: [
177
+ {
178
+ pro: '完全隐私 - 100% 基于浏览器的处理',
179
+ con: '需要支持 JavaScript 的现代浏览器'
180
+ },
181
+ {
182
+ pro: '即时 - 清除一张照片不到 1 秒',
183
+ con: '在旧设备上处理大尺寸照片可能会慢'
184
+ },
185
+ {
186
+ pro: '零画质损失 - 仅删除技术数据,不删除像素',
187
+ con: '不编辑图像(裁剪、旋转等)'
188
+ },
189
+ {
190
+ pro: '完全免费且无限制 - 处理无限量照片',
191
+ con: '无高级支持或云存储'
192
+ }
193
+ ], proTitle: '主要优势', conTitle: '局限性' },
194
+
195
+ { type: 'tip', title: '数字安全提示', html: '在任何社交网络发布照片<strong>之前先进行清理</strong>。即使您删除了帖子,元数据也可能已被搜索引擎或存档编入索引。预防胜于治疗。养成习惯:<br><br><em>照片 → 清除 EXIF → 发布</em>' },
196
+
197
+ { type: 'diagnostic', variant: 'warning', title: '不进行清理的真实风险', icon: 'mdi:alert-circle', badge: '关键安全', html: '<strong>已记录的案例:</strong><br>- 父母发布儿童照片 - 掠夺者追踪了 GPS<br>- 旅行摄影师 - 外出期间家被洗劫<br>- 博主 - 居住地点被偏执粉丝识别<br><br>这不是妄想症:这是 2026 年基本的数字卫生。' },
198
+
199
+ { type: 'glossary', items: [
200
+ {
201
+ term: 'EXIF',
202
+ definition: '可交换图像文件格式。在图像文件中存储技术元数据的标准:GPS、相机数据、曝光设置。存在于约 90% 的数字照片中,通常并非用户本意。'
203
+ },
204
+ {
205
+ term: 'GPS 坐标',
206
+ definition: '照片拍摄位置的精确经纬度。结合社交媒体,可以对人进行物理追踪。'
207
+ },
208
+ {
209
+ term: 'IPTC',
210
+ definition: '国际新闻电信理事会。可读的发布元数据:版权、作者、关键词、描述。专业摄影的标准。'
211
+ },
212
+ {
213
+ term: 'XMP',
214
+ definition: '可扩展元数据平台。一种 XML 格式,记录 Lightroom 或 Photoshop 等软件中的编辑历史。它可以显示所有进行的修改。'
215
+ },
216
+ {
217
+ term: 'OSINT',
218
+ definition: '开源情报。一种收集公开信息(社交媒体、元数据、记录)以在本人不知情的情况下对人进行画像的技术。'
219
+ },
220
+ {
221
+ term: '数字匿名化',
222
+ definition: '删除或混淆可识别信息的过程:位置、设备、行为模式。对在线隐私至关重要。'
223
+ }
224
+ ] },
225
+
226
+ { type: 'message', title: '保护隐私是您的责任', ariaLabel: '关于隐私和数据权利的信息', html: '我们不存储、处理或分享您的图像。<strong>您拥有完全控制权。</strong> 所有操作仅在您的浏览器中完成。当您关闭此标签页时,不会保留您的活动记录。这就是在互联网上保护隐私的方式:尊重您的数据的工具。' },
227
+
228
+ { type: 'title', text: '结论:分享不留痕迹', level: 3 },
229
+ { type: 'paragraph', html: '保护数字身份从细节开始。发布前清理照片是 2026 年<strong>基本的数字卫生习惯</strong>。它不仅保护您的位置信息,还保护您的家人、资产和职业隐私。一张看似普通的照片泄露的信息可能比您想象的要多。' }
230
+ ];
231
+
232
+ const faqSchema: WithContext<FAQPage> = {
233
+ '@context': 'https://schema.org',
234
+ '@type': 'FAQPage',
235
+ mainEntity: faq.map((item) => ({
236
+ '@type': 'Question',
237
+ name: item.question,
238
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
239
+ })),
240
+ };
241
+
242
+ const howToSchema: WithContext<HowTo> = {
243
+ '@context': 'https://schema.org',
244
+ '@type': 'HowTo',
245
+ name: title,
246
+ description,
247
+ step: howTo.map((step) => ({
248
+ '@type': 'HowToStep',
249
+ name: step.name,
250
+ text: step.text,
251
+ })),
252
+ };
253
+
254
+ const appSchema: WithContext<SoftwareApplication> = {
255
+ '@context': 'https://schema.org',
256
+ '@type': 'SoftwareApplication',
257
+ name: title,
258
+ description,
259
+ applicationCategory: 'UtilitiesApplication',
260
+ operatingSystem: 'Web',
261
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
262
+ inLanguage: 'zh',
263
+ };
264
+
265
+ export const content: ExifCleanerLocaleContent = {
266
+ slug,
267
+ title,
268
+ description,
269
+ ui,
270
+ seo,
271
+ faqTitle: "常见问题",
272
+ faq,
273
+ bibliographyTitle: "参考资料",
274
+ bibliography,
275
+ howTo,
276
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
277
+ };
@@ -30,20 +30,28 @@ export interface ExifCleanerUI {
30
30
 
31
31
  export type ExifCleanerLocaleContent = ToolLocaleContent<ExifCleanerUI>;
32
32
 
33
- import { content as es } from './i18n/es';
34
- import { content as en } from './i18n/en';
35
- import { content as fr } from './i18n/fr';
36
-
37
33
  export const exifCleaner: AudiovisualToolEntry<ExifCleanerUI> = {
38
- id: 'exif-cleaner',
34
+ id: 'limpiador-exif',
39
35
  icons: {
40
36
  bg: 'mdi:camera-off',
41
37
  fg: 'mdi:shield-check',
42
38
  },
43
39
  i18n: {
44
- es: async () => es as unknown as ExifCleanerLocaleContent,
45
- en: async () => en as unknown as ExifCleanerLocaleContent,
46
- fr: async () => fr as unknown as ExifCleanerLocaleContent,
40
+ es: async () => (await import('./i18n/es')).content as unknown as ExifCleanerLocaleContent,
41
+ en: async () => (await import('./i18n/en')).content as unknown as ExifCleanerLocaleContent,
42
+ fr: async () => (await import('./i18n/fr')).content as unknown as ExifCleanerLocaleContent,
43
+ de: async () => (await import('./i18n/de')).content as unknown as ExifCleanerLocaleContent,
44
+ it: async () => (await import('./i18n/it')).content as unknown as ExifCleanerLocaleContent,
45
+ pt: async () => (await import('./i18n/pt')).content as unknown as ExifCleanerLocaleContent,
46
+ id: async () => (await import('./i18n/id')).content as unknown as ExifCleanerLocaleContent,
47
+ ja: async () => (await import('./i18n/ja')).content as unknown as ExifCleanerLocaleContent,
48
+ ko: async () => (await import('./i18n/ko')).content as unknown as ExifCleanerLocaleContent,
49
+ nl: async () => (await import('./i18n/nl')).content as unknown as ExifCleanerLocaleContent,
50
+ pl: async () => (await import('./i18n/pl')).content as unknown as ExifCleanerLocaleContent,
51
+ ru: async () => (await import('./i18n/ru')).content as unknown as ExifCleanerLocaleContent,
52
+ sv: async () => (await import('./i18n/sv')).content as unknown as ExifCleanerLocaleContent,
53
+ tr: async () => (await import('./i18n/tr')).content as unknown as ExifCleanerLocaleContent,
54
+ zh: async () => (await import('./i18n/zh')).content as unknown as ExifCleanerLocaleContent,
47
55
  },
48
56
  };
49
57
 
@@ -0,0 +1,242 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ImageCompressorUI, ImageCompressorLocaleContent } from '../index';
3
+
4
+ const slug = 'online-bildkomprimierer-dateigroeße-ohne-qualitaetsverlust-reduzieren';
5
+ const title = 'Online Bildkomprimierer: Gewicht reduzieren ohne Qualitätsverlust';
6
+ const description = 'Optimieren und komprimieren Sie Ihre JPG-, PNG- und WebP-Fotos kostenlos. Reduzieren Sie die Dateigröße, um die Ladegeschwindigkeit Ihrer Website lokal zu verbessern.';
7
+
8
+ const ui: ImageCompressorUI = {
9
+ dropTitle: "Bilder optimieren",
10
+ dropSubtitle: "Ziehen Sie Ihre Fotos hierher, um ihr Gewicht sofort zu reduzieren.",
11
+ settingsTitle: "Komprimierungseinstellungen",
12
+ qualityLabel: "Visuelle Qualität",
13
+ widthLabel: "Maximale Breite (Pixel)",
14
+ convertToWebpLabel: "In WebP umwandeln",
15
+ compressionLabel: "Komprimierung",
16
+ compressBtn: "Bild komprimieren",
17
+ processingLabel: "Wird verarbeitet...",
18
+ resultsTitle: "Optimierte Bilder",
19
+ originalSizeLabel: "Ursprüngliche Größe",
20
+ newSizeLabel: "Neue Größe",
21
+ reductionLabel: "Ersparnis",
22
+ downloadBtn: "Herunterladen",
23
+ addMoreBtn: "Weitere hinzufügen",
24
+ browseFilesBtn: "Dateien durchsuchen",
25
+ processedFilesTitle: "Verarbeitete Dateien",
26
+ downloadAllBtn: "Alle herunterladen",
27
+ adjustThisImage: "Dieses Bild anpassen",
28
+ downloadTitle: "Download",
29
+ maxWidthLabel: "Max. Breite (px)",
30
+ closeBtn: "Schließen",
31
+ totalSavingsLabel: "Gesamtersparnis",
32
+ noSavings: "Keine Nettoersparnis",
33
+ faqTitle: "Häufig gestellte Fragen",
34
+ bibliographyTitle: "Referenzen"
35
+ };
36
+
37
+ const faq: ImageCompressorLocaleContent['faq'] = [
38
+ {
39
+ question: "Wie funktioniert die verlustfreie Komprimierung?",
40
+ answer: "Wir verwenden Algorithmen, die unnötige Metadaten entfernen und die Pixelkodierung optimieren. Bei der Wahl von WebP wird eine fortschrittlichere Komprimierungstechnologie als bei herkömmlichen Formaten verwendet.",
41
+ },
42
+ {
43
+ question: "Werden meine Bilder auf einen Server hochgeladen?",
44
+ answer: "Nein. Die gesamte Verarbeitung findet zu 100 % in Ihrem Browser statt (Client-Side). Ihre Fotos verlassen niemals Ihren Computer, was absolute Privatsphäre garantiert.",
45
+ },
46
+ {
47
+ question: "Warum sollte ich in WebP konvertieren?",
48
+ answer: "WebP ist der moderne Standard für das Web. Es bietet eine höhere Qualität als JPG und PNG bei einem bis zu 30 % geringeren Gewicht, was die Ladezeit der Seite beschleunigt.",
49
+ },
50
+ ];
51
+
52
+ const howTo: ImageCompressorLocaleContent['howTo'] = [
53
+ {
54
+ name: "Bild hochladen",
55
+ text: "Laden Sie die Datei hoch, die Sie komprimieren möchten (JPG, PNG oder WebP).",
56
+ },
57
+ {
58
+ name: "Qualität anpassen",
59
+ text: "Verwenden Sie den Schieberegler, um das perfekte Gleichgewicht zwischen Dateigröße und visueller Qualität zu finden (empfohlen: 75–85 %).",
60
+ },
61
+ {
62
+ name: "Größe ändern (optional)",
63
+ text: "Wenn das Bild sehr groß ist, können Sie eine maximale Breite angeben, um die Auflösung zu reduzieren.",
64
+ },
65
+ {
66
+ name: "Ergebnis herunterladen",
67
+ text: "Drücken Sie die Download Taste, um Ihr optimiertes Bild zur Verwendung zu erhalten.",
68
+ },
69
+ ];
70
+
71
+ const bibliography: ImageCompressorLocaleContent['bibliography'] = [
72
+ {
73
+ name: "WebP: Ein Bildformat für das Web",
74
+ url: "https://developers.google.com/speed/webp",
75
+ },
76
+ {
77
+ name: "Die Bedeutung der Bildoptimierung für SEO",
78
+ url: "https://developers.google.com/search/docs/appearance/google-images",
79
+ },
80
+ ];
81
+
82
+ const seo: ImageCompressorLocaleContent['seo'] = [
83
+ {
84
+ type: 'summary',
85
+ title: 'Professionelle Web Bildoptimierung',
86
+ items: [
87
+ 'Intelligente JPG-, PNG- und WebP-Komprimierung',
88
+ 'Gewicht um 50–80 % reduzieren bei Beibehaltung der visuellen Qualität',
89
+ '100 % lokale Verarbeitung – Privatsphäre garantiert',
90
+ 'Core Web Vitals und SEO-Positionierung verbessern'
91
+ ]
92
+ },
93
+ { type: 'title', text: 'Bildoptimierung: Web Geschwindigkeit und Core Web Vitals', level: 2 },
94
+ { type: 'paragraph', html: 'In der Ära der digitalen Unmittelbarkeit verliert eine langsame Website Nutzer. Nicht optimierte Bilder machen 60–70 % des Gesamtgewichts einer Webseite aus. Sie zu optimieren ist der erste Schritt, um Ihre Google-Metriken (LCP, CLS) und Ihre Positionierung in den Suchergebnissen zu verbessern.' },
95
+
96
+ { type: 'stats', items: [
97
+ { value: '50-80%', label: 'Typische Gewichtsreduktion', icon: 'mdi:trending-down' },
98
+ { value: '100%', label: 'Lokale Privatsphäre', icon: 'mdi:lock' },
99
+ { value: '+30%', label: 'Schneller als JPG', icon: 'mdi:speedometer' }
100
+ ], columns: 3 },
101
+
102
+ { type: 'title', text: 'Erklärung der Komprimierungsformate', level: 3 },
103
+ { type: 'table', headers: ['Format', 'Komprimierung', 'Anwendungsfälle', 'Kompatibilität'], rows: [
104
+ ['JPEG', 'Verlustbehaftet 50–90 %', 'Kamerafotos, redaktionelle Inhalte', 'Universal (100 %)'],
105
+ ['PNG', 'Verlustfrei 30–50 %', 'Grafiken, Logos, Transparenzen', 'Universal (100 %)'],
106
+ ['WebP', 'Verlustbehaftet/Verlustfrei 25–35 % mehr', 'Modernes Web, soziale Netzwerke', '95 % moderne Browser'],
107
+ ['AVIF', 'Verlustbehaftet/Verlustfrei 20 % Verbesserung', 'Next-Generation-Web', 'Nur neue Browser']
108
+ ] },
109
+
110
+ { type: 'card', title: 'Warum WebP die Zukunft ist', html: 'Google hat WebP speziell für das Web entwickelt. Es bietet eine überlegene Komprimierung gegenüber JPEG und PNG bei gleichbleibender oder verbesserter visueller Qualität. Es ist 25–35 % kleiner als äquivalente JPEGs. Moderne Browser unterstützen es zu 95 %.' },
111
+
112
+ { type: 'title', text: 'Verlustbehaftete vs. verlustfreie Komprimierung', level: 3 },
113
+ { type: 'comparative', items: [
114
+ {
115
+ title: 'Verlustbehaftete Komprimierung',
116
+ description: 'JPG, WebP – Entfernt unmerkliche visuelle Informationen',
117
+ icon: 'mdi:compress',
118
+ points: [
119
+ 'Reduziert 70–90 % des ursprünglichen Gewichts',
120
+ 'Für das menschliche Auge unmerklich, wenn die Qualität >75 % bleibt',
121
+ 'Ideal für realistische Fotografie',
122
+ 'Nicht empfohlen für Logos oder scharfen Text'
123
+ ],
124
+ highlight: true
125
+ },
126
+ {
127
+ title: 'Verlustfreie Komprimierung',
128
+ description: 'PNG, WebP verlustfrei – Behält 100 % der visuellen Daten bei',
129
+ icon: 'mdi:shield',
130
+ points: [
131
+ 'Reduziert 20–50 % des Gewichts',
132
+ 'Perfekte Qualität, keine Verschlechterung',
133
+ 'Ideal für Grafiken, Logos, Transparenzen',
134
+ 'Schwerere Dateien als bei verlustbehafteter Komprimierung'
135
+ ]
136
+ }
137
+ ], columns: 2 },
138
+
139
+ { type: 'title', text: 'Auswirkungen auf SEO und Conversion', level: 3 },
140
+ { type: 'list', items: [
141
+ '<strong>Core Web Vitals:</strong> Google straft langsame Seiten ab. Optimierte Bilder verbessern LCP (Largest Contentful Paint) direkt.',
142
+ '<strong>Absprungrate:</strong> Jede Sekunde Verzögerung = 7 % mehr Absprünge. Schnellere Bilder = weniger Nutzer, die die Seite verlassen.',
143
+ '<strong>Suchmaschinen-Ranking:</strong> Geschwindigkeit ist ein Ranking-Faktor. Die Optimierung von Bildern steigert die Positionierung.',
144
+ '<strong>Conversion:</strong> Schnellere Ladezeiten = mehr Conversions. Studien zeigen +10 % Conversion durch Optimierung.'
145
+ ], icon: 'mdi:check' },
146
+
147
+ { type: 'proscons', items: [
148
+ {
149
+ pro: 'Vollständige Privatsphäre: 100 % lokale Verarbeitung, keine Cloud-Server',
150
+ con: 'Erfordert Browser mit Canvas-API-Unterstützung (universell verfügbar)'
151
+ },
152
+ {
153
+ pro: 'WebP ist 25–35 % kleiner als JPEG bei gleicher Qualität',
154
+ con: 'Alte Versionen von Safari und IE unterstützen WebP nicht (Fallback verfügbar)'
155
+ },
156
+ {
157
+ pro: 'Sofortige Verarbeitung mehrerer Bilder',
158
+ con: 'Sehr große Bilder (>50 MB) erfordern möglicherweise Wartezeit'
159
+ },
160
+ {
161
+ pro: 'Optionales Resizing: Reduziert Auflösung zusätzlich zur Komprimierung',
162
+ con: 'Resizing führt zu Informationsverlust – besser die Auflösung an der Quelle optimieren'
163
+ }
164
+ ], proTitle: 'Vorteile', conTitle: 'Einschränkungen' },
165
+
166
+ { type: 'diagnostic', variant: 'warning', title: 'Vorsicht: Übermäßige Komprimierung verschlechtert das Bild', icon: 'mdi:alert', badge: 'Qualität', html: 'Halten Sie die Qualität >75 % für Fotografie und >85 % für redaktionelle Inhalte. Darunter werden Komprimierungsartefakte (Flecken, Streifenbildung) sichtbar. Ein Bild, das als Thumbnail gut aussieht, kann in groß schlecht wirken.' },
167
+
168
+ { type: 'glossary', items: [
169
+ {
170
+ term: 'Verlustbehaftete Komprimierung',
171
+ definition: 'Entfernt visuelle Daten, die das menschliche Auge als „Rauschen“ wahrnimmt. Ideal für Fotografie. JPEG, verlustbehaftetes WebP, HEIC sind verlustbehaftet.'
172
+ },
173
+ {
174
+ term: 'Verlustfreie Komprimierung',
175
+ definition: 'Reduziert die Größe ohne Verlust visueller Informationen. PNG und verlustfreies WebP. Ideal für Grafiken, Logos, Transparenzen.'
176
+ },
177
+ {
178
+ term: 'Core Web Vitals (Google)',
179
+ definition: 'Metriken für die Benutzererfahrung: LCP (Ladegeschwindigkeit), FID (Interaktionslatenz), CLS (visuelle Stabilität). Beeinflussen das SEO-Ranking.'
180
+ },
181
+ {
182
+ term: 'WebP',
183
+ definition: 'Von Google entwickeltes Format. 25–35 % kleiner als JPEG. Wird von 95 % der modernen Browser unterstützt (alle außer IE).'
184
+ },
185
+ {
186
+ term: 'Komprimierungsartefakte',
187
+ definition: 'Visuelle Defekte durch übermäßige Komprimierung: Flecken, Farbabstufungen, unscharfe Kanten. Unmerklich bei >75 % Qualität.'
188
+ }
189
+ ] },
190
+
191
+ { type: 'message', title: 'Professionelle Web Optimierung', ariaLabel: 'Informationen zur Bildoptimierung für SEO', html: 'Es ist keine technische Spielerei: Das Komprimieren von Bildern ist eine direkte Investition in die Benutzererfahrung und das Google-Ranking. Auf Mobilgeräten zählt jedes Kilobyte. Unser Tool macht das, was früher teure Profi-Software ($$$) erforderte, zu einem kostenlosen 3-Klick-Prozess.' },
192
+
193
+ { type: 'title', text: 'Bereit für das moderne Web', level: 3 },
194
+ { type: 'paragraph', html: 'Nutzen Sie intelligente Komprimierung und das WebP-Format, damit Ihre Onlinevisibilität schnell, responsiv und wettbewerbsfähig in der Suche ist. Professionelle Qualität, minimales Gewicht, sofortiges Laden.' }
195
+ ];
196
+
197
+ const faqSchema: WithContext<FAQPage> = {
198
+ '@context': 'https://schema.org',
199
+ '@type': 'FAQPage',
200
+ mainEntity: faq.map((item) => ({
201
+ '@type': 'Question',
202
+ name: item.question,
203
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
204
+ })),
205
+ };
206
+
207
+ const howToSchema: WithContext<HowTo> = {
208
+ '@context': 'https://schema.org',
209
+ '@type': 'HowTo',
210
+ name: title,
211
+ description,
212
+ step: howTo.map((step) => ({
213
+ '@type': 'HowToStep',
214
+ name: step.name,
215
+ text: step.text,
216
+ })),
217
+ };
218
+
219
+ const appSchema: WithContext<SoftwareApplication> = {
220
+ '@context': 'https://schema.org',
221
+ '@type': 'SoftwareApplication',
222
+ name: title,
223
+ description,
224
+ applicationCategory: 'UtilitiesApplication',
225
+ operatingSystem: 'Web',
226
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
227
+ inLanguage: 'de',
228
+ };
229
+
230
+ export const content: ImageCompressorLocaleContent = {
231
+ slug,
232
+ title,
233
+ description,
234
+ ui,
235
+ seo,
236
+ faqTitle: "Häufig gestellte Fragen",
237
+ faq,
238
+ bibliographyTitle: "Referenzen",
239
+ bibliography,
240
+ howTo,
241
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
242
+ };
@@ -2,7 +2,7 @@ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dt
2
2
  import type { ImageCompressorUI, ImageCompressorLocaleContent } from '../index';
3
3
 
4
4
  const slug = 'online-image-compressor-reduce-file-size-no-quality-loss';
5
- const title = 'Online Image Compressor - Reduce weight without losing quality';
5
+ const title = 'Online Image Compressor: Reduce weight without losing quality';
6
6
  const description = 'Optimize and compress your JPG, PNG, and WebP photos for free. Reduce file size to improve your web loading speed locally.';
7
7
 
8
8
  const ui: ImageCompressorUI = {
@@ -56,7 +56,7 @@ const howTo: ImageCompressorLocaleContent['howTo'] = [
56
56
  },
57
57
  {
58
58
  name: "Adjust quality",
59
- text: "Use the slider to find the perfect balance between file size and visual quality (recommended: 75-85%).",
59
+ text: "Use the slider to find the perfect balance between file size and visual quality (recommended: 75 85%).",
60
60
  },
61
61
  {
62
62
  name: "Resize (optional)",
@@ -2,7 +2,7 @@ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dt
2
2
  import type { ImageCompressorUI, ImageCompressorLocaleContent } from '../index';
3
3
 
4
4
  const slug = 'compresor-imagenes';
5
- const title = 'Compresor de Imágenes Online - Reduce el peso sin perder calidad';
5
+ const title = 'Compresor de Imágenes Online: Reduce el peso sin perder calidad';
6
6
  const description = 'Optimiza y comprime tus fotos JPG, PNG y WebP de forma gratuita. Reduce el tamaño de archivo para mejorar la velocidad de carga de tu web de forma local.';
7
7
 
8
8
  const ui: ImageCompressorUI = {
@@ -54,7 +54,7 @@ const howTo: ImageCompressorLocaleContent['howTo'] = [
54
54
  },
55
55
  {
56
56
  name: "Ajusta la calidad",
57
- text: "Usa el deslizador para encontrar el equilibrio perfecto entre peso de archivo y calidad visual (recomendado: 75-85%).",
57
+ text: "Usa el deslizador para encontrar el equilibrio perfecto entre peso de archivo y calidad visual (recomendado: 75 85%).",
58
58
  },
59
59
  {
60
60
  name: "Redimensiona (opcional)",