@jjlmoya/utils-tools 1.1.0 → 1.3.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 (185) 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_uniqueness.test.ts +81 -0
  18. package/src/tests/title_quality.test.ts +0 -1
  19. package/src/tool/date-diff-calculator/i18n/de.ts +132 -0
  20. package/src/tool/date-diff-calculator/i18n/fr.ts +1 -1
  21. package/src/tool/date-diff-calculator/i18n/id.ts +132 -0
  22. package/src/tool/date-diff-calculator/i18n/it.ts +132 -0
  23. package/src/tool/date-diff-calculator/i18n/ja.ts +132 -0
  24. package/src/tool/date-diff-calculator/i18n/ko.ts +132 -0
  25. package/src/tool/date-diff-calculator/i18n/nl.ts +132 -0
  26. package/src/tool/date-diff-calculator/i18n/pl.ts +132 -0
  27. package/src/tool/date-diff-calculator/i18n/pt.ts +132 -0
  28. package/src/tool/date-diff-calculator/i18n/ru.ts +132 -0
  29. package/src/tool/date-diff-calculator/i18n/sv.ts +132 -0
  30. package/src/tool/date-diff-calculator/i18n/tr.ts +132 -0
  31. package/src/tool/date-diff-calculator/i18n/zh.ts +132 -0
  32. package/src/tool/date-diff-calculator/index.ts +12 -0
  33. package/src/tool/drive-direct-link/i18n/de.ts +118 -0
  34. package/src/tool/drive-direct-link/i18n/id.ts +118 -0
  35. package/src/tool/drive-direct-link/i18n/it.ts +118 -0
  36. package/src/tool/drive-direct-link/i18n/ja.ts +118 -0
  37. package/src/tool/drive-direct-link/i18n/ko.ts +118 -0
  38. package/src/tool/drive-direct-link/i18n/nl.ts +118 -0
  39. package/src/tool/drive-direct-link/i18n/pl.ts +118 -0
  40. package/src/tool/drive-direct-link/i18n/pt.ts +118 -0
  41. package/src/tool/drive-direct-link/i18n/ru.ts +118 -0
  42. package/src/tool/drive-direct-link/i18n/sv.ts +118 -0
  43. package/src/tool/drive-direct-link/i18n/tr.ts +118 -0
  44. package/src/tool/drive-direct-link/i18n/zh.ts +118 -0
  45. package/src/tool/drive-direct-link/index.ts +12 -0
  46. package/src/tool/email-list-cleaner/i18n/de.ts +140 -0
  47. package/src/tool/email-list-cleaner/i18n/es.ts +1 -1
  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/es.ts +1 -1
  78. package/src/tool/morse-beacon/i18n/id.ts +157 -0
  79. package/src/tool/morse-beacon/i18n/it.ts +157 -0
  80. package/src/tool/morse-beacon/i18n/ja.ts +157 -0
  81. package/src/tool/morse-beacon/i18n/ko.ts +157 -0
  82. package/src/tool/morse-beacon/i18n/nl.ts +157 -0
  83. package/src/tool/morse-beacon/i18n/pl.ts +157 -0
  84. package/src/tool/morse-beacon/i18n/pt.ts +157 -0
  85. package/src/tool/morse-beacon/i18n/ru.ts +157 -0
  86. package/src/tool/morse-beacon/i18n/sv.ts +157 -0
  87. package/src/tool/morse-beacon/i18n/tr.ts +157 -0
  88. package/src/tool/morse-beacon/i18n/zh.ts +157 -0
  89. package/src/tool/morse-beacon/index.ts +13 -1
  90. package/src/tool/password-generator/i18n/de.ts +166 -0
  91. package/src/tool/password-generator/i18n/fr.ts +1 -1
  92. package/src/tool/password-generator/i18n/id.ts +166 -0
  93. package/src/tool/password-generator/i18n/it.ts +166 -0
  94. package/src/tool/password-generator/i18n/ja.ts +166 -0
  95. package/src/tool/password-generator/i18n/ko.ts +166 -0
  96. package/src/tool/password-generator/i18n/nl.ts +166 -0
  97. package/src/tool/password-generator/i18n/pl.ts +166 -0
  98. package/src/tool/password-generator/i18n/pt.ts +166 -0
  99. package/src/tool/password-generator/i18n/ru.ts +166 -0
  100. package/src/tool/password-generator/i18n/sv.ts +166 -0
  101. package/src/tool/password-generator/i18n/tr.ts +166 -0
  102. package/src/tool/password-generator/i18n/zh.ts +166 -0
  103. package/src/tool/password-generator/index.ts +13 -1
  104. package/src/tool/routes/i18n/de.ts +157 -0
  105. package/src/tool/routes/i18n/es.ts +1 -1
  106. package/src/tool/routes/i18n/id.ts +157 -0
  107. package/src/tool/routes/i18n/it.ts +157 -0
  108. package/src/tool/routes/i18n/ja.ts +157 -0
  109. package/src/tool/routes/i18n/ko.ts +157 -0
  110. package/src/tool/routes/i18n/nl.ts +157 -0
  111. package/src/tool/routes/i18n/pl.ts +157 -0
  112. package/src/tool/routes/i18n/pt.ts +157 -0
  113. package/src/tool/routes/i18n/ru.ts +157 -0
  114. package/src/tool/routes/i18n/sv.ts +157 -0
  115. package/src/tool/routes/i18n/tr.ts +157 -0
  116. package/src/tool/routes/i18n/zh.ts +157 -0
  117. package/src/tool/routes/index.ts +13 -1
  118. package/src/tool/rule-of-three/i18n/de.ts +171 -0
  119. package/src/tool/rule-of-three/i18n/en.ts +1 -1
  120. package/src/tool/rule-of-three/i18n/id.ts +171 -0
  121. package/src/tool/rule-of-three/i18n/it.ts +171 -0
  122. package/src/tool/rule-of-three/i18n/ja.ts +171 -0
  123. package/src/tool/rule-of-three/i18n/ko.ts +171 -0
  124. package/src/tool/rule-of-three/i18n/nl.ts +171 -0
  125. package/src/tool/rule-of-three/i18n/pl.ts +171 -0
  126. package/src/tool/rule-of-three/i18n/pt.ts +171 -0
  127. package/src/tool/rule-of-three/i18n/ru.ts +171 -0
  128. package/src/tool/rule-of-three/i18n/sv.ts +171 -0
  129. package/src/tool/rule-of-three/i18n/tr.ts +171 -0
  130. package/src/tool/rule-of-three/i18n/zh.ts +171 -0
  131. package/src/tool/rule-of-three/index.ts +13 -1
  132. package/src/tool/seo-content-optimizer/i18n/de.ts +136 -0
  133. package/src/tool/seo-content-optimizer/i18n/id.ts +136 -0
  134. package/src/tool/seo-content-optimizer/i18n/it.ts +136 -0
  135. package/src/tool/seo-content-optimizer/i18n/ja.ts +136 -0
  136. package/src/tool/seo-content-optimizer/i18n/ko.ts +136 -0
  137. package/src/tool/seo-content-optimizer/i18n/nl.ts +136 -0
  138. package/src/tool/seo-content-optimizer/i18n/pl.ts +136 -0
  139. package/src/tool/seo-content-optimizer/i18n/pt.ts +136 -0
  140. package/src/tool/seo-content-optimizer/i18n/ru.ts +136 -0
  141. package/src/tool/seo-content-optimizer/i18n/sv.ts +136 -0
  142. package/src/tool/seo-content-optimizer/i18n/tr.ts +136 -0
  143. package/src/tool/seo-content-optimizer/i18n/zh.ts +136 -0
  144. package/src/tool/seo-content-optimizer/index.ts +12 -0
  145. package/src/tool/speed-reader/i18n/de.ts +152 -0
  146. package/src/tool/speed-reader/i18n/es.ts +1 -1
  147. package/src/tool/speed-reader/i18n/id.ts +152 -0
  148. package/src/tool/speed-reader/i18n/it.ts +152 -0
  149. package/src/tool/speed-reader/i18n/ja.ts +152 -0
  150. package/src/tool/speed-reader/i18n/ko.ts +152 -0
  151. package/src/tool/speed-reader/i18n/nl.ts +152 -0
  152. package/src/tool/speed-reader/i18n/pl.ts +152 -0
  153. package/src/tool/speed-reader/i18n/pt.ts +152 -0
  154. package/src/tool/speed-reader/i18n/ru.ts +152 -0
  155. package/src/tool/speed-reader/i18n/sv.ts +152 -0
  156. package/src/tool/speed-reader/i18n/tr.ts +152 -0
  157. package/src/tool/speed-reader/i18n/zh.ts +152 -0
  158. package/src/tool/speed-reader/index.ts +12 -0
  159. package/src/tool/text-pixel-calculator/i18n/de.ts +133 -0
  160. package/src/tool/text-pixel-calculator/i18n/id.ts +133 -0
  161. package/src/tool/text-pixel-calculator/i18n/it.ts +133 -0
  162. package/src/tool/text-pixel-calculator/i18n/ja.ts +133 -0
  163. package/src/tool/text-pixel-calculator/i18n/ko.ts +133 -0
  164. package/src/tool/text-pixel-calculator/i18n/nl.ts +133 -0
  165. package/src/tool/text-pixel-calculator/i18n/pl.ts +133 -0
  166. package/src/tool/text-pixel-calculator/i18n/pt.ts +133 -0
  167. package/src/tool/text-pixel-calculator/i18n/ru.ts +133 -0
  168. package/src/tool/text-pixel-calculator/i18n/sv.ts +133 -0
  169. package/src/tool/text-pixel-calculator/i18n/tr.ts +133 -0
  170. package/src/tool/text-pixel-calculator/i18n/zh.ts +133 -0
  171. package/src/tool/text-pixel-calculator/index.ts +12 -0
  172. package/src/tool/whatsapp-link/i18n/de.ts +128 -0
  173. package/src/tool/whatsapp-link/i18n/es.ts +1 -1
  174. package/src/tool/whatsapp-link/i18n/id.ts +128 -0
  175. package/src/tool/whatsapp-link/i18n/it.ts +128 -0
  176. package/src/tool/whatsapp-link/i18n/ja.ts +128 -0
  177. package/src/tool/whatsapp-link/i18n/ko.ts +128 -0
  178. package/src/tool/whatsapp-link/i18n/nl.ts +128 -0
  179. package/src/tool/whatsapp-link/i18n/pl.ts +128 -0
  180. package/src/tool/whatsapp-link/i18n/pt.ts +128 -0
  181. package/src/tool/whatsapp-link/i18n/ru.ts +128 -0
  182. package/src/tool/whatsapp-link/i18n/sv.ts +128 -0
  183. package/src/tool/whatsapp-link/i18n/tr.ts +128 -0
  184. package/src/tool/whatsapp-link/i18n/zh.ts +128 -0
  185. package/src/tool/whatsapp-link/index.ts +12 -0
@@ -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
+ };
@@ -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: 'このツールはどのようにSEOランキングに役立ちますか?',
8
+ answer: 'キーワード密度と文章の読みやすさを分析することで、コンテンツがユーザーにとって理解しやすく、検索エンジンにとって関連性が高いことを確認でき、過剰な最適化によるペナルティを回避できます。',
9
+ },
10
+ {
11
+ question: 'テクニカル分析ではどのHTML要素をチェックしますか?',
12
+ answer: 'H1タグの存在と一意性、H2/H3見出しの有無、画像のalt属性の有無を確認します。',
13
+ },
14
+ {
15
+ question: 'コンテンツはサーバーに保存されますか?',
16
+ answer: 'いいえ。分析は100%ブラウザ内でローカルに実行されます。コンテンツがコンピュータの外に送信されることはありません。',
17
+ },
18
+ {
19
+ question: 'Yoast SEOの基準と互換性はありますか?',
20
+ answer: 'はい、文章の長さ、段落の配分、見出しの階層など、Yoastと同様の基準を導入しています。',
21
+ },
22
+ ];
23
+
24
+ const howToData = [
25
+ { name: 'テキストを入力または貼り付け', text: '分析したいコンテンツをメインのテキストエリアに入力します。' },
26
+ { name: '最適化チェックリストを確認', text: 'サイドパネルで、長さ、読みやすさ、キーワード密度の警告を確認します。' },
27
+ { name: 'テクニカルHTMLを分析', text: 'テクニカル分析タブに切り替えて、H1タグ、画像のalt、メタデータの構造を確認します。' },
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: '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コンテンツ最適化ツール',
51
+ applicationCategory: 'UtilitiesApplication',
52
+ operatingSystem: 'Web',
53
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
54
+ description: 'テキストのキーワード密度、読みやすさ、テクニカルHTML構造をリアルタイムで分析します。データはサーバーに送信されません。',
55
+ };
56
+
57
+ const ui: SeoContentOptimizerUI = {
58
+ tabText: 'テキスト分析',
59
+ tabHtml: 'テクニカルHTML分析',
60
+ textareaPlaceholder: 'テキストを入力するか、HTMLコードをここに貼り付けてください...',
61
+ statsChars: '文字数',
62
+ statsWords: '単語数',
63
+ statsReading: '読了時間',
64
+ statsSentences: '文章数',
65
+ checklistTitle: '最適化チェックリスト',
66
+ keywordsTitle: 'キーワード密度',
67
+ technicalTitle: 'テクニカルHTML分析',
68
+ h1Label: 'H1検出',
69
+ linksLabel: 'リンク (a)',
70
+ imgsLabel: '画像 (img)',
71
+ altsLabel: 'alt欠損',
72
+ emptyState: 'データなし',
73
+ analyzing: '分析中...',
74
+ checkInsufficient: '長さが不足しています(300単語未満)',
75
+ checkPillar: '優れたピラーコンテンツです(900単語超)',
76
+ checkGoodLength: 'SEOに適した長さです',
77
+ checkLongSentences: '長い文章が多すぎます(全体の25%超)',
78
+ checkGoodReadability: '文章の読みやすさは最適です',
79
+ checkLongParagraphs: '非常に長い段落(150単語超)を分割してください',
80
+ checkMissingH1: 'H1タグがありません',
81
+ checkMultipleH1: '複数のH1タグが検出されました',
82
+ checkMissingH2: '小見出し(H2)がありません',
83
+ checkMissingTitle: 'メタtitleタグがありません',
84
+ stopWords: JSON.stringify(['の', 'に', 'は', 'を', 'た', 'が', 'で', 'て', 'と', 'し', 'れ', 'さ', 'ある', 'いる', 'も', 'する', 'から', 'な', 'こと', 'として', 'い', 'や', 'れる', 'など', 'なっ', 'な', 'もの', 'だ', 'よう', 'なり', 'れる', 'ので', 'ため', 'において', 'この', 'その', 'あの', 'どの']),
85
+ };
86
+
87
+ export const content: ToolLocaleContent<SeoContentOptimizerUI> = {
88
+ slug: 'seo-content-optimizer',
89
+ title: 'SEOコンテンツ最適化ツール',
90
+ description: 'テキストのキーワード密度、読みやすさ、テクニカルHTML構造をリアルタイムで分析します。サーバーにデータを送信しない、無料でプライバシーに配慮したSEOツールです。',
91
+ ui,
92
+ faqTitle: 'よくある質問',
93
+ faq: faqData,
94
+ howTo: howToData,
95
+ bibliographyTitle: '参考文献',
96
+ bibliography: [
97
+ { name: 'Google SEOスターターガイド', url: 'https://developers.google.com/search/docs/fundamentals/seo-starter-guide?hl=ja' },
98
+ { name: 'Yoast SEOの読みやすさ基準', url: 'https://yoast.com/what-is-readability/' },
99
+ ],
100
+ schemas: [faqSchema, howToSchema, appSchema],
101
+ seo: [
102
+ { type: 'title', level: 2, text: 'SEOコンテンツ最適化:キーワード、読みやすさ、階層構造' },
103
+ {
104
+ type: 'paragraph',
105
+ html: 'コンテンツのプロンプト質は、もはやキーワードが含まれているかどうかだけでなく、人間とGoogleのクローラーの両方にとって理解しやすいように情報が構造化されているかによって測定されます。当社の<strong>リアルタイムSEO分析ツール</strong>を使用すると、キーワード密度、段落の読みやすさ、および基本的なHTMLの技術的要素を完全にコントロールできます。',
106
+ },
107
+ { type: 'title', level: 3, text: 'キーワード密度と意味的な関連性' },
108
+ {
109
+ type: 'paragraph',
110
+ html: '<strong>キーワード密度</strong>は、テキスト全体と比較して特定の用語がどれくらいの頻度で表示されるかを示します。過度な繰り返しは<em>キーワードスタッフィング</em>(キーワードの詰め込み)フィルターを作動させますが、密度が極端に低いと、検索エンジンが記事の中心的なトピックを特定するのが難しくなる可能性があります。',
111
+ },
112
+ {
113
+ type: 'list',
114
+ items: [
115
+ '<strong>関連性分析:</strong> 最も繰り返されている単語が検索意図と一致しているかどうかを確認します。',
116
+ '<strong>ペナルティ回避:</strong> スパムのように見える、用語の過剰な繰り返しを避けます。',
117
+ '<strong>セマンティック最適化:</strong> 専門用語と自然な言語のバランスを見つけます。',
118
+ ],
119
+ },
120
+ { type: 'title', level: 3, text: '読みやすさの分析' },
121
+ {
122
+ type: 'paragraph',
123
+ html: '読みやすさは、間接的ですが重要なランキング要因です。段落がいつまでも続くテキストブロックであるためにユーザーが離脱すると、<em>滞在時間</em>が短くなります。アナライザーは、長い文章(英単語換算で20語相当以上)や非常に長い段落を検出し、小見出しの有無をチェックします。',
124
+ },
125
+ {
126
+ type: 'tip',
127
+ title: '読了時間',
128
+ html: 'ほとんどのユーザーは、記事を読むかどうかを10秒以内に判断します。推定読了時間(平均読書速度から算出)を知ることで、読者の期待値を設定し、直帰率を減らすことができます。',
129
+ },
130
+ { type: 'title', level: 3, text: 'テクニカルHTML分析' },
131
+ {
132
+ type: 'paragraph',
133
+ html: 'ソースコードを貼り付けて、主要な要素を確認します: <strong>H1</strong>タグの一意性、H2/H3見出しの有無、<code>alt</code>属性のない画像、および<code>title</code>タグの有無。すべての処理はブラウザ内で行われ、サーバーにデータが送信されることはありません。',
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: '이 도구가 내 SEO 순위에 어떻게 도움이 되나요?',
8
+ answer: '키워드 밀도와 문장 가독성을 분석함으로써 콘텐츠가 사용자가 이해하기 쉽고 검색 엔진에 관련성이 있는지 확인하여 과도한 최적화에 따른 페널티를 피할 수 있습니다.',
9
+ },
10
+ {
11
+ question: '기술 분석에서는 어떤 HTML 요소를 확인하나요?',
12
+ answer: 'H1 태그의 존재 유무와 고유성, H2/H3 부제목의 존재, 이미지의 alt 속성 유무를 확인합니다.',
13
+ },
14
+ {
15
+ question: '내 콘텐츠가 서버에 저장되나요?',
16
+ answer: '아니요. 분석은 사용자의 브라우저 내에서 100% 로컬로 실행됩니다. 사용자의 콘텐츠는 사용자의 컴퓨터를 떠나지 않습니다.',
17
+ },
18
+ {
19
+ question: 'Yoast SEO 기준과 호환되나요?',
20
+ answer: '네, 문장 길이, 단락 분포 및 제목 계층 구조와 같이 Yoast와 유사한 기준을 구현합니다.',
21
+ },
22
+ ];
23
+
24
+ const howToData = [
25
+ { name: '텍스트 작성 또는 붙여넣기', text: '분석하려는 콘텐츠를 메인 텍스트 영역에 입력하세요.' },
26
+ { name: '최적화 체크리스트 검토', text: '사이드 패널에서 길이, 가독성 및 키워드 밀도 알림을 확인하세요.' },
27
+ { name: '기술 HTML 분석', text: '기술 분석 탭으로 전환하여 H1 태그, 이미지 alt 및 메타데이터 구조를 확인하세요.' },
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: '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 콘텐츠 최적화 도구',
51
+ applicationCategory: 'UtilitiesApplication',
52
+ operatingSystem: 'Web',
53
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
54
+ description: '서버에 데이터를 전송하지 않고 텍스트의 키워드 밀도, 가독성 및 기술 HTML 구조를 실시간으로 분석하세요.',
55
+ };
56
+
57
+ const ui: SeoContentOptimizerUI = {
58
+ tabText: '텍스트 분석',
59
+ tabHtml: '기술 HTML 분석',
60
+ textareaPlaceholder: '텍스트를 작성하거나 HTML 코드를 여기에 붙여넣으세요...',
61
+ statsChars: '글자 수',
62
+ statsWords: '단어 수',
63
+ statsReading: '읽기',
64
+ statsSentences: '문장 수',
65
+ checklistTitle: '최적화 체크리스트',
66
+ keywordsTitle: '키워드 밀도',
67
+ technicalTitle: '기술 HTML 분석',
68
+ h1Label: 'H1 발견',
69
+ linksLabel: '링크 (a)',
70
+ imgsLabel: '이미지 (img)',
71
+ altsLabel: 'alt 누락',
72
+ emptyState: '데이터 없음',
73
+ analyzing: '분석 중...',
74
+ checkInsufficient: '길이 부족 (300단어 미만)',
75
+ checkPillar: '훌륭한 필러 콘텐츠 (900단어 초과)',
76
+ checkGoodLength: 'SEO에 적합한 길이',
77
+ checkLongSentences: '긴 문장이 너무 많음 (텍스트의 25% 초과)',
78
+ checkGoodReadability: '최적의 문장 가독성',
79
+ checkLongParagraphs: '매우 긴 단락 분할 필요 (150단어 초과)',
80
+ checkMissingH1: 'H1 태그 누락',
81
+ checkMultipleH1: '여러 개의 H1 태그 발견',
82
+ checkMissingH2: '부제목 (H2) 누락',
83
+ checkMissingTitle: '메타 title 태그 누락',
84
+ stopWords: JSON.stringify(['그', '이', '저', '것', '수', '등', '들', '및', '위', '대한', '통해', '위해', '관한', '대해', '하는', '이다', '입니다', '한다', '하고', '되어', '에서', '으로', '부터', '까지', '또한', '하지만', '그리고', '따라서', '때문에', '하는', '한', '할', '있습니다', '없습니다', '있는', '없는', '대한', '에서', '으로', '에게', '와', '과', '의', '를', '을', '은', '는', '이', '가']),
85
+ };
86
+
87
+ export const content: ToolLocaleContent<SeoContentOptimizerUI> = {
88
+ slug: 'seo-content-optimizer',
89
+ title: 'SEO 콘텐츠 최적화 도구',
90
+ description: '텍스트의 키워드 밀도, 가독성 및 기술 HTML 구조를 실시간으로 분석하세요. 무료로 제공되는 개인정보 보호 SEO 도구입니다.',
91
+ ui,
92
+ faqTitle: '자주 묻는 질문',
93
+ faq: faqData,
94
+ howTo: howToData,
95
+ bibliographyTitle: '참고 문헌',
96
+ bibliography: [
97
+ { name: 'Google 검색 엔진 최적화(SEO) 기본 가이드', url: 'https://developers.google.com/search/docs/fundamentals/seo-starter-guide?hl=ko' },
98
+ { name: 'Yoast SEO 가독성 기준', url: 'https://yoast.com/what-is-readability/' },
99
+ ],
100
+ schemas: [faqSchema, howToSchema, appSchema],
101
+ seo: [
102
+ { type: 'title', level: 2, text: 'SEO 콘텐츠 최적화: 키워드, 가독성 및 구조' },
103
+ {
104
+ type: 'paragraph',
105
+ html: '콘텐츠 품질은 더 이상 포함된 키워드만으로 측정되지 않으며, 사람과 Google 크롤러 모두가 이해하기 쉽게 정보를 어떻게 구성하느냐에 따라 측정됩니다. 당사의 <strong>실시간 SEO 분석 도구</strong>는 키워드 밀도, 단락 가독성 및 기본적인 HTML 기술 요소에 대한 완전한 제어권을 제공합니다.',
106
+ },
107
+ { type: 'title', level: 3, text: '키워드 밀도 및 의미적 관련성' },
108
+ {
109
+ type: 'paragraph',
110
+ html: '<strong>키워드 밀도</strong>는 텍스트 전체와 비교하여 특정 용어가 얼마나 자주 나타나는지를 나타냅니다. 과도한 반복은 <em>키워드 스터핑(keyword stuffing)</em> 필터를 작동시키는 반면, 너무 낮은 밀도는 검색 엔진이 기사의 핵심 주제를 파악하기 어렵게 만들 수 있습니다.',
111
+ },
112
+ {
113
+ type: 'list',
114
+ items: [
115
+ '<strong>관련성 분석:</strong> 가장 많이 반복되는 단어가 검색 의도와 일치하는지 확인하십시오.',
116
+ '<strong>페널티 예방:</strong> 스팸처럼 보일 수 있는 용어의 과도한 반복을 피하십시오.',
117
+ '<strong>시맨틱 최적화:</strong> 전문 용어와 자연어 사이의 균형을 찾으십시오.',
118
+ ],
119
+ },
120
+ { type: 'title', level: 3, text: 'Yoast 스타일 가독성' },
121
+ {
122
+ type: 'paragraph',
123
+ html: '가독성은 간접적이지만 중요한 순위 요소입니다. 단락이 끝없는 텍스트 블록이라서 사용자가 떠나버리면 <em>체류 시간(Dwell Time)</em>이 감소합니다. 분석기는 긴 문장(단어 수 기준), 긴 단락을 감지하고 부제목이 있는지 확인합니다.',
124
+ },
125
+ {
126
+ type: 'tip',
127
+ title: '읽기 시간',
128
+ html: '대부분의 사용자는 10초 이내에 기사를 읽을지 여부를 결정합니다. 예상 읽기 시간(분당 평균 200단어로 계산)을 알면 독자의 기대치를 설정하여 이탈률을 줄이는 데 도움이 됩니다.',
129
+ },
130
+ { type: 'title', level: 3, text: '기술 HTML 분석' },
131
+ {
132
+ type: 'paragraph',
133
+ html: '소스 코드를 붙여넣어 주요 요소를 확인하십시오. <strong>H1</strong>의 고유성, H2/H3 부제목의 존재, <code>alt</code> 속성이 없는 이미지, <code>title</code> 태그의 유무를 확인하세요. 모든 처리는 서버로 데이터를 전송하지 않고 브라우저 내에서 이루어집니다.',
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: 'Hoe helpt deze tool mijn SEO-ranking?',
8
+ answer: 'Door de zoekwoorddichtheid en de leesbaarheid van zinnen te analyseren, zorgt u ervoor dat uw inhoud gemakkelijk te begrijpen is voor gebruikers en relevant is voor zoekmachines, terwijl u boetes voor over-optimalisatie vermijdt.',
9
+ },
10
+ {
11
+ question: 'Welke HTML-elementen controleert de technische analyse?',
12
+ answer: 'Het verifieert het bestaan en de uniciteit van de H1-tag, de aanwezigheid van H2/H3-subkoppen en alt-attributen bij afbeeldingen.',
13
+ },
14
+ {
15
+ question: 'Wordt mijn inhoud op een server opgeslagen?',
16
+ answer: 'Nee. De analyse draait 100% lokaal in uw browser. Uw inhoud verlaat nooit uw computer.',
17
+ },
18
+ {
19
+ question: 'Is het compatibel met de Yoast SEO-criteria?',
20
+ answer: 'Ja, we implementeren vergelijkbare criteria als Yoast: zinlengte, alinea-verdeling en koptekst-hiërarchie.',
21
+ },
22
+ ];
23
+
24
+ const howToData = [
25
+ { name: 'Schrijf of plak uw tekst', text: 'Voer de inhoud die u wilt analyseren in het hoofdtekstveld in.' },
26
+ { name: 'Bekijk de optimalisatie-checklist', text: 'Controleer de waarschuwingen voor lengte, leesbaarheid en zoekwoorddichtheid in het zijpaneel.' },
27
+ { name: 'Analyseer technische HTML', text: 'Schakel over naar het tabblad voor technische analyse om H1-tags, alt-teksten van afbeeldingen en metagegevensstructuur te verifiëren.' },
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: 'Hoe inhoud te optimaliseren voor 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: 'Analyseer de zoekwoorddichtheid, leesbaarheid en technische HTML-structuur van uw teksten in realtime, zonder gegevens naar een server te verzenden.',
55
+ };
56
+
57
+ const ui: SeoContentOptimizerUI = {
58
+ tabText: 'Tekstanalyse',
59
+ tabHtml: 'Technische HTML-analyse',
60
+ textareaPlaceholder: 'Schrijf uw tekst of plak hier uw HTML-code...',
61
+ statsChars: 'Tekens',
62
+ statsWords: 'Woorden',
63
+ statsReading: 'Leestijd',
64
+ statsSentences: 'Zinnen',
65
+ checklistTitle: 'Optimalisatie-checklist',
66
+ keywordsTitle: 'Zoekwoorddichtheid',
67
+ technicalTitle: 'Technische HTML-analyse',
68
+ h1Label: 'H1 gedetecteerd',
69
+ linksLabel: 'Links (a)',
70
+ imgsLabel: 'Afbeeldingen (img)',
71
+ altsLabel: 'Ontbrekende alts',
72
+ emptyState: 'Geen gegevens',
73
+ analyzing: 'Analyseren...',
74
+ checkInsufficient: 'Onvoldoende lengte (< 300 woorden)',
75
+ checkPillar: 'Uitstekende pillar-content (> 900 woorden)',
76
+ checkGoodLength: 'Goede lengte voor SEO',
77
+ checkLongSentences: 'Te veel lange zinnen (> 25% van de tekst)',
78
+ checkGoodReadability: 'Optimale leesbaarheid van zinnen',
79
+ checkLongParagraphs: 'Splits zeer lange alinea\'s (> 150 woorden)',
80
+ checkMissingH1: 'H1-tag ontbreekt',
81
+ checkMultipleH1: 'Meerdere H1-tags gedetecteerd',
82
+ checkMissingH2: 'Subkoppen (H2) ontbreken',
83
+ checkMissingTitle: 'Meta title-tag ontbreekt',
84
+ stopWords: JSON.stringify(['de', 'het', 'een', 'en', 'of', 'maar', 'in', 'op', 'bij', 'te', 'voor', 'van', 'met', 'door', 'uit', 'als', 'is', 'was', 'zijn', 'waren', 'worden', 'geweest', 'hebben', 'heeft', 'had', 'doen', 'doet', 'deed', 'het', 'zijn', 'dit', 'dat', 'deze', 'die', 'niet', 'geen', 'zo', 'op', 'als', 'mijn', 'jouw', 'zijn', 'haar', 'onze', 'jullie', 'hun']),
85
+ };
86
+
87
+ export const content: ToolLocaleContent<SeoContentOptimizerUI> = {
88
+ slug: 'seo-content-optimizer-nl',
89
+ title: 'SEO Content Optimizer',
90
+ description: 'Analyseer de zoekwoorddichtheid, leesbaarheid en technische HTML-structuur van uw teksten in realtime. Gratis en privé SEO-tool.',
91
+ ui,
92
+ faqTitle: 'Veelgestelde Vragen',
93
+ faq: faqData,
94
+ howTo: howToData,
95
+ bibliographyTitle: 'Referenties',
96
+ bibliography: [
97
+ { name: "Google's SEO-starthandleiding", url: 'https://developers.google.com/search/docs/fundamentals/seo-starter-guide?hl=nl' },
98
+ { name: 'Yoast SEO leesbaarheidscriteria', url: 'https://yoast.com/what-is-readability/' },
99
+ ],
100
+ schemas: [faqSchema, howToSchema, appSchema],
101
+ seo: [
102
+ { type: 'title', level: 2, text: 'SEO Content Optimizer: Zoekwoorden, Leesbaarheid en Structuur' },
103
+ {
104
+ type: 'paragraph',
105
+ html: 'De kwaliteit van de inhoud wordt niet langer uitsluitend gemeten aan de hand van de zoekwoorden die u opneemt, maar aan de hand van de manier waarop u uw informatie structureert, zodat deze begrijpelijk is voor zowel mensen als Google-crawlers. Onze <strong>realtime SEO-analysetool</strong> geeft u volledige controle over zoekwoorddichtheid, leesbaarheid van alinea\'s en fundamentele technische HTML-elementen.',
106
+ },
107
+ { type: 'title', level: 3, text: 'Zoekwoorddichtheid en semantische relevantie' },
108
+ {
109
+ type: 'paragraph',
110
+ html: 'De <strong>zoekwoorddichtheid</strong> geeft aan hoe vaak een term voorkomt in vergelijking met de rest van de tekst. Overmatige herhaling activeert <em>keyword stuffing</em>-filters, terwijl een zeer lage dichtheid het voor zoekmachines moeilijk kan maken om het centrale onderwerp van uw artikel te identificeren.',
111
+ },
112
+ {
113
+ type: 'list',
114
+ items: [
115
+ '<strong>Relevantie-analyse:</strong> Identificeer of de meest herhaalde woorden overeenkomen met uw zoekintentie.',
116
+ '<strong>Voorkomen van boetes:</strong> Vermijd het overmatig herhalen van termen die als spam kunnen overkomen.',
117
+ '<strong>Semantische optimalisatie:</strong> Vind de balans tussen technische termen en natuurlijke taal.',
118
+ ],
119
+ },
120
+ { type: 'title', level: 3, text: 'Leesbaarheid in de Yoast-stijl' },
121
+ {
122
+ type: 'paragraph',
123
+ html: 'Leesbaarheid is een indirecte maar cruciale rankingfactor. Als gebruikers vertrekken omdat alinea\'s eindeloze tekstblokken zijn, daalt uw <em>Dwell Time</em>. De analyzer detecteert lange zinnen (meer dan 20 woorden), alinea\'s van meer dan 150 woorden en controleert op subkoppen.',
124
+ },
125
+ {
126
+ type: 'tip',
127
+ title: 'Leestijd',
128
+ html: 'De meeste gebruikers beslissen binnen 10 seconden of ze een artikel gaan lezen. Het kennen van de geschatte leestijd (berekend op een gemiddelde van 200 woorden per minuut) helpt het bouncepercentage te verlagen door de verwachtingen van de lezer te managen.',
129
+ },
130
+ { type: 'title', level: 3, text: 'Technische HTML-analyse' },
131
+ {
132
+ type: 'paragraph',
133
+ html: 'Plak uw broncode om belangrijke elementen te verifiëren: uniciteit van de <strong>H1</strong>, aanwezigheid van H2/H3-subkoppen, afbeeldingen zonder <code>alt</code>-attributen en het bestaan van de <code>title</code>-tag. Alle verwerking vindt plaats in uw browser zonder gegevens naar een server te verzenden.',
134
+ },
135
+ ],
136
+ };