@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,246 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ChromaticLensUI, ChromaticLensLocaleContent } from '../index';
3
+
4
+ const slug = 'chromatic-lens-color-palette-extraction-online';
5
+ const title = 'Chromatic Lens: 在线色彩探针与调色盘提取工具';
6
+ const description = '免费从任何图像中提取专业的调色盘。使用数学算法识别照片中的主导色彩。';
7
+
8
+ const ui: ChromaticLensUI = {
9
+ dropTitle: "解析色彩",
10
+ dropSubtitle: "拖入图像以提取其色彩 DNA。",
11
+ processingLabel: "正在提取调色盘...",
12
+ paletteTitle: "提取的调色盘",
13
+ copyLabel: "复制 HEX",
14
+ copiedLabel: "已复制!",
15
+ colorCountLabel: "色彩数量",
16
+ changeImage: "更改图像",
17
+ faqTitle: "关于色彩提取的常见问题",
18
+ bibliographyTitle: "资源与技术文档"
19
+ };
20
+
21
+ const faq: ChromaticLensLocaleContent['faq'] = [
22
+ {
23
+ question: "色彩提取是如何工作的?",
24
+ answer: "我们使用“中位切分”(Median Cut)算法。该算法根据图像像素在 RGB 色彩空间中的接近程度进行分组,从而找到最具代表性的色调。",
25
+ },
26
+ {
27
+ question: "我可以将颜色复制到我的设计编辑器吗?",
28
+ answer: "是的,通过点击每种颜色,HEX 代码将自动复制到您的剪贴板,方便您将其粘贴到 Photoshop、Figma 或 CSS 中。",
29
+ },
30
+ {
31
+ question: "我可以解析哪些类型的图像?",
32
+ answer: "支持任何 JPG、PNG 或 WebP 文件。解析过程在本地完成,因此即使是大图像也能快速解析,且不消耗网络流量。",
33
+ },
34
+ ];
35
+
36
+ const howTo: ChromaticLensLocaleContent['howTo'] = [
37
+ {
38
+ name: "上传图像",
39
+ text: "上传您想要从中提取色彩灵感的照片。",
40
+ },
41
+ {
42
+ name: "调整精度",
43
+ text: "选择您希望工具识别的主导色彩数量(从 3 到 12 种)。",
44
+ },
45
+ {
46
+ name: "解析结果",
47
+ text: "调色盘将立即显示,并附带相应的十六进制 (HEX) 代码。",
48
+ },
49
+ {
50
+ name: "复制并使用",
51
+ text: "点击色调以保存它们并将其应用到您的设计项目中。",
52
+ },
53
+ ];
54
+
55
+ const bibliography: ChromaticLensLocaleContent['bibliography'] = [
56
+ {
57
+ name: "中位切分算法 - 维基百科",
58
+ url: "https://zh.wikipedia.org/wiki/%E4%B8%AD%E5%80%BC%E5%88%87%E5%88%86%E7%AE%97%E6%B3%95",
59
+ },
60
+ {
61
+ name: "设计师色彩理论",
62
+ url: "https://www.smashingmagazine.com/2010/01/color-theory-for-designers-part-1-the-meaning-of-color/",
63
+ },
64
+ ];
65
+
66
+ const seo: ChromaticLensLocaleContent['seo'] = [
67
+ {
68
+ type: 'summary',
69
+ title: '智能色彩探针与提取',
70
+ items: [
71
+ '专业的 Median Cut 色彩解析算法',
72
+ '从任何图像中提取 3-12 种主导色彩',
73
+ 'HEX 代码可直接克隆到剪贴板',
74
+ '100% 本地处理 - 创意人士的理想选择'
75
+ ]
76
+ },
77
+ { type: 'title', text: '色彩提取:科学与设计的交汇', level: 2 },
78
+ { type: 'paragraph', html: '您是否曾纳闷为什么一张电影截图看起来如此和谐?这并非巧合,而是色彩理论在起作用。Chromatic Lens 让您可以直接从像素中提取那种和谐美,并将其转换为可在您的设计项目中使用的 HEX 代码。' },
79
+
80
+ { type: 'stats', items: [
81
+ { value: '即时', label: '色彩解析', icon: 'mdi:lightning-bolt' },
82
+ { value: '100%', label: '本地隐私', icon: 'mdi:lock' },
83
+ { value: 'RGB', label: '精准色彩空间', icon: 'mdi:palette' }
84
+ ], columns: 3 },
85
+
86
+ { type: 'title', text: '中位切分算法详解', level: 3 },
87
+ { type: 'paragraph', html: '智能调色盘提取并非简单的随机采样。它使用中位切分(Median Cut)算法,这是一种确保忠实呈现的递归切分技术:' },
88
+ { type: 'list', items: [
89
+ '<strong>递归细分:</strong> 图像的 RGB “色彩立方体”被递归地细分为更小的方块。',
90
+ '<strong>体积平衡:</strong> 每个分区都力求将色彩空间中体积相似的像素归为一类。',
91
+ '<strong>加权平均:</strong> 每个方块最终产生的颜色是其包含的所有像素的平均值。',
92
+ '<strong>忠实呈现:</strong> 主导色彩反映了图像真实的视觉氛围,而不仅仅是简单的样本。'
93
+ ], icon: 'mdi:check' },
94
+
95
+ { type: 'card', title: '创意工作流', html: '非常适合网页开发者、UX/UI 设计师、数字艺术家以及希望立即捕捉照片、电影或视觉参考的视觉精髓并将其应用于界面、插画或品牌配色方案的创意人士。' },
96
+
97
+ { type: 'title', text: '数字设计中的应用场景', level: 3 },
98
+ { type: 'comparative', items: [
99
+ {
100
+ title: 'UX/UI 设计师',
101
+ description: '从画轴图像中提取配色以创建具有凝聚力的界面',
102
+ icon: 'mdi:palette',
103
+ points: [
104
+ '和谐的背景色',
105
+ '按钮和次要元素配色',
106
+ '自动计算的对比度'
107
+ ]
108
+ },
109
+ {
110
+ title: '网页开发者',
111
+ description: '直接根据视觉参考创建 CSS 样式表',
112
+ icon: 'mdi:code-braces',
113
+ points: [
114
+ '将 HEX 直接复制到 CSS',
115
+ 'SCSS/CSS 中的颜色变量',
116
+ '无需预先设计即可实现配色统一的主题'
117
+ ],
118
+ highlight: true
119
+ },
120
+ {
121
+ title: '数字艺术家与插画师',
122
+ description: '从电影、大自然或艺术作品中获取色彩参考',
123
+ icon: 'mdi:brush',
124
+ points: [
125
+ '从大师作品中提取参考配色',
126
+ '电影色彩研究',
127
+ '即时的视觉灵感'
128
+ ]
129
+ },
130
+ {
131
+ title: '品牌专家',
132
+ description: '基于指导性照片开发视觉识别系统',
133
+ icon: 'mdi:tag-multiple',
134
+ points: [
135
+ '从图像中提取品牌色彩',
136
+ '制作专业的色彩指南',
137
+ '确保视觉一致性'
138
+ ]
139
+ }
140
+ ], columns: 2 },
141
+
142
+ { type: 'title', text: '应用色彩理论', level: 3 },
143
+ { type: 'table', headers: ['色彩概念', '定义', '实际应用'], rows: [
144
+ ['色彩和谐', '视觉上平衡的色彩组合', 'UI 中具有凝聚力的视觉身份'],
145
+ ['对比度', '色彩之间的亮度差异', '可读性和视觉层级'],
146
+ ['饱和度', '色调的色彩强度', '专业感(低饱和)对比 活力感(高饱和)'],
147
+ ['色温', '暖色(红系)对比 冷色(蓝系)', '设计的感性心理学'],
148
+ ['单色配色', '单一色调的变化', '高雅与极简主义']
149
+ ] },
150
+
151
+ { type: 'proscons', items: [
152
+ {
153
+ pro: '精准的数学提取 - 而非大约的视觉选择',
154
+ con: '如果包含大量像素,极不明显的颜色也可能被选中'
155
+ },
156
+ {
157
+ pro: '即时复制到剪贴板 - 与工作流完美集成',
158
+ con: '需要支持 Canvas API 的现代浏览器'
159
+ },
160
+ {
161
+ pro: '完全隐私 - 100% 本地解析,不提交任何数据',
162
+ con: '不保存之前的解析历史'
163
+ },
164
+ {
165
+ pro: '兼容任何数字图像格式',
166
+ con: '最终色彩效果取决于图像的压缩程度和质量'
167
+ }
168
+ ], proTitle: '优势', conTitle: '局限性' },
169
+
170
+ { type: 'diagnostic', variant: 'success', title: '真实的色彩呈现', icon: 'mdi:check-circle-outline', badge: '先进算法', html: '与简单随机采样像素的工具不同,我们的系统使用中位切分算法,对每个色调的完整像素计数进行加权,确保生成的调色盘能忠实地反映原始图像的视觉氛围和色彩心理。' },
171
+
172
+ { type: 'glossary', items: [
173
+ {
174
+ term: '中位切分',
175
+ definition: '色彩量化算法,通过递归地将 RGB 空间细分为方块来确保均匀分布。历史上曾用于 GIF 和索引色彩技术。'
176
+ },
177
+ {
178
+ term: 'RGB 色彩空间',
179
+ definition: '基于红、绿、蓝的色彩模型。每种颜色表示为这三个数值(0-255)的组合。数字屏幕和网页的标准。'
180
+ },
181
+ {
182
+ term: 'HEX 代码',
183
+ definition: '网页上表示颜色的 6 位十六进制记法(#RRGGBB):#FF0000(红)、#00FF00(绿)、#0000FF(蓝)。在 CSS、Figma 和 Adobe 软件中通用。'
184
+ },
185
+ {
186
+ term: '色彩饱和度',
187
+ definition: '颜色的强度或纯度。高饱和度 = 鲜艳;低饱和度 = 偏灰。影响设计的感性认知。'
188
+ },
189
+ {
190
+ term: '色彩和谐',
191
+ definition: '选择和组合色彩以产生视觉上愉悦的结果。可以是单色、补色、类比色或三等分配色。'
192
+ }
193
+ ] },
194
+
195
+ { type: 'message', title: '专业的色彩解析', ariaLabel: '关于色彩解析的技术信息', html: 'Chromatic Lens 将手动视觉解析转化为算法精度。它不仅提取色彩:它捕捉任何图像的感性与视觉精髓,并将其作为即用型 HEX 代码直接放在您的剪贴板上。完全隐私,不限解析量。' },
196
+
197
+ { type: 'title', text: '源自视觉灵感的设计', level: 3 },
198
+ { type: 'paragraph', html: '最好的调色盘是能捕捉到参考物视觉意图的调色盘。Chromatic Lens 将过去需要手动操作的过程(观察、解析、记录)自动化了。现在,只需拖入一张图像,即可在几秒钟内获得专业的 HEX 代码。' }
199
+ ];
200
+
201
+ const faqSchema: WithContext<FAQPage> = {
202
+ '@context': 'https://schema.org',
203
+ '@type': 'FAQPage',
204
+ mainEntity: faq.map((item) => ({
205
+ '@type': 'Question',
206
+ name: item.question,
207
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
208
+ })),
209
+ };
210
+
211
+ const howToSchema: WithContext<HowTo> = {
212
+ '@context': 'https://schema.org',
213
+ '@type': 'HowTo',
214
+ name: title,
215
+ description,
216
+ step: howTo.map((step) => ({
217
+ '@type': 'HowToStep',
218
+ name: step.name,
219
+ text: step.text,
220
+ })),
221
+ };
222
+
223
+ const appSchema: WithContext<SoftwareApplication> = {
224
+ '@context': 'https://schema.org',
225
+ '@type': 'SoftwareApplication',
226
+ name: title,
227
+ description,
228
+ applicationCategory: 'UtilitiesApplication',
229
+ operatingSystem: 'Web',
230
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
231
+ inLanguage: 'zh',
232
+ };
233
+
234
+ export const content: ChromaticLensLocaleContent = {
235
+ slug,
236
+ title,
237
+ description,
238
+ ui,
239
+ seo,
240
+ faqTitle: "常见问题",
241
+ faq,
242
+ bibliographyTitle: "参考资料",
243
+ bibliography,
244
+ howTo,
245
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
246
+ };
@@ -16,10 +16,6 @@ export interface ChromaticLensUI {
16
16
 
17
17
  export type ChromaticLensLocaleContent = ToolLocaleContent<ChromaticLensUI>;
18
18
 
19
- import { content as es } from './i18n/es';
20
- import { content as en } from './i18n/en';
21
- import { content as fr } from './i18n/fr';
22
-
23
19
  export const chromaticLens: AudiovisualToolEntry<ChromaticLensUI> = {
24
20
  id: 'lente-cromatica',
25
21
  icons: {
@@ -27,9 +23,21 @@ export const chromaticLens: AudiovisualToolEntry<ChromaticLensUI> = {
27
23
  fg: 'mdi:eye-outline',
28
24
  },
29
25
  i18n: {
30
- es: async () => es as unknown as ChromaticLensLocaleContent,
31
- en: async () => en as unknown as ChromaticLensLocaleContent,
32
- fr: async () => fr as unknown as ChromaticLensLocaleContent,
26
+ es: async () => (await import('./i18n/es')).content as unknown as ChromaticLensLocaleContent,
27
+ en: async () => (await import('./i18n/en')).content as unknown as ChromaticLensLocaleContent,
28
+ fr: async () => (await import('./i18n/fr')).content as unknown as ChromaticLensLocaleContent,
29
+ de: async () => (await import('./i18n/de')).content as unknown as ChromaticLensLocaleContent,
30
+ it: async () => (await import('./i18n/it')).content as unknown as ChromaticLensLocaleContent,
31
+ pt: async () => (await import('./i18n/pt')).content as unknown as ChromaticLensLocaleContent,
32
+ id: async () => (await import('./i18n/id')).content as unknown as ChromaticLensLocaleContent,
33
+ ja: async () => (await import('./i18n/ja')).content as unknown as ChromaticLensLocaleContent,
34
+ ko: async () => (await import('./i18n/ko')).content as unknown as ChromaticLensLocaleContent,
35
+ nl: async () => (await import('./i18n/nl')).content as unknown as ChromaticLensLocaleContent,
36
+ pl: async () => (await import('./i18n/pl')).content as unknown as ChromaticLensLocaleContent,
37
+ ru: async () => (await import('./i18n/ru')).content as unknown as ChromaticLensLocaleContent,
38
+ sv: async () => (await import('./i18n/sv')).content as unknown as ChromaticLensLocaleContent,
39
+ tr: async () => (await import('./i18n/tr')).content as unknown as ChromaticLensLocaleContent,
40
+ zh: async () => (await import('./i18n/zh')).content as unknown as ChromaticLensLocaleContent,
33
41
  },
34
42
  };
35
43
 
@@ -0,0 +1,233 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { CollageMakerUI, CollageMakerLocaleContent } from '../index';
3
+
4
+ const slug = 'kostenloser-online-foto-collage-maker-professionelle-kompositionen';
5
+ const title = 'Online Collage Maker: Professionelle Kompositionen entwerfen';
6
+ const description = 'Erstellen Sie in Sekundenschnelle kostenlos Fotocollagen. Wählen Sie aus mehreren Layouts, passen Sie Rahmen an und laden Sie sie in hoher Qualität ohne Wasserzeichen herunter.';
7
+
8
+ const ui: CollageMakerUI = {
9
+ dropTitle: "Bilder hierher ziehen",
10
+ dropSub: "oder {link} – min. 2, max. 9",
11
+ dropLink: "Dateien auswählen",
12
+ imgsLoaded: "Geladene Bilder",
13
+ layoutLabel: "Layout",
14
+ settingsLabel: "Einstellungen",
15
+ borderLabel: "Rahmen",
16
+ borderColorLabel: "Rahmenfarbe",
17
+ bgColorLabel: "Hintergrund",
18
+ downloadBtn: "Herunterladen",
19
+ previewTitle: "Vorschau",
20
+ needsImgs: "Sie benötigen {n} Bilder",
21
+ errorMin: "Sie benötigen mindestens 2 Bilder",
22
+ errorMax: "Maximal 9 Bilder erlaubt",
23
+ errorLoad: "Fehler beim Laden der Bilder",
24
+ faqTitle: "Häufig gestellte Fragen",
25
+ bibliographyTitle: "Referenzen"
26
+ };
27
+
28
+ const faq: CollageMakerLocaleContent['faq'] = [
29
+ {
30
+ question: "Wie kann ich die Reihenfolge der Fotos ändern?",
31
+ answer: "Die Fotos werden in der Collage in der Reihenfolge platziert, in der sie in der Liste der geladenen Bilder erscheinen. Sie können eines entfernen und erneut hochladen, um seine Position anzupassen.",
32
+ },
33
+ {
34
+ question: "Welches Ausgabeformat hat die Collage?",
35
+ answer: "Die Collage wird im hochauflösenden WebP-Format heruntergeladen, ideal zum Teilen in sozialen Netzwerken ohne Schärfeverlust.",
36
+ },
37
+ ];
38
+
39
+ const howTo: CollageMakerLocaleContent['howTo'] = [
40
+ {
41
+ name: "Fotos hochladen",
42
+ text: "Wählen Sie zwischen 2 und 9 Bildern aus Ihrem Dateiexplorer aus.",
43
+ },
44
+ {
45
+ name: "Layout wählen",
46
+ text: "Wählen Sie das Raster aus, das am besten zur Anzahl der hochgeladenen Fotos passt.",
47
+ },
48
+ {
49
+ name: "Stil anpassen",
50
+ text: "Passen Sie die Rahmenstärke und farbe an, um der Collage ein professionelles Finish zu verleihen.",
51
+ },
52
+ {
53
+ name: "Herunterladen und teilen",
54
+ text: "Drücken Sie die Erstellen Taste und laden Sie Ihre finale Komposition sofort herunter.",
55
+ },
56
+ ];
57
+
58
+ const bibliography: CollageMakerLocaleContent['bibliography'] = [
59
+ {
60
+ name: "Fotografische Komposition: Die Kunst der Collage",
61
+ url: "https://en.wikipedia.org/wiki/Collage",
62
+ },
63
+ ];
64
+
65
+ const seo: CollageMakerLocaleContent['seo'] = [
66
+ {
67
+ type: 'summary',
68
+ title: 'Professioneller Online Collage Maker',
69
+ items: [
70
+ 'Mehrere Layouts und vordefinierte Raster',
71
+ 'Anpassung von Rahmen und Hintergrundfarben',
72
+ '1200px hohe Auflösung, bereit für soziale Netzwerke',
73
+ 'Sofortige Verarbeitung ohne Nutzungseinschränkungen'
74
+ ]
75
+ },
76
+ { type: 'title', text: 'Collage Design: Kompositionen, die Geschichten erzählen', level: 2 },
77
+ { type: 'paragraph', html: 'Eine Collage ist mehr als nur eine Mischung aus Fotos; sie ist eine visuelle Erzählung, die Emotionen und Kontext vermittelt. Mit unserem Tool können Sie professionelle geometrische Kompositionen für Instagram, Facebook, Pinterest oder persönliche Projekte erstellen, ohne Photoshop oder teure Software zu benötigen.' },
78
+
79
+ { type: 'stats', items: [
80
+ { value: '2-9', label: 'Bilder pro Collage', icon: 'mdi:image-multiple' },
81
+ { value: '1200px', label: 'HD-Auflösung', icon: 'mdi:video-high-definition' },
82
+ { value: 'Sofort', label: 'Erstellung', icon: 'mdi:lightning-bolt' }
83
+ ], columns: 3 },
84
+
85
+ { type: 'title', text: 'Visuelle Komposition: Designprinzipien', level: 3 },
86
+ { type: 'paragraph', html: 'Komposition ist die Kunst, visuelle Elemente so zu organisieren, dass sie das Auge des Betrachters führen und eine Absicht kommunizieren. Eine gute Collage balanciert Folgendes:' },
87
+ { type: 'list', items: [
88
+ '<strong>Gleichgewicht:</strong> Visuelle Verteilung des Gewichts (helle vs. dunkle Bilder, große vs. kleine).',
89
+ '<strong>Visueller Fluss:</strong> Das Auge sollte die Komposition natürlich durchqueren, ohne tote Winkel.',
90
+ '<strong>Kontrast:</strong> Variationen in Farbe, Größe und Form, die Aufmerksamkeit erregen.',
91
+ '<strong>Einheit:</strong> Thematische Kohärenz – Bilder müssen gemeinsam dieselbe Geschichte erzählen.'
92
+ ], icon: 'mdi:check' },
93
+
94
+ { type: 'card', title: 'Intelligente und adaptive Designs', html: 'Unser System berechnet automatisch die optimale Platzverteilung basierend auf der Anzahl der Fotos. 2 Bilder = symmetrisches Raster; 5 Bilder = ausgewogene asymmetrische Verteilung. Jedes Raster ist darauf ausgelegt, die visuelle Wirkung zu maximieren.' },
95
+
96
+ { type: 'comparative', items: [
97
+ {
98
+ title: 'Für soziale Netzwerke',
99
+ description: 'Instagram, TikTok, Facebook – quadratische Formate',
100
+ icon: 'mdi:share-all',
101
+ points: [
102
+ '1200px ist perfekt für den Instagram-Feed',
103
+ 'Quadratisches Format vermeidet das Zuschneiden beim Posten',
104
+ 'Anpassbare Rahmen für Branding'
105
+ ],
106
+ highlight: true
107
+ },
108
+ {
109
+ title: 'Für Portfolios',
110
+ description: 'Visuelle Schaufenster für Fotografen und Designer',
111
+ icon: 'mdi:briefcase-outline',
112
+ points: [
113
+ 'Mehrere Blickwinkel eines Projekts zeigen',
114
+ 'Zusammenhängende visuelle Erzählung',
115
+ 'Professioneller Druck für digitale Portfolios'
116
+ ]
117
+ },
118
+ {
119
+ title: 'Für persönliche Geschenke',
120
+ description: 'Drucke, Rahmen und digitale Alben',
121
+ icon: 'mdi:gift-outline',
122
+ points: [
123
+ 'Erinnerungen an Ereignisse (Hochzeiten, Reisen)',
124
+ 'Hohe Auflösung, bereit zum Drucken',
125
+ 'Sofortiges Design ohne manuellen Aufwand'
126
+ ]
127
+ }
128
+ ], columns: 3 },
129
+
130
+ { type: 'title', text: 'Anpassung: Rahmen und Farben', level: 3 },
131
+ { type: 'table', headers: ['Element', 'Visueller Effekt', 'Empfehlung'], rows: [
132
+ ['Weißer Rahmen', 'Sauber, minimalistisch, modern', 'Soziale Netzwerke, digitale Portfolios'],
133
+ ['Schwarzer Rahmen', 'Dramatisch, professionell, künstlerisch', 'Kunstfotografie, Mode, Luxus'],
134
+ ['Neutraler Rahmen (Grau)', 'Vielseitig, akademisch, korporativ', 'Business, Bildung, Neutralität'],
135
+ ['Kein Rahmen', 'Fusion, Kontinuität, immersiv', 'Einheitlicher Hintergrund, fließende Fotos']
136
+ ] },
137
+
138
+ { type: 'proscons', items: [
139
+ {
140
+ pro: 'Professionelle vordefinierte Designs – keine Kenntnisse in Komposition erforderlich',
141
+ con: 'Optionen auf vordefinierte Raster beschränkt'
142
+ },
143
+ {
144
+ pro: '1200px Auflösung, bereit für soziale Netzwerke ohne Skalierung',
145
+ con: 'Nicht so anpassbar wie Photoshop'
146
+ },
147
+ {
148
+ pro: '100% lokale Verarbeitung – Privatsphäre, Schnelligkeit, keine Limits',
149
+ con: 'Erfordert einen modernen Browser'
150
+ },
151
+ {
152
+ pro: 'Völlig kostenlos, keine Wasserzeichen, keine Werbung',
153
+ con: 'Keine individuellen Bearbeitungsoptionen (Zuschneiden, Drehen)'
154
+ }
155
+ ], proTitle: 'Vorteile', conTitle: 'Einschränkungen' },
156
+
157
+ { type: 'diagnostic', variant: 'success', title: 'Bereit für soziale Netzwerke', icon: 'mdi:check-circle-outline', badge: 'Optimiert', html: '1200x1200px ist die ideale Auflösung für Instagram. Es unterstützt jedes Seitenverhältnis, aber die quadratische Ausgabe maximiert die Wirkung im Feed, eliminiert automatisches Zuschneiden und sieht auf Desktop, Tablet und Handy gleichermaßen gut aus.' },
158
+
159
+ { type: 'glossary', items: [
160
+ {
161
+ term: 'Visuelle Komposition',
162
+ definition: 'Die Kunst des Organisierens von Elementen (Farbe, Form, Raum), um das Auge des Betrachters zu führen und eine emotionale Absicht zu kommunizieren.'
163
+ },
164
+ {
165
+ term: 'Drittel-Regel',
166
+ definition: 'Kompositionsprinzip: teilt das Bild in 9 gleiche Bereiche (3x3). Positionieren Sie Motive an Schnittlinien für maximale Wirkung.'
167
+ },
168
+ {
169
+ term: 'Symmetrisches Raster',
170
+ definition: 'Gleiche Raumaufteilungen. Beruhigend, ordentlich. Ideal für Fotopaare oder gerade Zahlen.'
171
+ },
172
+ {
173
+ term: 'Asymmetrisches Raster',
174
+ definition: 'Ungleiche Aufteilungen. Dynamisch, interessant, visuell. Ideal für 5+ Fotos mit unterschiedlichen Größen.'
175
+ },
176
+ {
177
+ term: 'Visuelles Gleichgewicht',
178
+ definition: 'Wahrgenommenes Gleichgewicht des visuellen Gewichts. Helles + dunkles Bild = Balance; großes + kleines = Balance.'
179
+ }
180
+ ] },
181
+
182
+ { type: 'message', title: 'Sofortige visuelle Erzählung', ariaLabel: 'Informationen über Komposition und Collagen', html: 'Jede Collage erzählt eine Geschichte. Unser automatischer Designer sorgt dafür, dass Ihre visuellen Geschichten ausgewogen und professionell wirken und bereit für die Welt sind – ohne auf einen Grafiker warten zu müssen.' },
183
+
184
+ { type: 'title', text: 'Erstellen, teilen, inspirieren', level: 3 },
185
+ { type: 'paragraph', html: 'Eine gut gemachte Collage macht den Unterschied zwischen einem vergesslichen Post und einem, an den sich Ihre Follower erinnern und den sie teilen. Nutzen Sie intelligente Komposition für Ihre visuellen Geschichten, um Wirkung zu erzielen.' }
186
+ ];
187
+
188
+ const faqSchema: WithContext<FAQPage> = {
189
+ '@context': 'https://schema.org',
190
+ '@type': 'FAQPage',
191
+ mainEntity: faq.map((item) => ({
192
+ '@type': 'Question',
193
+ name: item.question,
194
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
195
+ })),
196
+ };
197
+
198
+ const howToSchema: WithContext<HowTo> = {
199
+ '@context': 'https://schema.org',
200
+ '@type': 'HowTo',
201
+ name: title,
202
+ description,
203
+ step: howTo.map((step) => ({
204
+ '@type': 'HowToStep',
205
+ name: step.name,
206
+ text: step.text,
207
+ })),
208
+ };
209
+
210
+ const appSchema: WithContext<SoftwareApplication> = {
211
+ '@context': 'https://schema.org',
212
+ '@type': 'SoftwareApplication',
213
+ name: title,
214
+ description,
215
+ applicationCategory: 'UtilitiesApplication',
216
+ operatingSystem: 'Web',
217
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
218
+ inLanguage: 'de',
219
+ };
220
+
221
+ export const content: CollageMakerLocaleContent = {
222
+ slug,
223
+ title,
224
+ description,
225
+ ui,
226
+ seo,
227
+ faqTitle: "Häufig gestellte Fragen",
228
+ faq,
229
+ bibliographyTitle: "Referenzen",
230
+ bibliography,
231
+ howTo,
232
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
233
+ };
@@ -2,7 +2,7 @@ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dt
2
2
  import type { CollageMakerUI, CollageMakerLocaleContent } from '../index';
3
3
 
4
4
  const slug = 'free-online-photo-collage-maker-professional-compositions';
5
- const title = 'Online Collage Maker - Design professional compositions';
5
+ const title = 'Online Collage Maker: Design professional compositions';
6
6
  const description = 'Create photo collages for free in seconds. Choose from multiple layouts, adjust borders, and download in high quality without watermarks.';
7
7
 
8
8
  const ui: CollageMakerUI = {
@@ -2,7 +2,7 @@ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dt
2
2
  import type { CollageMakerUI, CollageMakerLocaleContent } from '../index';
3
3
 
4
4
  const slug = 'creador-collage-fotos';
5
- const title = 'Creador de Collages Online - Diseña composiciones profesionales';
5
+ const title = 'Creador de Collages Online: Diseña composiciones profesionales';
6
6
  const description = 'Crea collages de fotos gratis en segundos. Elige entre múltiples diseños, ajusta bordes y descarga en alta calidad sin marcas de agua.';
7
7
 
8
8
  const ui: CollageMakerUI = {
@@ -2,7 +2,7 @@ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dt
2
2
  import type { CollageMakerUI, CollageMakerLocaleContent } from '../index';
3
3
 
4
4
  const slug = 'createur-collage-photos-gratuit-compositions-professionnelles';
5
- const title = 'Créateur de Collages en Ligne - Concevez des compositions professionnelles';
5
+ const title = 'Créateur de Collages en Ligne: Concevez des compositions professionnelles';
6
6
  const description = 'Créez des collages de photos gratuitement en quelques secondes. Choisissez parmi plusieurs mises en page, ajustez les bordures et téléchargez en haute qualité sans filigrane.';
7
7
 
8
8
  const ui: CollageMakerUI = {