@jjlmoya/utils-tools 1.2.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 (184) 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/id.ts +157 -0
  106. package/src/tool/routes/i18n/it.ts +157 -0
  107. package/src/tool/routes/i18n/ja.ts +157 -0
  108. package/src/tool/routes/i18n/ko.ts +157 -0
  109. package/src/tool/routes/i18n/nl.ts +157 -0
  110. package/src/tool/routes/i18n/pl.ts +157 -0
  111. package/src/tool/routes/i18n/pt.ts +157 -0
  112. package/src/tool/routes/i18n/ru.ts +157 -0
  113. package/src/tool/routes/i18n/sv.ts +157 -0
  114. package/src/tool/routes/i18n/tr.ts +157 -0
  115. package/src/tool/routes/i18n/zh.ts +157 -0
  116. package/src/tool/routes/index.ts +13 -1
  117. package/src/tool/rule-of-three/i18n/de.ts +171 -0
  118. package/src/tool/rule-of-three/i18n/en.ts +1 -1
  119. package/src/tool/rule-of-three/i18n/id.ts +171 -0
  120. package/src/tool/rule-of-three/i18n/it.ts +171 -0
  121. package/src/tool/rule-of-three/i18n/ja.ts +171 -0
  122. package/src/tool/rule-of-three/i18n/ko.ts +171 -0
  123. package/src/tool/rule-of-three/i18n/nl.ts +171 -0
  124. package/src/tool/rule-of-three/i18n/pl.ts +171 -0
  125. package/src/tool/rule-of-three/i18n/pt.ts +171 -0
  126. package/src/tool/rule-of-three/i18n/ru.ts +171 -0
  127. package/src/tool/rule-of-three/i18n/sv.ts +171 -0
  128. package/src/tool/rule-of-three/i18n/tr.ts +171 -0
  129. package/src/tool/rule-of-three/i18n/zh.ts +171 -0
  130. package/src/tool/rule-of-three/index.ts +13 -1
  131. package/src/tool/seo-content-optimizer/i18n/de.ts +136 -0
  132. package/src/tool/seo-content-optimizer/i18n/id.ts +136 -0
  133. package/src/tool/seo-content-optimizer/i18n/it.ts +136 -0
  134. package/src/tool/seo-content-optimizer/i18n/ja.ts +136 -0
  135. package/src/tool/seo-content-optimizer/i18n/ko.ts +136 -0
  136. package/src/tool/seo-content-optimizer/i18n/nl.ts +136 -0
  137. package/src/tool/seo-content-optimizer/i18n/pl.ts +136 -0
  138. package/src/tool/seo-content-optimizer/i18n/pt.ts +136 -0
  139. package/src/tool/seo-content-optimizer/i18n/ru.ts +136 -0
  140. package/src/tool/seo-content-optimizer/i18n/sv.ts +136 -0
  141. package/src/tool/seo-content-optimizer/i18n/tr.ts +136 -0
  142. package/src/tool/seo-content-optimizer/i18n/zh.ts +136 -0
  143. package/src/tool/seo-content-optimizer/index.ts +12 -0
  144. package/src/tool/speed-reader/i18n/de.ts +152 -0
  145. package/src/tool/speed-reader/i18n/es.ts +1 -1
  146. package/src/tool/speed-reader/i18n/id.ts +152 -0
  147. package/src/tool/speed-reader/i18n/it.ts +152 -0
  148. package/src/tool/speed-reader/i18n/ja.ts +152 -0
  149. package/src/tool/speed-reader/i18n/ko.ts +152 -0
  150. package/src/tool/speed-reader/i18n/nl.ts +152 -0
  151. package/src/tool/speed-reader/i18n/pl.ts +152 -0
  152. package/src/tool/speed-reader/i18n/pt.ts +152 -0
  153. package/src/tool/speed-reader/i18n/ru.ts +152 -0
  154. package/src/tool/speed-reader/i18n/sv.ts +152 -0
  155. package/src/tool/speed-reader/i18n/tr.ts +152 -0
  156. package/src/tool/speed-reader/i18n/zh.ts +152 -0
  157. package/src/tool/speed-reader/index.ts +12 -0
  158. package/src/tool/text-pixel-calculator/i18n/de.ts +133 -0
  159. package/src/tool/text-pixel-calculator/i18n/id.ts +133 -0
  160. package/src/tool/text-pixel-calculator/i18n/it.ts +133 -0
  161. package/src/tool/text-pixel-calculator/i18n/ja.ts +133 -0
  162. package/src/tool/text-pixel-calculator/i18n/ko.ts +133 -0
  163. package/src/tool/text-pixel-calculator/i18n/nl.ts +133 -0
  164. package/src/tool/text-pixel-calculator/i18n/pl.ts +133 -0
  165. package/src/tool/text-pixel-calculator/i18n/pt.ts +133 -0
  166. package/src/tool/text-pixel-calculator/i18n/ru.ts +133 -0
  167. package/src/tool/text-pixel-calculator/i18n/sv.ts +133 -0
  168. package/src/tool/text-pixel-calculator/i18n/tr.ts +133 -0
  169. package/src/tool/text-pixel-calculator/i18n/zh.ts +133 -0
  170. package/src/tool/text-pixel-calculator/index.ts +12 -0
  171. package/src/tool/whatsapp-link/i18n/de.ts +128 -0
  172. package/src/tool/whatsapp-link/i18n/es.ts +1 -1
  173. package/src/tool/whatsapp-link/i18n/id.ts +128 -0
  174. package/src/tool/whatsapp-link/i18n/it.ts +128 -0
  175. package/src/tool/whatsapp-link/i18n/ja.ts +128 -0
  176. package/src/tool/whatsapp-link/i18n/ko.ts +128 -0
  177. package/src/tool/whatsapp-link/i18n/nl.ts +128 -0
  178. package/src/tool/whatsapp-link/i18n/pl.ts +128 -0
  179. package/src/tool/whatsapp-link/i18n/pt.ts +128 -0
  180. package/src/tool/whatsapp-link/i18n/ru.ts +128 -0
  181. package/src/tool/whatsapp-link/i18n/sv.ts +128 -0
  182. package/src/tool/whatsapp-link/i18n/tr.ts +128 -0
  183. package/src/tool/whatsapp-link/i18n/zh.ts +128 -0
  184. 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: 'Basit doğru orantı (içler dışlar çarpımı) nedir?',
8
+ answer: "Üç bilinen değer ile bir bilinmeyen arasındaki orantı problemlerini çözmek için kullanılan matematiksel bir yöntemdir. Bir miktar arttığında diğerinin de aynı oranda artması nedeniyle 'doğru' orantı olarak adlandırılır.",
9
+ },
10
+ {
11
+ question: 'Ters orantı ne zaman kullanılmalıdır?',
12
+ answer: "Miktarlar ters orantılı olduğunda (biri arttığında diğeri azaldığında) kullanılır. Örneğin: 2 boyacı bir işi 5 saatte yapıyorsa, 4 boyacı daha kısa sürede yapacaktır. Mevcut hesaplayıcımız doğru orantıya odaklanmaktadır.",
13
+ },
14
+ {
15
+ question: 'Profesyonel hesaplamalar için doğru sonuç verir mi?',
16
+ answer: 'Evet. Hesaplayıcımız, ilaç dozaj ayarlamaları, grafik tasarım ölçekleri, ticari bütçeler ve tarif dönüşümleri için ideal olan yüksek hassasiyetli kayan nokta hassasiyeti kullanır.',
17
+ },
18
+ {
19
+ question: 'Manuel olarak nasıl hesaplanır?',
20
+ answer: 'Formül şöyledir: (B Değeri * C Değeri) / A Değeri = X. Yani, çapraz değerleri çarpar ve sonucu kalan değere bölersiniz.',
21
+ },
22
+ ];
23
+
24
+ const howToData = [
25
+ {
26
+ name: 'Temel ilişkiyi belirleyin',
27
+ text: 'İlk orantıyı oluşturan iki bilinen değeri girin (örneğin 100km, 8 litreye eşittir).',
28
+ },
29
+ {
30
+ name: 'Üçüncü değeri girin',
31
+ text: 'Eşdeğerini bulmak istediğiniz yeni değeri yazın (örneğin 250km yol gideceksem...).',
32
+ },
33
+ {
34
+ name: 'Sonucu alın',
35
+ text: 'Sistem, herhangi bir düğmeye basmanıza gerek kalmadan bilinmeyen değeri (X) gerçek zamanlı olarak otomatik olarak hesaplayacaktır.',
36
+ },
37
+ {
38
+ name: 'Kopyalayın veya sıfırlayın',
39
+ text: 'Sonucu doğrudan pano belleğine kopyalayabilir veya yeni bir hesaplama yapmak için alanları temizleyebilirsiniz.',
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: 'Orantı hesaplayıcı nasıl kullanılır?',
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: 'Basit Orantı (Dreisatz) Hesaplayıcı',
64
+ applicationCategory: 'UtilitiesApplication',
65
+ operatingSystem: 'Web',
66
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
67
+ description: 'Matematiksel orantıları anında çözün. Miktarları, tarifleri, indirimleri ve dönüşümleri hesaplamak için kesin çözüm.',
68
+ };
69
+
70
+ const ui: RuleOfThreeUI = {
71
+ labelA: 'Şu varsa...',
72
+ labelB: 'Şuna eşittir...',
73
+ labelC: 'Ve şimdi şu varsa...',
74
+ labelX: 'Sonuç (X)',
75
+ hintA: 'Başlangıç miktarı',
76
+ hintB: 'Bilinen değer',
77
+ hintC: 'Yeni miktar',
78
+ hintX: 'Hesaplanan değer',
79
+ separatorIsTo: 'şuna oranı şudur',
80
+ separatorWillBe: 'şöyle olacaktır',
81
+ copyTitle: 'Sonucu kopyala',
82
+ };
83
+
84
+ export const content: ToolLocaleContent<RuleOfThreeUI> = {
85
+ slug: 'uc-kurali-hesaplayici',
86
+ title: 'Basit Orantı (Dreisatz) Hesaplayıcı',
87
+ description: 'Matematiksel orantıları anında çözün. Miktarları, tarifleri, indirimleri ve dönüşümleri hesaplamak için kesin çözüm.',
88
+ ui,
89
+ faqTitle: 'Sıkça Sorulan Sorular',
90
+ faq: faqData,
91
+ howTo: howToData,
92
+ bibliographyTitle: 'Kaynaklar',
93
+ bibliography: [
94
+ { name: 'Orantı (matematik) — Vikipedi', url: 'https://tr.wikipedia.org/wiki/Orant%C4%B1' },
95
+ { name: 'Oran ve orantı — Khan Academy', url: 'https://tr.khanacademy.org/math/pre-algebra/pre-algebra-ratios-rates' },
96
+ ],
97
+ schemas: [faqSchema, howToSchema, appSchema],
98
+ seo: [
99
+ {
100
+ type: 'title',
101
+ text: 'Orantı (İçler Dışlar) ne için kullanılır?',
102
+ level: 2,
103
+ },
104
+ {
105
+ type: 'paragraph',
106
+ html: 'Basit doğru orantı, matematiğin „İsviçre çakısıdır“. Üç veri noktasının bilindiği ve dördüncüsünü aradığımız problemleri çözer. Eğer <strong>A ve B</strong> arasındaki ilişkiyi biliyorsanız ve yeni bir <strong>C</strong> değeriniz varsa, hesaplayıcı <strong>X</strong> değerini anında bulur.',
107
+ },
108
+ {
109
+ type: 'comparative',
110
+ columns: 2,
111
+ items: [
112
+ {
113
+ icon: 'mdi:chef-hat',
114
+ title: 'Yemek Pişirme ve Tarifler',
115
+ description: 'Eğer tarif 4 kişi için 500 gr un gerektiriyorsa, 7 kişi için ne kadar un gerekir?',
116
+ points: ['(500 × 7) ÷ 4 = 875 gr'],
117
+ },
118
+ {
119
+ icon: 'mdi:shopping',
120
+ title: 'Alışveriş ve Fiyatlar',
121
+ description: 'Eğer 3 kutuluk bir paket 2,50 € ise, 10 kutu bana ne kadara mal olur?',
122
+ points: ['(2,50 × 10) ÷ 3 = 8,33 €'],
123
+ },
124
+ {
125
+ icon: 'mdi:car',
126
+ title: 'Seyahat ve Mesafe',
127
+ description: 'Eğer 60 km gitmek 45 dakikamı alıyorsa, 140 km gitmek ne kadar sürer?',
128
+ points: ['(45 × 140) ÷ 60 = 105 dk'],
129
+ },
130
+ {
131
+ icon: 'mdi:monitor-screenshot',
132
+ title: 'Tasarım ve Ekranlar',
133
+ description: 'Eğer görüntü 1920 piksel genişliğinde ise ve ben orantıyı koruyarak 800 piksele düşürmek istiyorsam...',
134
+ points: ['(OrijinalYükseklik × 800) ÷ 1920 = YeniYükseklik'],
135
+ },
136
+ ],
137
+ },
138
+ {
139
+ type: 'title',
140
+ text: 'Formül nasıl çalışır?',
141
+ level: 2,
142
+ },
143
+ {
144
+ type: 'paragraph',
145
+ html: 'Formül her zaman aynıdır: <strong>çapraz değerleri çarpın ve kalan değerle bölün</strong>.',
146
+ },
147
+ {
148
+ type: 'code',
149
+ code: '(B × C) ÷ A = X',
150
+ ariaLabel: 'Basit doğru orantı formülü',
151
+ },
152
+ {
153
+ type: 'paragraph',
154
+ html: 'Hesaplayıcıda: <strong>B</strong> değerini <strong>C</strong> değeriyle çarpıp <strong>A</strong> değerine bölüyoruz. Sonuç <strong>X</strong> olur.',
155
+ },
156
+ {
157
+ type: 'title',
158
+ text: 'Profesyonel ve günlük kullanımlar',
159
+ level: 2,
160
+ },
161
+ {
162
+ type: 'paragraph',
163
+ html: 'Okul matematiğinin ötesinde, orantı her yerdedir: Eczacılıkta vücut ağırlığına göre dozaj hesaplamada, fotoğrafçılıkta pozlama sürelerini hesaplamada, finansta yüzde değişimlerini hesaplamada veya matbaacılıkta format boyutlarını ölçeklendirmede.',
164
+ },
165
+ {
166
+ type: 'tip',
167
+ title: 'Hassasiyet ipucu',
168
+ html: 'Sonuç, 4 anlamlı ondalık basamağa kadar görüntülenir. Para veya tam ölçülerle çalışıyorsanız, bağlama göre yuvarlamayı unutmayın: Euro için 2 ondalık basamak, pikseller için tam sayılar.',
169
+ },
170
+ ],
171
+ };
@@ -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-calculator',
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
+ };