@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: 'Bu araç SEO sıralamama nasıl yardımcı olur?',
8
+ answer: 'Anahtar kelime yoğunluğunu ve cümle okunabilirliğini analiz ederek, içeriğinizin kullanıcılar için anlaşılmasını kolaylaştırır, arama motorları için alakalı hale getirir ve aşırı optimizasyon cezalarından kaçınmanızı sağlarsınız.',
9
+ },
10
+ {
11
+ question: 'Teknik analiz hangi HTML öğelerini kontrol eder?',
12
+ answer: 'H1 etiketinin varlığını ve benzersizliğini, H2/H3 alt başlıklarının varlığını ve görsellerdeki alt özniteliklerini doğrular.',
13
+ },
14
+ {
15
+ question: 'İçeriğim herhangi bir sunucuda saklanıyor mu?',
16
+ answer: 'Hayır. Analiz %100 tarayıcınızda yerel olarak çalışır. İçeriğiniz asla bilgisayarınızdan dışarı çıkmaz.',
17
+ },
18
+ {
19
+ question: 'Yoast SEO kriterleri ile uyumlu mu?',
20
+ answer: 'Evet, Yoast\'a benzer kriterler uyguluyoruz: cümle uzunluğu, paragraf dağılımı ve başlık hiyerarşisi.',
21
+ },
22
+ ];
23
+
24
+ const howToData = [
25
+ { name: 'Metninizi yazın veya yapıştırın', text: 'Analiz etmek istediğiniz içeriği ana metin alanına girin.' },
26
+ { name: 'Optimizasyon kontrol listesini inceleyin', text: 'Yan paneldeki uzunluk, okunabilirlik ve anahtar kelime yoğunluğu uyarılarını kontrol edin.' },
27
+ { name: 'Teknik HTML\'i analiz edin', text: 'H1 etiketlerini, görsel alt metinlerini ve meta veri yapısını doğrulamak için teknik analiz sekmesine geçin.' },
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: 'İçerik SEO için nasıl optimize edilir?',
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 İçerik Optimize Edici',
51
+ applicationCategory: 'UtilitiesApplication',
52
+ operatingSystem: 'Web',
53
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
54
+ description: 'Metinlerinizin anahtar kelime yoğunluğunu, okunabilirliğini ve teknik HTML yapısını gerçek zamanlı olarak, hiçbir sunucuya veri göndermeden analiz edin.',
55
+ };
56
+
57
+ const ui: SeoContentOptimizerUI = {
58
+ tabText: 'Metin Analizi',
59
+ tabHtml: 'Teknik HTML Analizi',
60
+ textareaPlaceholder: 'Metninizi yazın veya HTML kodunuzu buraya yapıştırın...',
61
+ statsChars: 'Karakter',
62
+ statsWords: 'Kelime',
63
+ statsReading: 'Okuma süresi',
64
+ statsSentences: 'Cümle',
65
+ checklistTitle: 'Optimizasyon Kontrol Listesi',
66
+ keywordsTitle: 'Anahtar Kelime Yoğunluğu',
67
+ technicalTitle: 'Teknik HTML Analizi',
68
+ h1Label: 'H1 Algılandı',
69
+ linksLabel: 'Bağlantılar (a)',
70
+ imgsLabel: 'Görseller (img)',
71
+ altsLabel: 'Eksik alt metinler',
72
+ emptyState: 'Veri yok',
73
+ analyzing: 'Analiz ediliyor...',
74
+ checkInsufficient: 'Yetersiz uzunluk (< 300 kelime)',
75
+ checkPillar: 'Mükemmel kapsamlı içerik (> 900 kelime)',
76
+ checkGoodLength: 'SEO için uygun uzunluk',
77
+ checkLongSentences: 'Çok fazla uzun cümle (> metnin %25\'i)',
78
+ checkGoodReadability: 'Optimal cümle okunabilirliği',
79
+ checkLongParagraphs: 'Çok uzun paragrafları bölün (> 150 kelime)',
80
+ checkMissingH1: 'H1 etiketi eksik',
81
+ checkMultipleH1: 'Birden fazla H1 etiketi algılandı',
82
+ checkMissingH2: 'Alt başlıklar (H2) eksik',
83
+ checkMissingTitle: 'Meta başlık (title) etiketi eksik',
84
+ stopWords: JSON.stringify(['ve', 'veya', 'ama', 'fakat', 'ancak', 'lakin', 'da', 'de', 'ki', 'ile', 'için', 'gibi', 'kadar', 'tarafından', 'rağmen', 'göre', 'den', 'dan', 'ten', 'tan', 'ise', 'dir', 'dır', 'dur', 'dür', 'tir', 'tır', 'tur', 'tür', 'bir', 'bu', 'şu', 'o', 'ne', 'hakkında', 'olarak', 'mi', 'mı', 'mu', 'mü', 'şeyi', 'şeye', 'şey', 'benim', 'senin', 'onun', 'bizim', 'sizin', 'onların']),
85
+ };
86
+
87
+ export const content: ToolLocaleContent<SeoContentOptimizerUI> = {
88
+ slug: 'seo-icerik-optimize-edici',
89
+ title: 'SEO İçerik Optimize Edici',
90
+ description: 'Metinlerinizin anahtar kelime yoğunluğunu, okunabilirliğini ve teknik HTML yapısını gerçek zamanlı olarak analiz edin. Ücretsiz ve gizlilik odaklı SEO aracı.',
91
+ ui,
92
+ faqTitle: 'Sıkça Sorulan Sorular',
93
+ faq: faqData,
94
+ howTo: howToData,
95
+ bibliographyTitle: 'Kaynaklar',
96
+ bibliography: [
97
+ { name: "Google'ın SEO Başlangıç Kılavuzu", url: 'https://developers.google.com/search/docs/fundamentals/seo-starter-guide?hl=tr' },
98
+ { name: 'Yoast SEO okunabilirlik kriterleri', url: 'https://yoast.com/what-is-readability/' },
99
+ ],
100
+ schemas: [faqSchema, howToSchema, appSchema],
101
+ seo: [
102
+ { type: 'title', level: 2, text: 'SEO İçerik Optimize Edici: Anahtar Kelimeler, Okunabilirlik ve Yapı' },
103
+ {
104
+ type: 'paragraph',
105
+ html: 'İçerik kalitesi artık sadece dahil ettiğiniz anahtar kelimelerle değil, bilginizi hem insanlar hem de Google tarayıcıları için sindirilebilir olacak şekilde nasıl yapılandırdığınızla ölçülüyor. <strong>Gerçek zamanlı SEO analiz aracımız</strong>; anahtar kelime yoğunluğu, paragraf okunabilirliği ve temel HTML teknik öğeleri üzerinde tam kontrol sağlar.',
106
+ },
107
+ { type: 'title', level: 3, text: 'Anahtar Kelime Yoğunluğu ve Semantik Alaka' },
108
+ {
109
+ type: 'paragraph',
110
+ html: '<strong>Anahtar kelime yoğunluğu</strong>, bir terimin metnin geri kalanına göre ne sıklıkla göründüğünü gösterir. Aşırı tekrarlama <em>anahtar kelime doldurma (keyword stuffing)</em> filtrelerini tetiklerken, çok düşük yoğunluk arama motorlarının makalenizin ana konusunu belirlemesini zorlaştırabilir.',
111
+ },
112
+ {
113
+ type: 'list',
114
+ items: [
115
+ '<strong>Alaka analizi:</strong> En çok tekrarlanan kelimelerin arama amacınızla eşleşip eşleşmediğini belirleyin.',
116
+ '<strong>Ceza önleme:</strong> Spam gibi görünebilecek terimlerin aşırı tekrarlanmasından kaçının.',
117
+ '<strong>Semantik optimizasyon:</strong> Teknik terimler ile doğal dil arasında denge kurun.',
118
+ ],
119
+ },
120
+ { type: 'title', level: 3, text: 'Yoast Tarzı Okunabilirlik' },
121
+ {
122
+ type: 'paragraph',
123
+ html: 'Okunabilirlik dolaylı ama kritik bir sıralama faktörüdür. Paragraflar sonsuz metin blokları olduğu için kullanıcılar sayfayı terk ederse, <em>Hemen Çıkma Oranınız</em> artar ve kalma süreniz düşer. Analizör uzun cümleleri (20 kelime üzeri), 150 kelime üzerindeki paragrafları algılar ve alt başlıkları kontrol eder.',
124
+ },
125
+ {
126
+ type: 'tip',
127
+ title: 'Okuma süresi',
128
+ html: 'Çoğu kullanıcı bir makaleyi okuyup okumayacağına 10 saniyenin altında karar verir. Tahmini okuma süresini bilmek (dakikada ortalama 200 kelime üzerinden hesaplanır), okuyucunun beklentilerini belirleyerek hemen çıkma oranını düşürmeye yardımcı olur.',
129
+ },
130
+ { type: 'title', level: 3, text: 'Teknik HTML Analizi' },
131
+ {
132
+ type: 'paragraph',
133
+ html: 'Temel öğeleri doğrulamak için kaynak kodunuzu yapıştırın: <strong>H1</strong> etiketinin benzersizliği, H2/H3 alt başlıklarının varlığı, <code>alt</code> özniteliği olmayan görseller ve <code>title</code> etiketinin varlığı. Tüm işlemler veri hiçbir sunucuya gönderilmeden tarayıcınızda gerçekleşir.',
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=zh-cn' },
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> 就会下降。分析器会检测长句(中文语境下按平均字数折算)、超过 150 词的段落,并检查小标题的存在。',
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
+ };
@@ -11,6 +11,18 @@ export const seoContentOptimizer: ToolsToolEntry<SeoContentOptimizerUI> = {
11
11
  es: () => import('./i18n/es').then((m) => m.content),
12
12
  en: () => import('./i18n/en').then((m) => m.content),
13
13
  fr: () => import('./i18n/fr').then((m) => m.content),
14
+ de: () => import('./i18n/de').then((m) => m.content),
15
+ it: () => import('./i18n/it').then((m) => m.content),
16
+ pt: () => import('./i18n/pt').then((m) => m.content),
17
+ nl: () => import('./i18n/nl').then((m) => m.content),
18
+ pl: () => import('./i18n/pl').then((m) => m.content),
19
+ tr: () => import('./i18n/tr').then((m) => m.content),
20
+ id: () => import('./i18n/id').then((m) => m.content),
21
+ sv: () => import('./i18n/sv').then((m) => m.content),
22
+ ru: () => import('./i18n/ru').then((m) => m.content),
23
+ ja: () => import('./i18n/ja').then((m) => m.content),
24
+ ko: () => import('./i18n/ko').then((m) => m.content),
25
+ zh: () => import('./i18n/zh').then((m) => m.content),
14
26
  },
15
27
  };
16
28
 
@@ -0,0 +1,152 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
+ import type { SpeedReaderUI } from '../ui';
4
+
5
+ const faqData = [
6
+ {
7
+ question: 'Was ist die RSVP-Technologie?',
8
+ answer: 'RSVP steht für Rapid Serial Visual Presentation. Wörter erscheinen nacheinander am selben Fokuspunkt, sodass die Augen nicht mehr von links nach rechts bewegt werden müssen. Dies ermöglicht mit etwas Übung ein deutlich schnelleres Lesen ohne Einbußen beim Verständnis.',
9
+ },
10
+ {
11
+ question: 'Verringert schnelleres Lesen das Verständnis?',
12
+ answer: 'Das hängt vom Training ab. Bei moderaten Geschwindigkeiten (350-500 WPM) berichten viele Nutzer von einer höheren Konzentration, da das subvokale Mitlesen (die innere Stimme) wegfällt. Bei extremen Geschwindigkeiten (800+ WPM) kann die Merkfähigkeit ohne vorherige Übung abnehmen.',
13
+ },
14
+ {
15
+ question: 'Was ist die durchschnittliche Lesegeschwindigkeit?',
16
+ answer: 'Ein durchschnittlicher Erwachsener liest zwischen 200 und 250 Wörtern pro Minute. Mit dem RSVP-Reader und etwas Übung ist eine Verdoppelung dieser Geschwindigkeit (400-500 WPM) bei gleichzeitig exzellentem Verständnis üblich.',
17
+ },
18
+ {
19
+ question: 'Verursacht RSVP eine Überanstrengung der Augen?',
20
+ answer: 'Durch den Wegfall der Muskelanstrengung bei der Augenbewegung stellen viele Nutzer fest, dass sie mit weniger Ermüdung lesen können als bei herkömmlichen Methoden. Es kann sich anfangs intensiv anfühlen, aber das Gehirn passt sich schnell an.',
21
+ },
22
+ ];
23
+
24
+ const howToData = [
25
+ { name: 'Text eingeben', text: 'Fügen Sie den Artikel, das Buch oder das Dokument, das Sie lesen möchten, in den Textbereich ein.' },
26
+ { name: 'WPM konfigurieren', text: 'Passen Sie die Wörter pro Minute (WPM) an. Wenn Sie Anfänger sind, beginnen Sie bei 300 WPM und steigern Sie sich schrittweise.' },
27
+ { name: 'Blick fixieren', text: 'Halten Sie Ihre Augen auf den roten Buchstaben (ORP-Fokuspunkt) gerichtet. Versuchen Sie nicht, den Wörtern mit Augenbewegungen zu folgen.' },
28
+ { name: 'Training starten', text: 'Drücken Sie die Wiedergabetaste und lassen Sie die Informationen fließen. Sie können jederzeit pausieren.' },
29
+ ];
30
+
31
+ const faqSchema: WithContext<FAQPage> = {
32
+ '@context': 'https://schema.org',
33
+ '@type': 'FAQPage',
34
+ mainEntity: faqData.map((item) => ({
35
+ '@type': 'Question',
36
+ name: item.question,
37
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
38
+ })),
39
+ };
40
+
41
+ const howToSchema: WithContext<HowTo> = {
42
+ '@context': 'https://schema.org',
43
+ '@type': 'HowTo',
44
+ name: 'So verwenden Sie den RSVP-Schnellleser',
45
+ step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
46
+ };
47
+
48
+ const appSchema: WithContext<SoftwareApplication> = {
49
+ '@context': 'https://schema.org',
50
+ '@type': 'SoftwareApplication',
51
+ name: 'RSVP Speed Reader',
52
+ applicationCategory: 'UtilitiesApplication',
53
+ operatingSystem: 'Web',
54
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
55
+ description: 'Trainieren Sie Ihre Lesegeschwindigkeit auf bis zu 1000 Wörter pro Minute mit RSVP-Technologie und optimaler Ausrichtung des Erkennungspunkts.',
56
+ };
57
+
58
+ const ui: SpeedReaderUI = {
59
+ progressLabel: 'Lese-Fortschritt',
60
+ speedLabel: 'Geschwindigkeit',
61
+ slowLabel: 'LANGSAM',
62
+ fastLabel: 'GOTT-MODUS',
63
+ speedHint: 'Beginnen Sie bei 300 WPM und steigern Sie sich schrittweise, um Ihre Grenzen zu erweitern.',
64
+ textLabel: 'Zu verarbeitender Text',
65
+ textPlaceholder: 'Fügen Sie Ihren Artikel, Ihr Buch oder Ihren Text hier ein...',
66
+ clearLabel: 'LÖSCHEN',
67
+ words: 'Wörter',
68
+ defaultText: 'Willkommen beim RSVP Speed Reader. Fügen Sie unten Ihren Text ein, um zu beginnen. Diese Technologie hilft Ihnen, bis zu dreimal schneller zu lesen, indem unnötige Augenbewegungen vermieden werden.',
69
+ play: 'Abspielen',
70
+ pause: 'Pause',
71
+ };
72
+
73
+ export const content: ToolLocaleContent<SpeedReaderUI> = {
74
+ slug: 'schnell-leser',
75
+ title: 'RSVP Speed Reader',
76
+ description: 'Trainieren Sie Ihre Lesegeschwindigkeit auf bis zu 1000 Wörter pro Minute. RSVP-Technologie mit optimaler Fokuspunkt-Ausrichtung. Verdoppeln Sie Ihre intellektuelle Produktivität.',
77
+ ui,
78
+ faqTitle: 'Häufig gestellte Fragen',
79
+ faq: faqData,
80
+ howTo: howToData,
81
+ bibliographyTitle: 'Referenzen',
82
+ bibliography: [
83
+ { name: 'Rayner, K., et al. (2016). So much to read, so little time. Psychological Science in the Public Interest.', url: 'https://journals.sagepub.com/doi/full/10.1177/1529100615623267' },
84
+ { name: 'Forster, K. I. (1970). Visual perception of rapidly presented word sequences. Perception & Psychophysics.', url: 'https://link.springer.com/article/10.3758/BF03212522' },
85
+ { name: 'Öquist, G., & Goldstein, M. (2003). Towards an improved readability on mobile devices. Mobile HCI.', url: 'https://www.researchgate.net/publication/221063852_Towards_an_improved_readability_on_mobile_devices' },
86
+ { name: 'Juola, J. F., et al. (1982). Visual search and reading of rapid serial visual presentations. Perception & Psychophysics.', url: 'https://link.springer.com/article/10.3758/BF03202598' },
87
+ { name: 'Masson, M. E. J. (1983). Conceptual processing of text during rapid serial visual presentation. Journal of Educational Psychology.', url: 'https://psycnet.apa.org/record/1984-08638-001' },
88
+ { name: 'Saldana, D., & Greene, R. (2022). Reading effectiveness with RSVP apps. Reading Psychology.', url: 'https://www.tandfonline.com/doi/abs/10.1080/02702711.2022.2030000' },
89
+ ],
90
+ schemas: [faqSchema, howToSchema, appSchema],
91
+ seo: [
92
+ { type: 'title', level: 2, text: 'Die Formel 1 des Lesens: Schalten Sie Ihre mentale Bandbreite frei' },
93
+ {
94
+ type: 'paragraph',
95
+ html: 'Was wäre, wenn Lesen biomechanisch gesehen reine Zeitverschwendung wäre? Ihr Gehirn ist ein Supercomputer, der durch eine analoge Verbindung ausgebremst wird: Ihre Augen. Der <strong>RSVP-Reader</strong> durchbricht diesen Engpass, indem er Wörter genau an dem Fokuspunkt präsentiert, an dem Ihr Geist sie am schnellsten verarbeitet.',
96
+ },
97
+ {
98
+ type: 'paragraph',
99
+ html: 'Herkömmliches Lesen ist ein ineffizienter Prozess. Ihre Augen arbeiten nicht wie ein Scanner, sondern wie eine Kamera im Serienbildmodus: Stopp, Fokus, Sprung. Dieser Sprung, <strong>Sakkade</strong> genannt, bedeutet, dass Sie einen großen Teil der Lesezeit damit verbringen, einfach nur Ihre Augen zu bewegen, anstatt Informationen aufzunehmen.',
100
+ },
101
+ {
102
+ type: 'tip',
103
+ html: '"RSVP-Lesen bedeutet nicht nur, schneller zu lesen. Es bedeutet, die mechanische Reibung zwischen Text und Gehirn zu eliminieren."',
104
+ },
105
+ { type: 'title', level: 3, text: 'Die Wissenschaft hinter der Daten-Injektion' },
106
+ {
107
+ type: 'comparative',
108
+ columns: 3,
109
+ items: [
110
+ {
111
+ icon: 'mdi:bullseye-arrow',
112
+ title: 'Optimaler Erkennungspunkt (ORP)',
113
+ description: 'Jedes Wort hat einen Punkt, an dem Ihr Gehirn es am schnellsten erkennt. Der Algorithmus berechnet genau diesen Buchstaben (den roten) und zentriert ihn perfekt. Ihre Augen bewegen sich keinen Millimeter.',
114
+ },
115
+ {
116
+ icon: 'mdi:speedometer-slow',
117
+ title: 'Kognitive Stille',
118
+ highlight: true,
119
+ description: 'Ab 400-500 WPM verstummt Ihre innere Stimme – sie kommt nicht mehr mit. Sie hören nicht mehr auf das, was Sie lesen, sondern sehen reine Bedeutungen und Konzepte. Das ist der ultimative Flow-Zustand.',
120
+ },
121
+ {
122
+ icon: 'mdi:brain',
123
+ title: 'Visuelle Neuroplastizität',
124
+ description: 'Wie beim Training im Fitnessstudio: 300 WPM fühlen sich am Anfang schnell an. Nach einer Woche sind 500 WPM wie ein Spaziergang. Sie trainieren die neuronalen Pfade neu, die Ihren visuellen Kortex mit der Sprachverarbeitung verbinden.',
125
+ },
126
+ ],
127
+ },
128
+ { type: 'title', level: 3, text: 'Trainingsprotokoll: Vom Anfänger zum Profi' },
129
+ {
130
+ type: 'comparative',
131
+ columns: 3,
132
+ items: [
133
+ {
134
+ title: 'Level 1: Das Erwachen (200 bis 300 WPM)',
135
+ description: 'Ihre normale Lesegeschwindigkeit. Gewöhnen Sie sich an die Benutzeroberfläche. Entspannen Sie Ihr Gesicht und lassen Sie die Wörter auf sich zukommen. Versuchen Sie nicht, sie zu „greifen“.',
136
+ points: ['Ideal für Anfänger', 'Gewöhnung an den ORP', 'Keine Überanstrengung der Augen'],
137
+ },
138
+ {
139
+ title: 'Level 2: Schallmauer (400 bis 500 WPM)',
140
+ highlight: true,
141
+ description: 'Hier geschieht die Magie. Sie werden ein gewisses Unbehagen spüren. Werden Sie nicht langsamer, wenn Sie ein Wort verpassen – Ihr Gehirn wird lernen, Lücken aus dem Kontext zu füllen.',
142
+ points: ['Subvokalisierung verschwindet', 'Mentaler Flow-Zustand', 'Verdoppelung der Basisgeschwindigkeit'],
143
+ },
144
+ {
145
+ title: 'Level 3: Fluchtgeschwindigkeit (600+ WPM)',
146
+ description: 'Territorium für Fortgeschrittene. Ideal zur Wiederholung von Lernmaterial, zum Lesen von Nachrichten oder zum Konsumieren technischer Dokumentationen, bei denen Sie nach Schlüsselkonzepten suchen.',
147
+ points: ['Durchschnittlicher Roman in 2 Stunden', 'Maximale Leseeffizienz', 'Erfordert vorherige Übung'],
148
+ },
149
+ ],
150
+ },
151
+ ],
152
+ };
@@ -71,7 +71,7 @@ const ui: SpeedReaderUI = {
71
71
  };
72
72
 
73
73
  export const content: ToolLocaleContent<SpeedReaderUI> = {
74
- slug: 'lectura-rapida',
74
+ slug: 'lector-rapido',
75
75
  title: 'RSVP Lector Rápido',
76
76
  description: 'Entrena tu velocidad de lectura hasta 1000 palabras por minuto. Tecnología RSVP con alineación de punto focal óptimo. Dobla tu productividad intelectual.',
77
77
  ui,
@@ -0,0 +1,152 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
+ import type { SpeedReaderUI } from '../ui';
4
+
5
+ const faqData = [
6
+ {
7
+ question: 'Apa itu teknologi RSVP?',
8
+ answer: 'RSVP singkatan dari Rapid Serial Visual Presentation. Kata-kata muncul satu per satu pada titik fokus yang sama, menghilangkan kebutuhan untuk menggerakkan mata dari kiri ke kanan. Ini memungkinkan membaca dengan kecepatan yang jauh lebih tinggi tanpa mengorbankan pemahaman jika dilatih.',
9
+ },
10
+ {
11
+ question: 'Apakah membaca lebih cepat mengurangi pemahaman?',
12
+ answer: 'Tergantung pada latihan. Pada kecepatan sedang (350-500 WPM), banyak pengguna melaporkan konsentrasi yang lebih tinggi dengan menghilangkan subvokalisasi (suara batin). Pada kecepatan ekstrim (800+ WPM), retensi dapat menurun tanpa latihan sebelumnya.',
13
+ },
14
+ {
15
+ question: 'Berapa kecepatan membaca rata-rata?',
16
+ answer: 'Rata-rata orang dewasa membaca antara 200 hingga 250 kata per menit. Dengan pembaca RSVP dan sedikit latihan, menggandakan kecepatan tersebut (400-500 WPM) sambil mempertahankan pemahaman yang sangat baik adalah hal yang umum.',
17
+ },
18
+ {
19
+ question: 'Apakah RSVP menyebabkan ketegangan mata?',
20
+ answer: 'Dengan menghilangkan upaya otot dalam menggerakkan mata, banyak pengguna merasa mereka dapat membaca dengan lebih sedikit kelelahan dibandingkan metode tradisional. Mungkin terasa intens pada awalnya, tetapi otak beradaptasi dengan cepat.',
21
+ },
22
+ ];
23
+
24
+ const howToData = [
25
+ { name: 'Masukkan teks Anda', text: 'Tempelkan artikel, buku, atau dokumen yang ingin Anda baca ke area teks.' },
26
+ { name: 'Konfigurasikan WPM', text: 'Sesuaikan Kata Per Menit (WPM). Jika Anda pemula, mulailah dari 300 WPM dan tingkatkan secara bertahap.' },
27
+ { name: 'Fokuskan pandangan', text: 'Jaga mata Anda pada huruf merah (titik fokus ORP). Jangan mencoba mengikuti kata-kata dengan gerakan mata.' },
28
+ { name: 'Mulai latihan', text: 'Tekan tombol putar dan biarkan informasi mengalir. Anda dapat menjeda kapan saja.' },
29
+ ];
30
+
31
+ const faqSchema: WithContext<FAQPage> = {
32
+ '@context': 'https://schema.org',
33
+ '@type': 'FAQPage',
34
+ mainEntity: faqData.map((item) => ({
35
+ '@type': 'Question',
36
+ name: item.question,
37
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
38
+ })),
39
+ };
40
+
41
+ const howToSchema: WithContext<HowTo> = {
42
+ '@context': 'https://schema.org',
43
+ '@type': 'HowTo',
44
+ name: 'Cara menggunakan pembaca cepat RSVP',
45
+ step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
46
+ };
47
+
48
+ const appSchema: WithContext<SoftwareApplication> = {
49
+ '@context': 'https://schema.org',
50
+ '@type': 'SoftwareApplication',
51
+ name: 'RSVP Speed Reader',
52
+ applicationCategory: 'UtilitiesApplication',
53
+ operatingSystem: 'Web',
54
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
55
+ description: 'Latih kecepatan membaca Anda hingga 1000 kata per menit dengan teknologi RSVP dan penyelarasan titik pengenalan yang optimal.',
56
+ };
57
+
58
+ const ui: SpeedReaderUI = {
59
+ progressLabel: 'Kemajuan membaca',
60
+ speedLabel: 'Kecepatan',
61
+ slowLabel: 'LAMBAT',
62
+ fastLabel: 'DEWA',
63
+ speedHint: 'Mulailah dari 300 WPM e tingkatkan secara bertahap untuk melampaui batas Anda.',
64
+ textLabel: 'Teks untuk diproses',
65
+ textPlaceholder: 'Tempel artikel, buku, atau teks Anda di sini...',
66
+ clearLabel: 'BERSIHKAN',
67
+ words: 'kata',
68
+ defaultText: 'Selamat datang di RSVP Speed Reader. Tempelkan teks Anda di bawah ini untuk memulai. Teknologi ini akan membantu Anda membaca hingga tiga kali lebih cepat dengan menghilangkan gerakan mata yang tidak perlu.',
69
+ play: 'Putar',
70
+ pause: 'Jeda',
71
+ };
72
+
73
+ export const content: ToolLocaleContent<SpeedReaderUI> = {
74
+ slug: 'pembaca-cepat',
75
+ title: 'RSVP Speed Reader',
76
+ description: 'Latih kecepatan membaca Anda hingga 1000 kata per menit. Teknologi RSVP dengan penyelarasan titik fokus yang optimal. Gandakan produktivitas intelektual Anda.',
77
+ ui,
78
+ faqTitle: 'Pertanyaan yang Sering Diajukan',
79
+ faq: faqData,
80
+ howTo: howToData,
81
+ bibliographyTitle: 'Referensi',
82
+ bibliography: [
83
+ { name: 'Rayner, K., et al. (2016). So much to read, so little time. Psychological Science in the Public Interest.', url: 'https://journals.sagepub.com/doi/full/10.1177/1529100615623267' },
84
+ { name: 'Forster, K. I. (1970). Visual perception of rapidly presented word sequences. Perception & Psychophysics.', url: 'https://link.springer.com/article/10.3758/BF03212522' },
85
+ { name: 'Öquist, G., & Goldstein, M. (2003). Towards an improved readability on mobile devices. Mobile HCI.', url: 'https://www.researchgate.net/publication/221063852_Towards_an_improved_readability_on_mobile_devices' },
86
+ { name: 'Juola, J. F., et al. (1982). Visual search and reading of rapid serial visual presentations. Perception & Psychophysics.', url: 'https://link.springer.com/article/10.3758/BF03202598' },
87
+ { name: 'Masson, M. E. J. (1983). Conceptual processing of text during rapid serial visual presentation. Journal of Educational Psychology.', url: 'https://psycnet.apa.org/record/1984-08638-001' },
88
+ { name: 'Saldana, D., & Greene, R. (2022). Reading effectiveness with RSVP apps. Reading Psychology.', url: 'https://www.tandfonline.com/doi/abs/10.1080/02702711.2022.2030000' },
89
+ ],
90
+ schemas: [faqSchema, howToSchema, appSchema],
91
+ seo: [
92
+ { type: 'title', level: 2, text: 'Formula 1 dalam Membaca: Buka Bandwidth Mental Anda' },
93
+ {
94
+ type: 'paragraph',
95
+ html: 'Bagaimana jika membaca, secara biomekanik, adalah pemborosan waktu? Otak Anda adalah superkomputer yang dibatasi oleh koneksi analog: mata Anda. <strong>Pembaca RSVP</strong> mendobrak hambatan tersebut dengan menyajikan kata-kata tepat pada titik fokus di mana pikiran Anda memprosesnya paling cepat.',
96
+ },
97
+ {
98
+ type: 'paragraph',
99
+ html: 'Membaca tradisional adalah proses yang tidak efisien. Mata Anda tidak bekerja seperti pemindai; mereka bekerja seperti kamera mode burst: berhenti, fokus, melompat. Lompatan ini, yang disebut <strong>saccade</strong>, berarti Anda menghabiskan sebagian besar waktu membaca hanya untuk menggerakkan mata daripada menyerap informasi.',
100
+ },
101
+ {
102
+ type: 'tip',
103
+ html: '"Membaca RSVP bukan hanya membaca lebih cepat. Ini adalah menghilangkan gesekan mekanis antara teks dan otak Anda."',
104
+ },
105
+ { type: 'title', level: 3, text: 'Sains di Balik Injeksi Data' },
106
+ {
107
+ type: 'comparative',
108
+ columns: 3,
109
+ items: [
110
+ {
111
+ icon: 'mdi:bullseye-arrow',
112
+ title: 'Optimal Recognition Point (ORP)',
113
+ description: 'Setiap kata memiliki titik di mana otak Anda mengenalinya paling cepat. Algoritme menghitung huruf tersebut (yang berwarna merah) dan memusatkannya dengan sempurna. Mata Anda tidak bergerak satu milimeter pun.',
114
+ },
115
+ {
116
+ icon: 'mdi:speedometer-slow',
117
+ title: 'Keheningan Kognitif',
118
+ highlight: true,
119
+ description: 'Di atas 400-500 WPM, suara batin Anda akan diam — ia tidak bisa mengimbanginya. Anda berhenti "mendengar" apa yang Anda baca dan mulai "melihat" makna dan konsep murni. Ini adalah kondisi aliran (flow) yang terbaik.',
120
+ },
121
+ {
122
+ icon: 'mdi:brain',
123
+ title: 'Neuroplastisitas Visual',
124
+ description: 'Seperti pergi ke gym: 300 WPM akan terasa cepat pada awalnya. Setelah seminggu, 500 WPM akan terasa seperti berjalan kaki. Anda melatih kembali jalur saraf yang menghubungkan korteks visual Anda dengan pemrosesan bahasa.',
125
+ },
126
+ ],
127
+ },
128
+ { type: 'title', level: 3, text: 'Protokol Latihan: Dari Pemula hingga Neo' },
129
+ {
130
+ type: 'comparative',
131
+ columns: 3,
132
+ items: [
133
+ {
134
+ title: 'Level 1: Kebangkitan (200 hingga 300 WPM)',
135
+ description: 'Kecepatan membaca normal Anda. Biasakan diri dengan antarmuka. Rilekskan wajah Anda dan biarkan kata-kata datang kepada Anda. Jangan mencoba "menangkap" mereka.',
136
+ points: ['Ideal untuk pemula', 'Familiarisasi ORP', 'Tidak ada ketegangan mata'],
137
+ },
138
+ {
139
+ title: 'Level 2: Penghalang Suara (400 hingga 500 WPM)',
140
+ highlight: true,
141
+ description: 'Di sinilah keajaiban terjadi. Anda akan merasa tidak nyaman. Jangan melambat saat Anda melewatkan satu kata — otak Anda akan belajar mengisi celah dari konteks.',
142
+ points: ['Subvokalisasi menghilang', 'Kondisi aliran mental', 'Gandakan kecepatan dasar Anda'],
143
+ },
144
+ {
145
+ title: 'Level 3: Kecepatan Lepas (600+ WPM)',
146
+ description: 'Wilayah tingkat lanjut. Ideal untuk meninjau materi studi, membaca berita, atau mengonsumsi dokumentasi teknis di mana Anda mencari konsep kunci.',
147
+ points: ['Novel rata-rata dalam 2 jam', 'Efisiensi membaca maksimum', 'Memerlukan latihan sebelumnya'],
148
+ },
149
+ ],
150
+ },
151
+ ],
152
+ };