@jjlmoya/utils-tools 1.2.0 → 1.4.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 (180) hide show
  1. package/package.json +2 -1
  2. package/src/category/i18n/de.ts +172 -0
  3. package/src/category/i18n/id.ts +172 -0
  4. package/src/category/i18n/it.ts +172 -0
  5. package/src/category/i18n/ja.ts +172 -0
  6. package/src/category/i18n/ko.ts +172 -0
  7. package/src/category/i18n/nl.ts +172 -0
  8. package/src/category/i18n/pl.ts +172 -0
  9. package/src/category/i18n/pt.ts +172 -0
  10. package/src/category/i18n/ru.ts +172 -0
  11. package/src/category/i18n/sv.ts +172 -0
  12. package/src/category/i18n/tr.ts +172 -0
  13. package/src/category/i18n/zh.ts +172 -0
  14. package/src/category/index.ts +13 -1
  15. package/src/tests/i18n_coverage.test.ts +36 -0
  16. package/src/tests/locale_completeness.test.ts +1 -1
  17. package/src/tests/slug_language_code_format.test.ts +23 -0
  18. package/src/tests/slug_uniqueness.test.ts +81 -0
  19. package/src/tests/title_quality.test.ts +0 -1
  20. package/src/tool/date-diff-calculator/i18n/de.ts +132 -0
  21. package/src/tool/date-diff-calculator/i18n/fr.ts +1 -1
  22. package/src/tool/date-diff-calculator/i18n/id.ts +132 -0
  23. package/src/tool/date-diff-calculator/i18n/it.ts +132 -0
  24. package/src/tool/date-diff-calculator/i18n/ja.ts +132 -0
  25. package/src/tool/date-diff-calculator/i18n/ko.ts +132 -0
  26. package/src/tool/date-diff-calculator/i18n/nl.ts +132 -0
  27. package/src/tool/date-diff-calculator/i18n/pl.ts +132 -0
  28. package/src/tool/date-diff-calculator/i18n/pt.ts +132 -0
  29. package/src/tool/date-diff-calculator/i18n/ru.ts +132 -0
  30. package/src/tool/date-diff-calculator/i18n/sv.ts +132 -0
  31. package/src/tool/date-diff-calculator/i18n/tr.ts +132 -0
  32. package/src/tool/date-diff-calculator/i18n/zh.ts +132 -0
  33. package/src/tool/date-diff-calculator/index.ts +12 -0
  34. package/src/tool/drive-direct-link/i18n/de.ts +118 -0
  35. package/src/tool/drive-direct-link/i18n/id.ts +118 -0
  36. package/src/tool/drive-direct-link/i18n/it.ts +118 -0
  37. package/src/tool/drive-direct-link/i18n/ja.ts +118 -0
  38. package/src/tool/drive-direct-link/i18n/ko.ts +118 -0
  39. package/src/tool/drive-direct-link/i18n/nl.ts +118 -0
  40. package/src/tool/drive-direct-link/i18n/pl.ts +118 -0
  41. package/src/tool/drive-direct-link/i18n/pt.ts +118 -0
  42. package/src/tool/drive-direct-link/i18n/ru.ts +118 -0
  43. package/src/tool/drive-direct-link/i18n/sv.ts +118 -0
  44. package/src/tool/drive-direct-link/i18n/tr.ts +118 -0
  45. package/src/tool/drive-direct-link/i18n/zh.ts +118 -0
  46. package/src/tool/drive-direct-link/index.ts +12 -0
  47. package/src/tool/email-list-cleaner/i18n/de.ts +140 -0
  48. package/src/tool/email-list-cleaner/i18n/fr.ts +1 -1
  49. package/src/tool/email-list-cleaner/i18n/id.ts +140 -0
  50. package/src/tool/email-list-cleaner/i18n/it.ts +140 -0
  51. package/src/tool/email-list-cleaner/i18n/ja.ts +140 -0
  52. package/src/tool/email-list-cleaner/i18n/ko.ts +140 -0
  53. package/src/tool/email-list-cleaner/i18n/nl.ts +140 -0
  54. package/src/tool/email-list-cleaner/i18n/pl.ts +140 -0
  55. package/src/tool/email-list-cleaner/i18n/pt.ts +140 -0
  56. package/src/tool/email-list-cleaner/i18n/ru.ts +140 -0
  57. package/src/tool/email-list-cleaner/i18n/sv.ts +140 -0
  58. package/src/tool/email-list-cleaner/i18n/tr.ts +140 -0
  59. package/src/tool/email-list-cleaner/i18n/zh.ts +140 -0
  60. package/src/tool/email-list-cleaner/index.ts +12 -0
  61. package/src/tool/env-badge-spain/i18n/de.ts +153 -0
  62. package/src/tool/env-badge-spain/i18n/es.ts +1 -1
  63. package/src/tool/env-badge-spain/i18n/fr.ts +1 -1
  64. package/src/tool/env-badge-spain/i18n/id.ts +153 -0
  65. package/src/tool/env-badge-spain/i18n/it.ts +153 -0
  66. package/src/tool/env-badge-spain/i18n/ja.ts +153 -0
  67. package/src/tool/env-badge-spain/i18n/ko.ts +153 -0
  68. package/src/tool/env-badge-spain/i18n/nl.ts +153 -0
  69. package/src/tool/env-badge-spain/i18n/pl.ts +153 -0
  70. package/src/tool/env-badge-spain/i18n/pt.ts +153 -0
  71. package/src/tool/env-badge-spain/i18n/ru.ts +153 -0
  72. package/src/tool/env-badge-spain/i18n/sv.ts +153 -0
  73. package/src/tool/env-badge-spain/i18n/tr.ts +153 -0
  74. package/src/tool/env-badge-spain/i18n/zh.ts +153 -0
  75. package/src/tool/env-badge-spain/index.ts +12 -0
  76. package/src/tool/morse-beacon/i18n/de.ts +157 -0
  77. package/src/tool/morse-beacon/i18n/id.ts +157 -0
  78. package/src/tool/morse-beacon/i18n/it.ts +157 -0
  79. package/src/tool/morse-beacon/i18n/ja.ts +157 -0
  80. package/src/tool/morse-beacon/i18n/ko.ts +157 -0
  81. package/src/tool/morse-beacon/i18n/nl.ts +157 -0
  82. package/src/tool/morse-beacon/i18n/pl.ts +157 -0
  83. package/src/tool/morse-beacon/i18n/pt.ts +157 -0
  84. package/src/tool/morse-beacon/i18n/ru.ts +157 -0
  85. package/src/tool/morse-beacon/i18n/sv.ts +157 -0
  86. package/src/tool/morse-beacon/i18n/tr.ts +157 -0
  87. package/src/tool/morse-beacon/i18n/zh.ts +157 -0
  88. package/src/tool/morse-beacon/index.ts +13 -1
  89. package/src/tool/password-generator/i18n/de.ts +166 -0
  90. package/src/tool/password-generator/i18n/fr.ts +1 -1
  91. package/src/tool/password-generator/i18n/id.ts +166 -0
  92. package/src/tool/password-generator/i18n/it.ts +166 -0
  93. package/src/tool/password-generator/i18n/ja.ts +166 -0
  94. package/src/tool/password-generator/i18n/ko.ts +166 -0
  95. package/src/tool/password-generator/i18n/nl.ts +166 -0
  96. package/src/tool/password-generator/i18n/pl.ts +166 -0
  97. package/src/tool/password-generator/i18n/pt.ts +166 -0
  98. package/src/tool/password-generator/i18n/ru.ts +166 -0
  99. package/src/tool/password-generator/i18n/sv.ts +166 -0
  100. package/src/tool/password-generator/i18n/tr.ts +166 -0
  101. package/src/tool/password-generator/i18n/zh.ts +166 -0
  102. package/src/tool/password-generator/index.ts +13 -1
  103. package/src/tool/routes/i18n/de.ts +157 -0
  104. package/src/tool/routes/i18n/id.ts +157 -0
  105. package/src/tool/routes/i18n/it.ts +157 -0
  106. package/src/tool/routes/i18n/ja.ts +157 -0
  107. package/src/tool/routes/i18n/ko.ts +157 -0
  108. package/src/tool/routes/i18n/nl.ts +157 -0
  109. package/src/tool/routes/i18n/pl.ts +157 -0
  110. package/src/tool/routes/i18n/pt.ts +157 -0
  111. package/src/tool/routes/i18n/ru.ts +157 -0
  112. package/src/tool/routes/i18n/sv.ts +157 -0
  113. package/src/tool/routes/i18n/tr.ts +157 -0
  114. package/src/tool/routes/i18n/zh.ts +157 -0
  115. package/src/tool/routes/index.ts +13 -1
  116. package/src/tool/rule-of-three/i18n/de.ts +171 -0
  117. package/src/tool/rule-of-three/i18n/id.ts +171 -0
  118. package/src/tool/rule-of-three/i18n/it.ts +171 -0
  119. package/src/tool/rule-of-three/i18n/ja.ts +171 -0
  120. package/src/tool/rule-of-three/i18n/ko.ts +171 -0
  121. package/src/tool/rule-of-three/i18n/nl.ts +171 -0
  122. package/src/tool/rule-of-three/i18n/pl.ts +171 -0
  123. package/src/tool/rule-of-three/i18n/pt.ts +171 -0
  124. package/src/tool/rule-of-three/i18n/ru.ts +171 -0
  125. package/src/tool/rule-of-three/i18n/sv.ts +171 -0
  126. package/src/tool/rule-of-three/i18n/tr.ts +171 -0
  127. package/src/tool/rule-of-three/i18n/zh.ts +171 -0
  128. package/src/tool/rule-of-three/index.ts +13 -1
  129. package/src/tool/seo-content-optimizer/i18n/de.ts +136 -0
  130. package/src/tool/seo-content-optimizer/i18n/id.ts +136 -0
  131. package/src/tool/seo-content-optimizer/i18n/it.ts +136 -0
  132. package/src/tool/seo-content-optimizer/i18n/ja.ts +136 -0
  133. package/src/tool/seo-content-optimizer/i18n/ko.ts +136 -0
  134. package/src/tool/seo-content-optimizer/i18n/nl.ts +136 -0
  135. package/src/tool/seo-content-optimizer/i18n/pl.ts +136 -0
  136. package/src/tool/seo-content-optimizer/i18n/pt.ts +136 -0
  137. package/src/tool/seo-content-optimizer/i18n/ru.ts +136 -0
  138. package/src/tool/seo-content-optimizer/i18n/sv.ts +136 -0
  139. package/src/tool/seo-content-optimizer/i18n/tr.ts +136 -0
  140. package/src/tool/seo-content-optimizer/i18n/zh.ts +136 -0
  141. package/src/tool/seo-content-optimizer/index.ts +12 -0
  142. package/src/tool/speed-reader/i18n/de.ts +152 -0
  143. package/src/tool/speed-reader/i18n/id.ts +152 -0
  144. package/src/tool/speed-reader/i18n/it.ts +152 -0
  145. package/src/tool/speed-reader/i18n/ja.ts +152 -0
  146. package/src/tool/speed-reader/i18n/ko.ts +152 -0
  147. package/src/tool/speed-reader/i18n/nl.ts +152 -0
  148. package/src/tool/speed-reader/i18n/pl.ts +152 -0
  149. package/src/tool/speed-reader/i18n/pt.ts +152 -0
  150. package/src/tool/speed-reader/i18n/ru.ts +152 -0
  151. package/src/tool/speed-reader/i18n/sv.ts +152 -0
  152. package/src/tool/speed-reader/i18n/tr.ts +152 -0
  153. package/src/tool/speed-reader/i18n/zh.ts +152 -0
  154. package/src/tool/speed-reader/index.ts +12 -0
  155. package/src/tool/text-pixel-calculator/i18n/de.ts +133 -0
  156. package/src/tool/text-pixel-calculator/i18n/id.ts +133 -0
  157. package/src/tool/text-pixel-calculator/i18n/it.ts +133 -0
  158. package/src/tool/text-pixel-calculator/i18n/ja.ts +133 -0
  159. package/src/tool/text-pixel-calculator/i18n/ko.ts +133 -0
  160. package/src/tool/text-pixel-calculator/i18n/nl.ts +133 -0
  161. package/src/tool/text-pixel-calculator/i18n/pl.ts +133 -0
  162. package/src/tool/text-pixel-calculator/i18n/pt.ts +133 -0
  163. package/src/tool/text-pixel-calculator/i18n/ru.ts +133 -0
  164. package/src/tool/text-pixel-calculator/i18n/sv.ts +133 -0
  165. package/src/tool/text-pixel-calculator/i18n/tr.ts +133 -0
  166. package/src/tool/text-pixel-calculator/i18n/zh.ts +133 -0
  167. package/src/tool/text-pixel-calculator/index.ts +12 -0
  168. package/src/tool/whatsapp-link/i18n/de.ts +128 -0
  169. package/src/tool/whatsapp-link/i18n/id.ts +128 -0
  170. package/src/tool/whatsapp-link/i18n/it.ts +128 -0
  171. package/src/tool/whatsapp-link/i18n/ja.ts +128 -0
  172. package/src/tool/whatsapp-link/i18n/ko.ts +128 -0
  173. package/src/tool/whatsapp-link/i18n/nl.ts +128 -0
  174. package/src/tool/whatsapp-link/i18n/pl.ts +128 -0
  175. package/src/tool/whatsapp-link/i18n/pt.ts +128 -0
  176. package/src/tool/whatsapp-link/i18n/ru.ts +128 -0
  177. package/src/tool/whatsapp-link/i18n/sv.ts +128 -0
  178. package/src/tool/whatsapp-link/i18n/tr.ts +128 -0
  179. package/src/tool/whatsapp-link/i18n/zh.ts +128 -0
  180. package/src/tool/whatsapp-link/index.ts +12 -0
@@ -0,0 +1,171 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
+ import type { RuleOfThreeUI } from '../ui';
4
+
5
+ const faqData = [
6
+ {
7
+ question: '什么是简单直接的三数法?',
8
+ answer: '这是一种解决三个已知值与一个未知值之间比例问题的数学方法。它被称为“直接”比例,是因为当一个量增加时,另一个量也以相同的比例增加。',
9
+ },
10
+ {
11
+ question: '我应该什么时候使用反比例三数法?',
12
+ answer: '当两个量成反比时(一个量增加,另一个量减少)使用。例如:如果 2 名油漆工需要 5 小时,那么 4 名油漆工所需的时间就会更少。我们目前的计算器专注于正比例计算。',
13
+ },
14
+ {
15
+ question: '它对于专业计算准确吗?',
16
+ answer: '是的。我们的计算器使用高保真浮点精度,非常适合剂量调整、图形设计缩放、商业预算和配方转换。',
17
+ },
18
+ {
19
+ question: '如何手动计算?',
20
+ answer: '公式为:(B 值 * C 值) / A 值 = X。也就是说,将对角线上的值相乘,然后将结果除以剩余的值。',
21
+ },
22
+ ];
23
+
24
+ const howToData = [
25
+ {
26
+ name: '确定基本关系',
27
+ text: '输入形成初始比例的两个已知值(例如,100km 等于 8 升)。',
28
+ },
29
+ {
30
+ name: '输入第三个值',
31
+ text: '写下您想要寻找其等价值的新值(例如,如果我要旅行 250km...)。',
32
+ },
33
+ {
34
+ name: '获取结果',
35
+ text: '系统将实时自动计算未知值 (X),无需按下任何按钮。',
36
+ },
37
+ {
38
+ name: '复制或重置',
39
+ text: '您可以直接将结果复制到剪贴板,或者清空字段以进行新的计算。',
40
+ },
41
+ ];
42
+
43
+ const faqSchema: WithContext<FAQPage> = {
44
+ '@context': 'https://schema.org',
45
+ '@type': 'FAQPage',
46
+ mainEntity: faqData.map((item) => ({
47
+ '@type': 'Question',
48
+ name: item.question,
49
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
50
+ })),
51
+ };
52
+
53
+ const howToSchema: WithContext<HowTo> = {
54
+ '@context': 'https://schema.org',
55
+ '@type': 'HowTo',
56
+ name: '如何使用三数法(比例)计算器',
57
+ step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
58
+ };
59
+
60
+ const appSchema: WithContext<SoftwareApplication> = {
61
+ '@context': 'https://schema.org',
62
+ '@type': 'SoftwareApplication',
63
+ name: '简单三数法比例计算器',
64
+ applicationCategory: 'UtilitiesApplication',
65
+ operatingSystem: 'Web',
66
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
67
+ description: '即时解决数学比例问题。用于计算数量、配方、折扣和转换的权威工具。',
68
+ };
69
+
70
+ const ui: RuleOfThreeUI = {
71
+ labelA: '如果我有...',
72
+ labelB: '等于...',
73
+ labelC: '而现在我有...',
74
+ labelX: '结果 (X)',
75
+ hintA: '初始数量',
76
+ hintB: '已知值',
77
+ hintC: '新数量',
78
+ hintX: '计算出的值',
79
+ separatorIsTo: '比上',
80
+ separatorWillBe: '等于',
81
+ copyTitle: '复制结果',
82
+ };
83
+
84
+ export const content: ToolLocaleContent<RuleOfThreeUI> = {
85
+ slug: 'rule-of-three',
86
+ title: '简单三数法比例计算器',
87
+ description: '即时解决数学比例问题。用于计算数量、配方、折扣和转换的权威工具。',
88
+ ui,
89
+ faqTitle: '常见问题',
90
+ faq: faqData,
91
+ howTo: howToData,
92
+ bibliographyTitle: '参考文献',
93
+ bibliography: [
94
+ { name: '比例(数学) — 维基百科', url: 'https://zh.wikipedia.org/wiki/%E6%AF%94%E4%BE%8B' },
95
+ { name: '比和比例 — 可汗学院', url: 'https://zh.khanacademy.org/math/pre-algebra/pre-algebra-ratios-rates' },
96
+ ],
97
+ schemas: [faqSchema, howToSchema, appSchema],
98
+ seo: [
99
+ {
100
+ type: 'title',
101
+ text: '三数法比例计算用于什么?',
102
+ level: 2,
103
+ },
104
+ {
105
+ type: 'paragraph',
106
+ html: '简单直接的三数法是数学中的“瑞士军刀”。它解决了已知三个数据点并寻求第四个数据点的问题。如果您知道 <strong>A 和 B</strong> 之间的关系,并且有一个新值 <strong>C</strong>,计算器会立即找到 <strong>X</strong>。',
107
+ },
108
+ {
109
+ type: 'comparative',
110
+ columns: 2,
111
+ items: [
112
+ {
113
+ icon: 'mdi:chef-hat',
114
+ title: '烹饪和配方',
115
+ description: '如果配方要求 4 个人的面粉量为 500g,那么 7 个人需要多少?',
116
+ points: ['(500 × 7) ÷ 4 = 875g'],
117
+ },
118
+ {
119
+ icon: 'mdi:shopping',
120
+ title: '购物和价格',
121
+ description: '如果一包 3 罐的价格为 2.50 欧元,那么 10 罐需要多少钱?',
122
+ points: ['(2.50 × 10) ÷ 3 = 8.33 欧元'],
123
+ },
124
+ {
125
+ icon: 'mdi:car',
126
+ title: '旅行和距离',
127
+ description: '如果我跑 60km 需要 45 分钟,那么跑 140km 需要多长时间?',
128
+ points: ['(45 × 140) ÷ 60 = 105 分钟'],
129
+ },
130
+ {
131
+ icon: 'mdi:monitor-screenshot',
132
+ title: '设计和屏幕',
133
+ description: '如果图片宽度为 1920px,而我想在保持比例的同时将其减小到 800px...',
134
+ points: ['(原始高度 × 800) ÷ 1920 = 新高度'],
135
+ },
136
+ ],
137
+ },
138
+ {
139
+ type: 'title',
140
+ text: '公式是如何工作的?',
141
+ level: 2,
142
+ },
143
+ {
144
+ type: 'paragraph',
145
+ html: '公式始终相同:<strong>将对角线上的值相乘,然后除以剩余的值</strong>。',
146
+ },
147
+ {
148
+ type: 'code',
149
+ code: '(B × C) ÷ A = X',
150
+ ariaLabel: '简单直接三数法公式',
151
+ },
152
+ {
153
+ type: 'paragraph',
154
+ html: '在计算器中:我们将值 <strong>B</strong> 乘以值 <strong>C</strong>,然后除以 <strong>A</strong>。结果就是 <strong>X</strong>。',
155
+ },
156
+ {
157
+ type: 'title',
158
+ text: '专业和日常用途',
159
+ level: 2,
160
+ },
161
+ {
162
+ type: 'paragraph',
163
+ html: '除了学校数学之外,比例计算无处不在:在药房中用于根据体重计算剂量,在摄影中用于计算曝光时间,在金融中用于计算百分比变化,或在印刷中用于缩放格式尺寸。',
164
+ },
165
+ {
166
+ type: 'tip',
167
+ title: '精度提示',
168
+ html: '结果最多显示 4 位有效小数。如果您处理的是货币或精确测量值,请记得根据具体情况进行四舍五入:欧元保留 2 位小数,像素保留为整数。',
169
+ },
170
+ ],
171
+ };
@@ -8,9 +8,21 @@ export const ruleOfThree: ToolsToolEntry<RuleOfThreeUI> = {
8
8
  id: 'rule-of-three',
9
9
  icons: { bg: 'mdi:calculator-variant', fg: 'mdi:equal' },
10
10
  i18n: {
11
- es: () => import('./i18n/es').then((m) => m.content),
11
+ de: () => import('./i18n/de').then((m) => m.content),
12
12
  en: () => import('./i18n/en').then((m) => m.content),
13
+ es: () => import('./i18n/es').then((m) => m.content),
13
14
  fr: () => import('./i18n/fr').then((m) => m.content),
15
+ id: () => import('./i18n/id').then((m) => m.content),
16
+ it: () => import('./i18n/it').then((m) => m.content),
17
+ ja: () => import('./i18n/ja').then((m) => m.content),
18
+ ko: () => import('./i18n/ko').then((m) => m.content),
19
+ nl: () => import('./i18n/nl').then((m) => m.content),
20
+ pl: () => import('./i18n/pl').then((m) => m.content),
21
+ pt: () => import('./i18n/pt').then((m) => m.content),
22
+ ru: () => import('./i18n/ru').then((m) => m.content),
23
+ sv: () => import('./i18n/sv').then((m) => m.content),
24
+ tr: () => import('./i18n/tr').then((m) => m.content),
25
+ zh: () => import('./i18n/zh').then((m) => m.content),
14
26
  },
15
27
  };
16
28
 
@@ -0,0 +1,136 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
+ import type { SeoContentOptimizerUI } from '../ui';
4
+
5
+ const faqData = [
6
+ {
7
+ question: 'Wie hilft dieses Tool meinem SEO-Ranking?',
8
+ answer: 'Durch die Analyse der Keyword-Dichte und der Lesbarkeit von Sätzen stellen Sie sicher, dass Ihr Inhalt für Benutzer leicht verständlich und für Suchmaschinen relevant ist, während Strafen für Überoptimierung vermieden werden.',
9
+ },
10
+ {
11
+ question: 'Welche HTML-Elemente prüft die technische Analyse?',
12
+ answer: 'Es überprüft die Existenz und Einzigartigkeit des H1-Tags, das Vorhandensein von H2/H3-Unterüberschriften und Alt-Attribute bei Bildern.',
13
+ },
14
+ {
15
+ question: 'Wird mein Inhalt auf einem Server gespeichert?',
16
+ answer: 'Nein. Die Analyse läuft zu 100 % lokal in Ihrem Browser. Ihr Inhalt verlässt niemals Ihren Computer.',
17
+ },
18
+ {
19
+ question: 'Ist es mit den Yoast SEO-Kriterien kompatibel?',
20
+ answer: 'Ja, wir implementieren ähnliche Kriterien wie Yoast: Satzlänge, Absatzverteilung und Überschriftenhierarchie.',
21
+ },
22
+ ];
23
+
24
+ const howToData = [
25
+ { name: 'Text schreiben oder einfügen', text: 'Geben Sie den Inhalt, den Sie analysieren möchten, in den Haupttextbereich ein.' },
26
+ { name: 'Optimierungs-Checkliste prüfen', text: 'Überprüfen Sie die Warnungen zu Länge, Lesbarkeit und Keyword-Dichte im Seitenpanel.' },
27
+ { name: 'Technisches HTML analysieren', text: 'Wechseln Sie zum Tab für die technische Analyse, um H1-Tags, Bild-Alts und Metadatenstruktur zu überprüfen.' },
28
+ ];
29
+
30
+ const faqSchema: WithContext<FAQPage> = {
31
+ '@context': 'https://schema.org',
32
+ '@type': 'FAQPage',
33
+ mainEntity: faqData.map((item) => ({
34
+ '@type': 'Question',
35
+ name: item.question,
36
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
37
+ })),
38
+ };
39
+
40
+ const howToSchema: WithContext<HowTo> = {
41
+ '@context': 'https://schema.org',
42
+ '@type': 'HowTo',
43
+ name: 'So optimieren Sie Inhalte für SEO',
44
+ step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
45
+ };
46
+
47
+ const appSchema: WithContext<SoftwareApplication> = {
48
+ '@context': 'https://schema.org',
49
+ '@type': 'SoftwareApplication',
50
+ name: 'SEO Content Optimizer',
51
+ applicationCategory: 'UtilitiesApplication',
52
+ operatingSystem: 'Web',
53
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
54
+ description: 'Analysieren Sie Keyword-Dichte, Lesbarkeit und technische HTML-Struktur Ihrer Texte in Echtzeit, ohne Daten an einen Server zu senden.',
55
+ };
56
+
57
+ const ui: SeoContentOptimizerUI = {
58
+ tabText: 'Textanalyse',
59
+ tabHtml: 'Technische HTML-Analyse',
60
+ textareaPlaceholder: 'Schreiben Sie Ihren Text oder fügen Sie hier Ihren HTML-Code ein...',
61
+ statsChars: 'Zeichen',
62
+ statsWords: 'Wörter',
63
+ statsReading: 'Lesezeit',
64
+ statsSentences: 'Sätze',
65
+ checklistTitle: 'Optimierungs-Checkliste',
66
+ keywordsTitle: 'Keyword-Dichte',
67
+ technicalTitle: 'Technische HTML-Analyse',
68
+ h1Label: 'H1 erkannt',
69
+ linksLabel: 'Links (a)',
70
+ imgsLabel: 'Bilder (img)',
71
+ altsLabel: 'Fehlende Alts',
72
+ emptyState: 'Keine Daten',
73
+ analyzing: 'Analyse läuft...',
74
+ checkInsufficient: 'Unzureichende Länge (< 300 Wörter)',
75
+ checkPillar: 'Hervorragender Pillar-Content (> 900 Wörter)',
76
+ checkGoodLength: 'Gute Länge für SEO',
77
+ checkLongSentences: 'Zu viele lange Sätze (> 25 % des Textes)',
78
+ checkGoodReadability: 'Optimale Satzlesbarkeit',
79
+ checkLongParagraphs: 'Sehr lange Absätze aufteilen (> 150 Wörter)',
80
+ checkMissingH1: 'Fehlender H1-Tag',
81
+ checkMultipleH1: 'Mehrere H1-Tags erkannt',
82
+ checkMissingH2: 'Fehlende Unterüberschriften (H2)',
83
+ checkMissingTitle: 'Fehlender Meta-Title-Tag',
84
+ stopWords: JSON.stringify(['der', 'die', 'das', 'und', 'oder', 'aber', 'in', 'auf', 'an', 'zu', 'für', 'von', 'mit', 'bei', 'aus', 'als', 'ist', 'war', 'sind', 'waren', 'sein', 'gewesen', 'haben', 'hat', 'hatte', 'tun', 'macht', 'machte', 'es', 'sein', 'dieser', 'jener', 'diese', 'jene', 'nicht', 'kein', 'so', 'oben', 'wenn', 'mein', 'dein', 'sein', 'ihr', 'unser', 'euer', 'ihr']),
85
+ };
86
+
87
+ export const content: ToolLocaleContent<SeoContentOptimizerUI> = {
88
+ slug: 'seo-inhalt-optimierer',
89
+ title: 'SEO Content Optimizer',
90
+ description: 'Analysieren Sie Keyword-Dichte, Lesbarkeit und technische HTML-Struktur Ihrer Texte in Echtzeit. Kostenloses und privates SEO-Tool.',
91
+ ui,
92
+ faqTitle: 'Häufig gestellte Fragen',
93
+ faq: faqData,
94
+ howTo: howToData,
95
+ bibliographyTitle: 'Referenzen',
96
+ bibliography: [
97
+ { name: "Googles Startleitfaden zur Suchmaschinenoptimierung (SEO)", url: 'https://developers.google.com/search/docs/fundamentals/seo-starter-guide?hl=de' },
98
+ { name: 'Yoast SEO Lesbarkeitskriterien', url: 'https://yoast.com/what-is-readability/' },
99
+ ],
100
+ schemas: [faqSchema, howToSchema, appSchema],
101
+ seo: [
102
+ { type: 'title', level: 2, text: 'SEO Content Optimizer: Keywords, Lesbarkeit und Struktur' },
103
+ {
104
+ type: 'paragraph',
105
+ html: 'Die Qualität der Inhalte wird nicht mehr allein an den enthaltenen Keywords gemessen, sondern daran, wie Sie Ihre Informationen strukturieren, damit sie sowohl für Menschen als auch für Google-Crawler leicht verdaulich sind. Unser <strong>Echtzeit-SEO-Analyse-Tool</strong> gibt Ihnen die volle Kontrolle über Keyword-Dichte, Absatzlesbarkeit und grundlegende technische HTML-Elemente.',
106
+ },
107
+ { type: 'title', level: 3, text: 'Keyword-Dichte und semantische Relevanz' },
108
+ {
109
+ type: 'paragraph',
110
+ html: 'Die <strong>Keyword-Dichte</strong> gibt an, wie oft ein Begriff im Vergleich zum Rest des Textes vorkommt. Eine übermäßige Wiederholung löst <em>Keyword-Stuffing</em>-Filter aus, während eine sehr niedrige Dichte es Suchmaschinen erschweren kann, das zentrale Thema Ihres Artikels zu identifizieren.',
111
+ },
112
+ {
113
+ type: 'list',
114
+ items: [
115
+ '<strong>Relevanzanalyse:</strong> Identifizieren Sie, ob die am häufigsten wiederholten Wörter mit Ihrer Suchabsicht übereinstimmen.',
116
+ '<strong>Strafvermeidung:</strong> Vermeiden Sie die übermäßige Wiederholung von Begriffen, die als Spam wirken könnten.',
117
+ '<strong>Semantische Optimierung:</strong> Finden Sie das Gleichgewicht zwischen Fachbegriffen und natürlicher Sprache.',
118
+ ],
119
+ },
120
+ { type: 'title', level: 3, text: 'Lesbarkeit im Yoast-Stil' },
121
+ {
122
+ type: 'paragraph',
123
+ html: 'Lesbarkeit ist ein indirekter, aber entscheidender Ranking-Faktor. Wenn Benutzer abspringen, weil Absätze endlose Textblöcke sind, sinkt Ihre <em>Verweildauer</em>. Der Analyser erkennt lange Sätze (über 20 Wörter), Absätze über 150 Wörter und prüft auf Unterüberschriften.',
124
+ },
125
+ {
126
+ type: 'tip',
127
+ title: 'Lesezeit',
128
+ html: 'Die meisten Benutzer entscheiden in weniger als 10 Sekunden, ob sie einen Artikel lesen. Die Kenntnis der geschätzten Lesezeit (berechnet mit durchschnittlich 200 Wörtern pro Minute) hilft, die Absprungrate zu senken, indem die Erwartungen der Leser erfüllt werden.',
129
+ },
130
+ { type: 'title', level: 3, text: 'Technische HTML-Analyse' },
131
+ {
132
+ type: 'paragraph',
133
+ html: 'Fügen Sie Ihren Quellcode ein, um wichtige Elemente zu überprüfen: Einzigartigkeit des <strong>H1</strong>, Vorhandensein von H2/H3-Unterüberschriften, Bilder ohne <code>alt</code>-Attribute und Existenz des <code>title</code>-Tags. Die gesamte Verarbeitung erfolgt in Ihrem Browser, ohne Daten an einen Server zu senden.',
134
+ },
135
+ ],
136
+ };
@@ -0,0 +1,136 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
+ import type { SeoContentOptimizerUI } from '../ui';
4
+
5
+ const faqData = [
6
+ {
7
+ question: 'Bagaimana alat ini membantu peringkat SEO saya?',
8
+ answer: 'Dengan menganalisis kepadatan kata kunci dan keterbacaan kalimat, Anda memastikan konten Anda mudah dipahami oleh pengguna dan relevan bagi mesin pencari, serta menghindari penalti pengoptimalan berlebih.',
9
+ },
10
+ {
11
+ question: 'Elemen HTML apa yang diperiksa oleh analisis teknis?',
12
+ answer: 'Alat ini memverifikasi keberadaan dan keunikan tag H1, keberadaan subjudul H2/H3, dan atribut alt pada gambar.',
13
+ },
14
+ {
15
+ question: 'Apakah konten saya disimpan di server mana pun?',
16
+ answer: 'Tidak. Analisis berjalan 100% secara lokal di browser Anda. Konten Anda tidak pernah meninggalkan komputer Anda.',
17
+ },
18
+ {
19
+ question: 'Apakah ini kompatibel dengan kriteria Yoast SEO?',
20
+ answer: 'Ya, kami menerapkan kriteria yang mirip dengan Yoast: panjang kalimat, distribusi paragraf, dan hierarki judul.',
21
+ },
22
+ ];
23
+
24
+ const howToData = [
25
+ { name: 'Tulis atau tempel teks Anda', text: 'Masukkan konten yang ingin Anda analisis di area teks utama.' },
26
+ { name: 'Tinjau daftar periksa pengoptimalan', text: 'Periksa peringatan panjang teks, keterbacaan, dan kepadatan kata kunci di panel samping.' },
27
+ { name: 'Analisis HTML teknis', text: 'Beralih ke tab analisis teknis untuk memverifikasi tag H1, alt gambar, dan struktur metadata.' },
28
+ ];
29
+
30
+ const faqSchema: WithContext<FAQPage> = {
31
+ '@context': 'https://schema.org',
32
+ '@type': 'FAQPage',
33
+ mainEntity: faqData.map((item) => ({
34
+ '@type': 'Question',
35
+ name: item.question,
36
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
37
+ })),
38
+ };
39
+
40
+ const howToSchema: WithContext<HowTo> = {
41
+ '@context': 'https://schema.org',
42
+ '@type': 'HowTo',
43
+ name: 'Cara mengoptimalkan konten untuk SEO',
44
+ step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
45
+ };
46
+
47
+ const appSchema: WithContext<SoftwareApplication> = {
48
+ '@context': 'https://schema.org',
49
+ '@type': 'SoftwareApplication',
50
+ name: 'Pengoptimal Konten SEO',
51
+ applicationCategory: 'UtilitiesApplication',
52
+ operatingSystem: 'Web',
53
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
54
+ description: 'Analisis kepadatan kata kunci, keterbacaan, dan struktur HTML teknis teks Anda secara real-time, tanpa mengirimkan data ke server mana pun.',
55
+ };
56
+
57
+ const ui: SeoContentOptimizerUI = {
58
+ tabText: 'Analisis Teks',
59
+ tabHtml: 'Analisis HTML Teknis',
60
+ textareaPlaceholder: 'Tulis teks Anda atau tempel kode HTML Anda di sini...',
61
+ statsChars: 'Karakter',
62
+ statsWords: 'Kata',
63
+ statsReading: 'Bacaan',
64
+ statsSentences: 'Kalimat',
65
+ checklistTitle: 'Daftar Periksa Pengoptimalan',
66
+ keywordsTitle: 'Kepadatan Kata Kunci',
67
+ technicalTitle: 'Analisis HTML Teknis',
68
+ h1Label: 'H1 Terdeteksi',
69
+ linksLabel: 'Tautan (a)',
70
+ imgsLabel: 'Gambar (img)',
71
+ altsLabel: 'Alt hilang',
72
+ emptyState: 'Tidak ada data',
73
+ analyzing: 'Menganalisis...',
74
+ checkInsufficient: 'Panjang tidak mencukupi (< 300 kata)',
75
+ checkPillar: 'Konten pilar sangat bagus (> 900 kata)',
76
+ checkGoodLength: 'Panjang yang baik untuk SEO',
77
+ checkLongSentences: 'Terlalu banyak kalimat panjang (> 25% teks)',
78
+ checkGoodReadability: 'Keterbacaan kalimat optimal',
79
+ checkLongParagraphs: 'Pisahkan paragraf yang sangat panjang (> 150 kata)',
80
+ checkMissingH1: 'Tag H1 hilang',
81
+ checkMultipleH1: 'Beberapa tag H1 terdeteksi',
82
+ checkMissingH2: 'Subjudul (H2) hilang',
83
+ checkMissingTitle: 'Tag meta title hilang',
84
+ stopWords: JSON.stringify(['di', 'ke', 'dari', 'pada', 'dalam', 'untuk', 'dengan', 'dan', 'atau', 'tapi', 'namun', 'oleh', 'karena', 'bahwa', 'yang', 'adalah', 'sebagai', 'itu', 'ini', 'kami', 'saya', 'anda', 'mereka', 'dia', 'nya', 'kita', 'sudah', 'telah', 'akan', 'bisa', 'dapat', 'oleh', 'juga', 'hanya', 'saja', 'jika', 'bila', 'seperti', 'terhadap', 'tentang']),
85
+ };
86
+
87
+ export const content: ToolLocaleContent<SeoContentOptimizerUI> = {
88
+ slug: 'pengoptimasi-konten-seo',
89
+ title: 'Pengoptimal Konten SEO',
90
+ description: 'Analisis kepadatan kata kunci, keterbacaan, dan struktur HTML teknis teks Anda secara real-time. Alat SEO gratis dan pribadi.',
91
+ ui,
92
+ faqTitle: 'Pertanyaan yang Sering Diajukan',
93
+ faq: faqData,
94
+ howTo: howToData,
95
+ bibliographyTitle: 'Referensi',
96
+ bibliography: [
97
+ { name: "Panduan Memulai SEO dari Google", url: 'https://developers.google.com/search/docs/fundamentals/seo-starter-guide?hl=id' },
98
+ { name: 'Kriteria keterbacaan Yoast SEO', url: 'https://yoast.com/what-is-readability/' },
99
+ ],
100
+ schemas: [faqSchema, howToSchema, appSchema],
101
+ seo: [
102
+ { type: 'title', level: 2, text: 'Pengoptimal Konten SEO: Kata Kunci, Keterbacaan, dan Struktur' },
103
+ {
104
+ type: 'paragraph',
105
+ html: 'Kualitas konten tidak lagi diukur hanya berdasarkan kata kunci yang Anda masukkan, melainkan bagaimana Anda menyusun informasi agar mudah dicerna baik oleh manusia maupun perayap Google. <strong>Alat analisis SEO real-time</strong> kami memberi Anda kontrol penuh atas kepadatan kata kunci, keterbacaan paragraf, dan elemen teknis HTML yang mendasar.',
106
+ },
107
+ { type: 'title', level: 3, text: 'Kepadatan Kata Kunci dan Relevansi Semantik' },
108
+ {
109
+ type: 'paragraph',
110
+ html: '<strong>Kepadatan kata kunci</strong> menunjukkan seberapa sering sebuah istilah muncul dibandingkan dengan bagian teks lainnya. Pengulangan yang berlebihan akan memicu filter <em>keyword stuffing</em>, sementara kepadatan yang sangat rendah mungkin menyulitkan mesin pencari untuk mengidentifikasi topik utama artikel Anda.',
111
+ },
112
+ {
113
+ type: 'list',
114
+ items: [
115
+ '<strong>Analisis relevansi:</strong> Identifikasi apakah kata-kata yang paling sering diulang sesuai dengan intensi pencarian Anda.',
116
+ '<strong>Pencegahan penalti:</strong> Hindari pengulangan istilah yang berlebihan yang mungkin terlihat seperti spam.',
117
+ '<strong>Optimalisasi semantik:</strong> Temukan keseimbangan antara istilah teknis dan bahasa alami.',
118
+ ],
119
+ },
120
+ { type: 'title', level: 3, text: 'Keterbacaan dalam Gaya Yoast' },
121
+ {
122
+ type: 'paragraph',
123
+ html: 'Keterbacaan adalah faktor peringkat tidak langsung namun krusial. Jika pengguna pergi karena paragraf yang berupa blok teks tanpa henti, <em>Dwell Time</em> Anda akan turun. Alat analisis ini mendeteksi kalimat panjang (lebih dari 20 kata), paragraf di atas 150 kata, dan memeriksa keberadaan subjudul.',
124
+ },
125
+ {
126
+ type: 'tip',
127
+ title: 'Waktu baca',
128
+ html: 'Kebanyakan pengguna memutuskan apakah akan membaca sebuah artikel dalam waktu kurang dari 10 detik. Mengetahui estimasi waktu baca (dihitung dengan rata-rata 200 kata per menit) membantu mengurangi rasio pantulan dengan mengatur ekspektasi pembaca.',
129
+ },
130
+ { type: 'title', level: 3, text: 'Analisis HTML Teknis' },
131
+ {
132
+ type: 'paragraph',
133
+ html: 'Tempelkan kode sumber Anda untuk memverifikasi elemen-elemen kunci: keunikan <strong>H1</strong>, keberadaan subjudul H2/H3, gambar tanpa atribut <code>alt</code>, dan keberadaan tag <code>title</code>. Semua pemrosesan terjadi di browser Anda tanpa mengirimkan data ke server mana pun.',
134
+ },
135
+ ],
136
+ };
@@ -0,0 +1,136 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
+ import type { SeoContentOptimizerUI } from '../ui';
4
+
5
+ const faqData = [
6
+ {
7
+ question: 'In che modo questo strumento aiuta il mio posizionamento SEO?',
8
+ answer: 'Analizzando la densità delle parole chiave e la leggibilità delle frasi, ti assicuri che il tuo contenuto sia facile da capire per gli utenti e pertinente per i motori di ricerca, evitando penalizzazioni per sovra-ottimizzazione.',
9
+ },
10
+ {
11
+ question: 'Quali elementi HTML controlla l\'analisi tecnica?',
12
+ answer: 'Verifica l\'esistenza e l\'unicità del tag H1, la presenza di sottotitoli H2/H3 e gli attributi alt sulle immagini.',
13
+ },
14
+ {
15
+ question: 'I miei contenuti vengono memorizzati su qualche server?',
16
+ answer: 'No. L\'analisi viene eseguita al 100% localmente nel tuo browser. I tuoi contenuti non lasciano mai il tuo computer.',
17
+ },
18
+ {
19
+ question: 'È compatibile con i criteri Yoast SEO?',
20
+ answer: 'Sì, implementiamo criteri simili a Yoast: lunghezza delle frasi, distribuzione dei paragrafi e gerarchia dei titoli.',
21
+ },
22
+ ];
23
+
24
+ const howToData = [
25
+ { name: 'Scrivi o incolla il tuo testo', text: 'Inserisci il contenuto che vuoi analizzare nell\'area di testo principale.' },
26
+ { name: 'Controlla la checklist di ottimizzazione', text: 'Verifica gli avvisi su lunghezza, leggibilità e densità delle parole chiave nel pannello laterale.' },
27
+ { name: 'Analizza l\'HTML tecnico', text: 'Passa alla scheda dell\'analisi tecnica per verificare i tag H1, gli alt delle immagini e la struttura dei metadati.' },
28
+ ];
29
+
30
+ const faqSchema: WithContext<FAQPage> = {
31
+ '@context': 'https://schema.org',
32
+ '@type': 'FAQPage',
33
+ mainEntity: faqData.map((item) => ({
34
+ '@type': 'Question',
35
+ name: item.question,
36
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
37
+ })),
38
+ };
39
+
40
+ const howToSchema: WithContext<HowTo> = {
41
+ '@context': 'https://schema.org',
42
+ '@type': 'HowTo',
43
+ name: 'Come ottimizzare i contenuti per la SEO',
44
+ step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
45
+ };
46
+
47
+ const appSchema: WithContext<SoftwareApplication> = {
48
+ '@context': 'https://schema.org',
49
+ '@type': 'SoftwareApplication',
50
+ name: 'Ottimizzatore di Contenuti SEO',
51
+ applicationCategory: 'UtilitiesApplication',
52
+ operatingSystem: 'Web',
53
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
54
+ description: 'Analizza la densità delle parole chiave, la leggibilità e la struttura HTML tecnica dei tuoi testi in tempo reale, senza inviare dati a nessun server.',
55
+ };
56
+
57
+ const ui: SeoContentOptimizerUI = {
58
+ tabText: 'Analisi del Testo',
59
+ tabHtml: 'Analisi HTML Tecnica',
60
+ textareaPlaceholder: 'Scrivi il tuo testo o incolla qui il tuo codice HTML...',
61
+ statsChars: 'Caratteri',
62
+ statsWords: 'Parole',
63
+ statsReading: 'Lettura',
64
+ statsSentences: 'Frasi',
65
+ checklistTitle: 'Checklist di Ottimizzazione',
66
+ keywordsTitle: 'Densità Parole Chiave',
67
+ technicalTitle: 'Analisi HTML Tecnica',
68
+ h1Label: 'H1 Rilevato',
69
+ linksLabel: 'Link (a)',
70
+ imgsLabel: 'Immagini (img)',
71
+ altsLabel: 'Alt mancanti',
72
+ emptyState: 'Nessun dato',
73
+ analyzing: 'Analisi in corso...',
74
+ checkInsufficient: 'Lunghezza insufficiente (< 300 parole)',
75
+ checkPillar: 'Eccellente contenuto pillar (> 900 parole)',
76
+ checkGoodLength: 'Buona lunghezza per la SEO',
77
+ checkLongSentences: 'Troppe frasi lunghe (> 25% del testo)',
78
+ checkGoodReadability: 'Leggibilità delle frasi ottimale',
79
+ checkLongParagraphs: 'Dividi i paragrafi molto lunghi (> 150 parole)',
80
+ checkMissingH1: 'Tag H1 mancante',
81
+ checkMultipleH1: 'Rilevati più tag H1',
82
+ checkMissingH2: 'Sottotitoli (H2) mancanti',
83
+ checkMissingTitle: 'Tag meta title mancante',
84
+ stopWords: JSON.stringify(['il', 'lo', 'la', 'i', 'gli', 'le', 'un', 'uno', 'una', 'e', 'o', 'ma', 'in', 'su', 'a', 'per', 'di', 'con', 'da', 'come', 'è', 'era', 'sono', 'erano', 'essere', 'stato', 'avere', 'ha', 'aveva', 'fare', 'fa', 'fece', 'esso', 'suo', 'questo', 'quello', 'questi', 'quelli', 'non', 'no', 'così', 'su', 'se', 'mio', 'tuo', 'suo', 'sua', 'nostro', 'vostro', 'loro']),
85
+ };
86
+
87
+ export const content: ToolLocaleContent<SeoContentOptimizerUI> = {
88
+ slug: 'ottimizzatore-contenuti-seo',
89
+ title: 'Ottimizzatore di Contenuti SEO',
90
+ description: 'Analizza la densità delle parole chiave, la leggibilità e la struttura HTML tecnica dei tuoi testi in tempo reale. Strumento SEO gratuito e privato.',
91
+ ui,
92
+ faqTitle: 'Domande Frequenti',
93
+ faq: faqData,
94
+ howTo: howToData,
95
+ bibliographyTitle: 'Riferimenti',
96
+ bibliography: [
97
+ { name: "Guida introduttiva di Google alla SEO", url: 'https://developers.google.com/search/docs/fundamentals/seo-starter-guide?hl=it' },
98
+ { name: 'Criteri di leggibilità Yoast SEO', url: 'https://yoast.com/what-is-readability/' },
99
+ ],
100
+ schemas: [faqSchema, howToSchema, appSchema],
101
+ seo: [
102
+ { type: 'title', level: 2, text: 'Ottimizzatore di Contenuti SEO: Parole Chiave, Leggibilità e Struttura' },
103
+ {
104
+ type: 'paragraph',
105
+ html: 'La qualità dei contenuti non si misura più solo in base alle parole chiave incluse, ma a come strutturi le informazioni per renderle digeribili sia per gli esseri umani che per i crawler di Google. Il nostro <strong>strumento di analisi SEO in tempo reale</strong> ti offre il pieno controllo sulla densità delle parole chiave, sulla leggibilità dei paragrafi e sui fondamentali elementi tecnici HTML.',
106
+ },
107
+ { type: 'title', level: 3, text: 'Densità delle Parole Chiave e Rilevanza Semantica' },
108
+ {
109
+ type: 'paragraph',
110
+ html: 'La <strong>densità delle parole chiave</strong> indica quanto spesso appare un termine rispetto al resto del testo. Una ripetizione eccessiva attiva i filtri di <em>keyword stuffing</em>, mentre una densità molto bassa può rendere difficile per i motori di ricerca identificare l\'argomento centrale del tuo articolo.',
111
+ },
112
+ {
113
+ type: 'list',
114
+ items: [
115
+ '<strong>Analisi della rilevanza:</strong> Identifica se le parole più ripetute corrispondono al tuo intento di ricerca.',
116
+ '<strong>Prevenzione delle penalità:</strong> Evita di ripetere eccessivamente termini che potrebbero apparire come spam.',
117
+ '<strong>Ottimizzazione semantica:</strong> Trova l\'equilibrio tra termini tecnici e linguaggio naturale.',
118
+ ],
119
+ },
120
+ { type: 'title', level: 3, text: 'Leggibilità in Stile Yoast' },
121
+ {
122
+ type: 'paragraph',
123
+ html: 'La leggibilità è un fattore di ranking indiretto ma cruciale. Se gli utenti se ne vanno perché i paragrafi sono blocchi infiniti di testo, il tuo <em>Dwell Time</em> diminuisce. L\'analizzatore rileva frasi lunghe (oltre 20 parole), paragrafi oltre le 150 parole e controlla la presenza di sottotitoli.',
124
+ },
125
+ {
126
+ type: 'tip',
127
+ title: 'Tempo di lettura',
128
+ html: 'La maggior parte degli utenti decide se leggere un articolo in meno di 10 secondi. Conoscere il tempo di lettura stimato (calcolato su una media di 200 parole al minuto) aiuta a ridurre il bounce rate impostando le aspettative del lettore.',
129
+ },
130
+ { type: 'title', level: 3, text: 'Analisi HTML Tecnica' },
131
+ {
132
+ type: 'paragraph',
133
+ html: 'Incolla il tuo codice sorgente per verificare gli elementi chiave: unicità dell\'<strong>H1</strong>, presenza di sottotitoli H2/H3, immagini senza attributi <code>alt</code> ed esistenza del tag <code>title</code>. Tutta l\'elaborazione avviene nel tuo browser senza inviare dati a nessun server.',
134
+ },
135
+ ],
136
+ };