@jjlmoya/utils-diy 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/package.json +2 -1
  2. package/src/category/i18n/de.ts +12 -0
  3. package/src/category/i18n/id.ts +12 -0
  4. package/src/category/i18n/it.ts +12 -0
  5. package/src/category/i18n/ja.ts +12 -0
  6. package/src/category/i18n/ko.ts +12 -0
  7. package/src/category/i18n/nl.ts +12 -0
  8. package/src/category/i18n/pl.ts +12 -0
  9. package/src/category/i18n/pt.ts +12 -0
  10. package/src/category/i18n/ru.ts +12 -0
  11. package/src/category/i18n/sv.ts +12 -0
  12. package/src/category/i18n/tr.ts +12 -0
  13. package/src/category/i18n/zh.ts +12 -0
  14. package/src/category/index.ts +13 -1
  15. package/src/tests/faq_count.test.ts +1 -1
  16. package/src/tests/i18n_coverage.test.ts +36 -0
  17. package/src/tests/locale_completeness.test.ts +2 -2
  18. package/src/tests/seo_length.test.ts +3 -0
  19. package/src/tests/slug_uniqueness.test.ts +58 -0
  20. package/src/tool/balusterCalculator/i18n/de.ts +264 -0
  21. package/src/tool/balusterCalculator/i18n/id.ts +264 -0
  22. package/src/tool/balusterCalculator/i18n/it.ts +264 -0
  23. package/src/tool/balusterCalculator/i18n/ja.ts +264 -0
  24. package/src/tool/balusterCalculator/i18n/ko.ts +264 -0
  25. package/src/tool/balusterCalculator/i18n/nl.ts +264 -0
  26. package/src/tool/balusterCalculator/i18n/pl.ts +264 -0
  27. package/src/tool/balusterCalculator/i18n/pt.ts +264 -0
  28. package/src/tool/balusterCalculator/i18n/ru.ts +264 -0
  29. package/src/tool/balusterCalculator/i18n/sv.ts +264 -0
  30. package/src/tool/balusterCalculator/i18n/tr.ts +264 -0
  31. package/src/tool/balusterCalculator/i18n/zh.ts +264 -0
  32. package/src/tool/balusterCalculator/index.ts +15 -7
  33. package/src/tool/clayCalculator/i18n/de.ts +183 -0
  34. package/src/tool/clayCalculator/i18n/id.ts +183 -0
  35. package/src/tool/clayCalculator/i18n/it.ts +183 -0
  36. package/src/tool/clayCalculator/i18n/ja.ts +182 -0
  37. package/src/tool/clayCalculator/i18n/ko.ts +183 -0
  38. package/src/tool/clayCalculator/i18n/nl.ts +183 -0
  39. package/src/tool/clayCalculator/i18n/pl.ts +183 -0
  40. package/src/tool/clayCalculator/i18n/pt.ts +183 -0
  41. package/src/tool/clayCalculator/i18n/ru.ts +183 -0
  42. package/src/tool/clayCalculator/i18n/sv.ts +183 -0
  43. package/src/tool/clayCalculator/i18n/tr.ts +183 -0
  44. package/src/tool/clayCalculator/i18n/zh.ts +183 -0
  45. package/src/tool/clayCalculator/index.ts +15 -7
  46. package/src/tool/concreteCalculator/i18n/de.ts +201 -0
  47. package/src/tool/concreteCalculator/i18n/id.ts +201 -0
  48. package/src/tool/concreteCalculator/i18n/it.ts +201 -0
  49. package/src/tool/concreteCalculator/i18n/ja.ts +201 -0
  50. package/src/tool/concreteCalculator/i18n/ko.ts +201 -0
  51. package/src/tool/concreteCalculator/i18n/nl.ts +201 -0
  52. package/src/tool/concreteCalculator/i18n/pl.ts +201 -0
  53. package/src/tool/concreteCalculator/i18n/pt.ts +201 -0
  54. package/src/tool/concreteCalculator/i18n/ru.ts +201 -0
  55. package/src/tool/concreteCalculator/i18n/sv.ts +201 -0
  56. package/src/tool/concreteCalculator/i18n/tr.ts +201 -0
  57. package/src/tool/concreteCalculator/i18n/zh.ts +201 -0
  58. package/src/tool/concreteCalculator/index.ts +17 -5
  59. package/src/tool/cutOptimizer/i18n/de.ts +178 -0
  60. package/src/tool/cutOptimizer/i18n/id.ts +178 -0
  61. package/src/tool/cutOptimizer/i18n/it.ts +178 -0
  62. package/src/tool/cutOptimizer/i18n/ja.ts +178 -0
  63. package/src/tool/cutOptimizer/i18n/ko.ts +178 -0
  64. package/src/tool/cutOptimizer/i18n/nl.ts +178 -0
  65. package/src/tool/cutOptimizer/i18n/pl.ts +178 -0
  66. package/src/tool/cutOptimizer/i18n/pt.ts +178 -0
  67. package/src/tool/cutOptimizer/i18n/ru.ts +178 -0
  68. package/src/tool/cutOptimizer/i18n/sv.ts +178 -0
  69. package/src/tool/cutOptimizer/i18n/tr.ts +178 -0
  70. package/src/tool/cutOptimizer/i18n/zh.ts +178 -0
  71. package/src/tool/cutOptimizer/index.ts +17 -5
  72. package/src/tool/drillCalculator/i18n/de.ts +137 -0
  73. package/src/tool/drillCalculator/i18n/id.ts +137 -0
  74. package/src/tool/drillCalculator/i18n/it.ts +137 -0
  75. package/src/tool/drillCalculator/i18n/ja.ts +137 -0
  76. package/src/tool/drillCalculator/i18n/ko.ts +137 -0
  77. package/src/tool/drillCalculator/i18n/nl.ts +137 -0
  78. package/src/tool/drillCalculator/i18n/pl.ts +137 -0
  79. package/src/tool/drillCalculator/i18n/pt.ts +137 -0
  80. package/src/tool/drillCalculator/i18n/ru.ts +137 -0
  81. package/src/tool/drillCalculator/i18n/sv.ts +137 -0
  82. package/src/tool/drillCalculator/i18n/tr.ts +137 -0
  83. package/src/tool/drillCalculator/i18n/zh.ts +137 -0
  84. package/src/tool/drillCalculator/index.ts +17 -5
  85. package/src/tool/drillSharpener/i18n/de.ts +120 -0
  86. package/src/tool/drillSharpener/i18n/id.ts +120 -0
  87. package/src/tool/drillSharpener/i18n/it.ts +120 -0
  88. package/src/tool/drillSharpener/i18n/ja.ts +120 -0
  89. package/src/tool/drillSharpener/i18n/ko.ts +120 -0
  90. package/src/tool/drillSharpener/i18n/nl.ts +120 -0
  91. package/src/tool/drillSharpener/i18n/pl.ts +120 -0
  92. package/src/tool/drillSharpener/i18n/pt.ts +120 -0
  93. package/src/tool/drillSharpener/i18n/ru.ts +120 -0
  94. package/src/tool/drillSharpener/i18n/sv.ts +120 -0
  95. package/src/tool/drillSharpener/i18n/tr.ts +120 -0
  96. package/src/tool/drillSharpener/i18n/zh.ts +120 -0
  97. package/src/tool/drillSharpener/index.ts +17 -5
  98. package/src/tool/epoxyCalculator/i18n/de.ts +118 -0
  99. package/src/tool/epoxyCalculator/i18n/id.ts +118 -0
  100. package/src/tool/epoxyCalculator/i18n/it.ts +118 -0
  101. package/src/tool/epoxyCalculator/i18n/ja.ts +118 -0
  102. package/src/tool/epoxyCalculator/i18n/ko.ts +118 -0
  103. package/src/tool/epoxyCalculator/i18n/nl.ts +118 -0
  104. package/src/tool/epoxyCalculator/i18n/pl.ts +118 -0
  105. package/src/tool/epoxyCalculator/i18n/pt.ts +118 -0
  106. package/src/tool/epoxyCalculator/i18n/ru.ts +118 -0
  107. package/src/tool/epoxyCalculator/i18n/sv.ts +118 -0
  108. package/src/tool/epoxyCalculator/i18n/tr.ts +118 -0
  109. package/src/tool/epoxyCalculator/i18n/zh.ts +118 -0
  110. package/src/tool/epoxyCalculator/index.ts +15 -7
  111. package/src/tool/furnitureFit/i18n/de.ts +113 -0
  112. package/src/tool/furnitureFit/i18n/id.ts +113 -0
  113. package/src/tool/furnitureFit/i18n/it.ts +113 -0
  114. package/src/tool/furnitureFit/i18n/ja.ts +113 -0
  115. package/src/tool/furnitureFit/i18n/ko.ts +113 -0
  116. package/src/tool/furnitureFit/i18n/nl.ts +113 -0
  117. package/src/tool/furnitureFit/i18n/pl.ts +113 -0
  118. package/src/tool/furnitureFit/i18n/pt.ts +113 -0
  119. package/src/tool/furnitureFit/i18n/ru.ts +113 -0
  120. package/src/tool/furnitureFit/i18n/sv.ts +113 -0
  121. package/src/tool/furnitureFit/i18n/tr.ts +113 -0
  122. package/src/tool/furnitureFit/i18n/zh.ts +113 -0
  123. package/src/tool/furnitureFit/index.ts +17 -5
  124. package/src/tool/mortarCalculator/i18n/de.ts +129 -0
  125. package/src/tool/mortarCalculator/i18n/id.ts +129 -0
  126. package/src/tool/mortarCalculator/i18n/it.ts +129 -0
  127. package/src/tool/mortarCalculator/i18n/ja.ts +129 -0
  128. package/src/tool/mortarCalculator/i18n/ko.ts +129 -0
  129. package/src/tool/mortarCalculator/i18n/nl.ts +129 -0
  130. package/src/tool/mortarCalculator/i18n/pl.ts +129 -0
  131. package/src/tool/mortarCalculator/i18n/pt.ts +129 -0
  132. package/src/tool/mortarCalculator/i18n/ru.ts +129 -0
  133. package/src/tool/mortarCalculator/i18n/sv.ts +129 -0
  134. package/src/tool/mortarCalculator/i18n/tr.ts +129 -0
  135. package/src/tool/mortarCalculator/i18n/zh.ts +129 -0
  136. package/src/tool/mortarCalculator/index.ts +17 -5
  137. package/src/tool/passepartoutCalculator/i18n/de.ts +108 -0
  138. package/src/tool/passepartoutCalculator/i18n/id.ts +108 -0
  139. package/src/tool/passepartoutCalculator/i18n/it.ts +108 -0
  140. package/src/tool/passepartoutCalculator/i18n/ja.ts +108 -0
  141. package/src/tool/passepartoutCalculator/i18n/ko.ts +108 -0
  142. package/src/tool/passepartoutCalculator/i18n/nl.ts +108 -0
  143. package/src/tool/passepartoutCalculator/i18n/pl.ts +108 -0
  144. package/src/tool/passepartoutCalculator/i18n/pt.ts +108 -0
  145. package/src/tool/passepartoutCalculator/i18n/ru.ts +108 -0
  146. package/src/tool/passepartoutCalculator/i18n/sv.ts +108 -0
  147. package/src/tool/passepartoutCalculator/i18n/tr.ts +108 -0
  148. package/src/tool/passepartoutCalculator/i18n/zh.ts +108 -0
  149. package/src/tool/passepartoutCalculator/index.ts +17 -5
  150. package/src/tool/stairCalculator/i18n/de.ts +144 -0
  151. package/src/tool/stairCalculator/i18n/id.ts +144 -0
  152. package/src/tool/stairCalculator/i18n/it.ts +144 -0
  153. package/src/tool/stairCalculator/i18n/ja.ts +144 -0
  154. package/src/tool/stairCalculator/i18n/ko.ts +144 -0
  155. package/src/tool/stairCalculator/i18n/nl.ts +144 -0
  156. package/src/tool/stairCalculator/i18n/pl.ts +144 -0
  157. package/src/tool/stairCalculator/i18n/pt.ts +144 -0
  158. package/src/tool/stairCalculator/i18n/ru.ts +144 -0
  159. package/src/tool/stairCalculator/i18n/sv.ts +144 -0
  160. package/src/tool/stairCalculator/i18n/tr.ts +144 -0
  161. package/src/tool/stairCalculator/i18n/zh.ts +144 -0
  162. package/src/tool/stairCalculator/index.ts +17 -5
  163. package/src/tool/thermalExpansionCalculator/i18n/de.ts +132 -0
  164. package/src/tool/thermalExpansionCalculator/i18n/id.ts +130 -0
  165. package/src/tool/thermalExpansionCalculator/i18n/it.ts +130 -0
  166. package/src/tool/thermalExpansionCalculator/i18n/ja.ts +130 -0
  167. package/src/tool/thermalExpansionCalculator/i18n/ko.ts +130 -0
  168. package/src/tool/thermalExpansionCalculator/i18n/nl.ts +130 -0
  169. package/src/tool/thermalExpansionCalculator/i18n/pl.ts +130 -0
  170. package/src/tool/thermalExpansionCalculator/i18n/pt.ts +130 -0
  171. package/src/tool/thermalExpansionCalculator/i18n/ru.ts +130 -0
  172. package/src/tool/thermalExpansionCalculator/i18n/sv.ts +130 -0
  173. package/src/tool/thermalExpansionCalculator/i18n/tr.ts +130 -0
  174. package/src/tool/thermalExpansionCalculator/i18n/zh.ts +130 -0
  175. package/src/tool/thermalExpansionCalculator/index.ts +17 -5
  176. package/src/tool/voltageDropCalculator/i18n/de.ts +112 -0
  177. package/src/tool/voltageDropCalculator/i18n/id.ts +110 -0
  178. package/src/tool/voltageDropCalculator/i18n/it.ts +110 -0
  179. package/src/tool/voltageDropCalculator/i18n/ja.ts +110 -0
  180. package/src/tool/voltageDropCalculator/i18n/ko.ts +110 -0
  181. package/src/tool/voltageDropCalculator/i18n/nl.ts +110 -0
  182. package/src/tool/voltageDropCalculator/i18n/pl.ts +110 -0
  183. package/src/tool/voltageDropCalculator/i18n/pt.ts +110 -0
  184. package/src/tool/voltageDropCalculator/i18n/ru.ts +110 -0
  185. package/src/tool/voltageDropCalculator/i18n/sv.ts +110 -0
  186. package/src/tool/voltageDropCalculator/i18n/tr.ts +110 -0
  187. package/src/tool/voltageDropCalculator/i18n/zh.ts +110 -0
  188. package/src/tool/voltageDropCalculator/index.ts +17 -5
  189. package/src/types.ts +1 -1
@@ -0,0 +1,120 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { DrillSharpenerUI } from '../ui';
4
+
5
+ const slug = 'borrslipningsmaster';
6
+ const title = 'Borrslipningsmästare: Precisionsmått';
7
+ const description = 'Interaktiv guide för att slipa HSS-borrar. Digitalt mått på skärmen för kontroll av 118°- och 135°-vinklar. Beräknar RPM och diagnostiserar skärfel.';
8
+
9
+ const faqData = [
10
+ {
11
+ question: 'Kan jag lägga borren direkt på skärmen?',
12
+ answer: 'Ja, verktyget är utformat så att du kan vila borrens axel mot centrumlinjen på det digitala måttet och verifiera skärens symmetri direkt.',
13
+ },
14
+ {
15
+ question: 'Hur vet jag om släppningsvinkeln är korrekt?',
16
+ answer: 'När du vrider på borren måste den bakre delen av skäret vara synbart lägre. Om du ser att metallen glänser lika mycket över hela spetsen saknas släppning (destalonar).',
17
+ },
18
+ {
19
+ question: 'Vilket varvtal ska jag använda efter slipning?',
20
+ answer: 'Det beror på diametern; vår integrerade kalkylator ger dig exakt data baserat på det material du valde i det första steget.',
21
+ },
22
+ {
23
+ question: 'Vad är skillnaden mellan HSS och hårdmetall?',
24
+ answer: 'HSS (snabbstål) är billigare och mer slagtåligt. Hårdmetall tål högre hastigheter men är sprödare. För manuell slipning är HSS standard.',
25
+ },
26
+ {
27
+ question: 'Behöver jag speciell utrustning för att slipa?',
28
+ answer: 'En roterande slipsten med medelhög kornstorlek (120-150) räcker. Det viktiga är att hålla stenen balanserad och plan för att få jämna resultat.',
29
+ },
30
+ ];
31
+
32
+ const howToData = [
33
+ { name: 'Välj material', text: 'Välj den metall eller det material du ska borra i för att fastställa målvinkel och skärhastighet.' },
34
+ { name: 'Verifiera symmetri', text: 'Vila borren mot skärmen och se till att båda skären stämmer överens med de blå linjerna.' },
35
+ { name: 'Kontrollera klacken', text: 'Kontrollera visuellt att skärets baksida inte skaver mot arbetsstycket (släppningsvinkel).' },
36
+ { name: 'Beräkna RPM', text: 'Ange diameter och justera din borr till den rekommenderade hastigheten för det valda materialet.' },
37
+ ];
38
+
39
+ const faqSchema: WithContext<FAQPage> = {
40
+ '@context': 'https://schema.org',
41
+ '@type': 'FAQPage',
42
+ mainEntity: faqData.map((item) => ({
43
+ '@type': 'Question',
44
+ name: item.question,
45
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
46
+ })),
47
+ };
48
+
49
+ const howToSchema: WithContext<HowToThing> = {
50
+ '@context': 'https://schema.org',
51
+ '@type': 'HowTo',
52
+ name: title,
53
+ description,
54
+ step: howToData.map((step, i) => ({
55
+ '@type': 'HowToStep',
56
+ position: i + 1,
57
+ name: step.name,
58
+ text: step.text,
59
+ })),
60
+ };
61
+
62
+ const appSchema: WithContext<SoftwareApplication> = {
63
+ '@context': 'https://schema.org',
64
+ '@type': 'SoftwareApplication',
65
+ name: title,
66
+ description,
67
+ applicationCategory: 'UtilityApplication',
68
+ operatingSystem: 'All',
69
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
70
+ inLanguage: 'sv',
71
+ };
72
+
73
+ export const content: ToolLocaleContent<DrillSharpenerUI> = {
74
+ slug,
75
+ title,
76
+ description,
77
+ faqTitle: 'Vanliga frågor',
78
+ faq: faqData,
79
+ bibliographyTitle: 'Tekniska referenser',
80
+ bibliography: [
81
+ { name: 'Workshopmanual - Borrslipning (PDF)', url: 'https://sv.wikipedia.org/wiki/Spiralborr#' },
82
+ { name: 'Metallteknologi - Borrvinklar', url: 'https://www.google.com/search?q=borr+slipning+vinklar' },
83
+ ],
84
+ howTo: howToData,
85
+ schemas: [faqSchema, howToSchema, appSchema],
86
+ seo: [
87
+ { type: 'title', text: 'Borrslipningsmästare: Professionell teknik', level: 2 },
88
+ { type: 'paragraph', html: 'Borrslipning är en av de mest värdefulla färdigheterna i alla verkstäder. En korrekt slipad borr förbättrar hålets kvalitet, skyddar livslängden på dina elverktyg och garanterar operatörens säkerhet.' },
89
+ { type: 'title', text: 'Slipningens pelare: Spetsvinkel', level: 3 },
90
+ { type: 'paragraph', html: 'Spetsvinkeln definierar hur borren angriper materialet. Standardvinklar är 118° för mjuka stål, 135° för rostfritt och 140° för hårda stål. Varje material kräver en specifik vinkel för att maximera inträngningen utan att kompromissa med hållfastheten.' },
91
+ { type: 'title', text: 'Den stora glömda faktorn: Släppningsvinkel', level: 3 },
92
+ { type: 'paragraph', html: 'Det vanligaste felet är att ignorera släppningsvinkeln. Om skärets baksida är plan kommer borren bara att skava, vilket genererar extrem värme. Lösningen är att slipa ner den bakre delen av skäret något.' },
93
+ ],
94
+ ui: {
95
+ labelMaterial: 'Arbetsmaterial',
96
+ matSteel: 'Stål',
97
+ matInox: 'Rostfritt',
98
+ matHard: 'Hårda',
99
+ matBrass: 'Mässing',
100
+ matPlastic: 'Plast',
101
+ matWood: 'Trä',
102
+ labelDiameter: 'Borrdiameter (mm)',
103
+ unitMm: 'mm',
104
+ btnMinus: '-',
105
+ btnPlus: '+',
106
+ labelVelocity: 'Hastighet',
107
+ unitRpm: 'RPM',
108
+ labelCooling: 'Skärning',
109
+ btnDiagnosis: 'Skär den inte bra? Diagnos',
110
+ diagTitle: 'Feldiagnos',
111
+ diagClose: 'Stäng',
112
+ diagIssue1: '1. Ryker och går inte igenom',
113
+ diagIssue1Desc: 'Släppningsvinkel saknas. Metallen bakom skäret skaver mot materialet. Slipa ner baksidan så att skäret är den högsta punkten.',
114
+ diagIssue2: '2. Excentriskt eller för stort hål',
115
+ diagIssue2Desc: 'Spetsen är inte centrerad. Skären har olika längder. Se till att spetsen nuddar exakt mitten av måttet.',
116
+ diagIssue3: '3. Brända skär (blåa)',
117
+ diagIssue3Desc: 'För högt varvtal. Kontrollera verktygets RPM-beräkning för denna diameter och detta material.',
118
+ gaugeInstruction: 'VILA AXELN MOT DEN VERTIKALA LINJEN',
119
+ },
120
+ };
@@ -0,0 +1,120 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { DrillSharpenerUI } from '../ui';
4
+
5
+ const slug = 'usta-matkap-bileme';
6
+ const title = 'Usta Matkap Bileme: Hassas Mastar';
7
+ const description = 'HSS matkap uçlarını bilemek için etkileşimli kılavuz. 118° ve 135° açılarını kontrol etmek için ekranda dijital mastar. RPM hesaplar ve kesme hatalarını teşhis eder.';
8
+
9
+ const faqData = [
10
+ {
11
+ question: 'Matkabı doğrudan ekranın üzerine koyabilir miyim?',
12
+ answer: 'Evet, araç, matkap şaftını dijital mastarın merkez hattına dayamanız ve kesici ağızların simetrisini doğrudan doğrulamanız için tasarlanmıştır.',
13
+ },
14
+ {
15
+ question: 'Boşluk açısının (serbest açı) doğru olduğunu nasıl anlarım?',
16
+ answer: 'Matkabı döndürdüğünüzde, kesici ağzın arka kısmı belirgin şekilde daha alçakta görünmelidir. Ucun tamamında metalin eşit şekilde parladığını görüyorsanız, boşluk açısı (destalonar) eksiktir.',
17
+ },
18
+ {
19
+ question: 'Bileme işleminden sonra hangi devri kullanmalıyım?',
20
+ answer: 'Çapa bağlıdır; entegre hesaplayıcımız, ilk adımda seçtiğiniz malzemeye göre size tam veriyi verecektir.',
21
+ },
22
+ {
23
+ question: 'HSS ile Karbür arasındaki fark nedir?',
24
+ answer: 'HSS (Yüksek Hız Çeliği) daha ekonomik ve darbelere dayanıklıdır. Karbür daha yüksek hızlara dayanır ancak daha kırılgandır. Manuel bileme için HSS standarttır.',
25
+ },
26
+ {
27
+ question: 'Bilemek için özel bir ekipmana ihtiyacım var mı?',
28
+ answer: 'Orta kumlu (120-150) dönen bir zımpara taşı yeterlidir. Önemli olan, tutarlı sonuçlar elde etmek için taşın dengeli ve düz tutulmasıdır.',
29
+ },
30
+ ];
31
+
32
+ const howToData = [
33
+ { name: 'Malzeme Seçin', text: 'Hedef açıyı ve kesme hızını belirlemek için deleceğiniz metali veya malzemeyi seçin.' },
34
+ { name: 'Simetriyi Doğrulayın', text: 'Matkabı ekrana dayayın ve her iki kesici ağzın da mavi çizgilerle eşleştiğinden emin olun.' },
35
+ { name: 'Topuk Kısmını Kontrol Edin', text: 'Kesici ağzın arka kısmının iş parçasına sürtünmediğini görsel olarak kontrol edin (boşluk açısı).' },
36
+ { name: 'RPM Hesaplayın', text: 'Çapı girin ve matkabınızı seçilen malzeme için önerilen hıza ayarlayın.' },
37
+ ];
38
+
39
+ const faqSchema: WithContext<FAQPage> = {
40
+ '@context': 'https://schema.org',
41
+ '@type': 'FAQPage',
42
+ mainEntity: faqData.map((item) => ({
43
+ '@type': 'Question',
44
+ name: item.question,
45
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
46
+ })),
47
+ };
48
+
49
+ const howToSchema: WithContext<HowToThing> = {
50
+ '@context': 'https://schema.org',
51
+ '@type': 'HowTo',
52
+ name: title,
53
+ description,
54
+ step: howToData.map((step, i) => ({
55
+ '@type': 'HowToStep',
56
+ position: i + 1,
57
+ name: step.name,
58
+ text: step.text,
59
+ })),
60
+ };
61
+
62
+ const appSchema: WithContext<SoftwareApplication> = {
63
+ '@context': 'https://schema.org',
64
+ '@type': 'SoftwareApplication',
65
+ name: title,
66
+ description,
67
+ applicationCategory: 'UtilityApplication',
68
+ operatingSystem: 'All',
69
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
70
+ inLanguage: 'tr',
71
+ };
72
+
73
+ export const content: ToolLocaleContent<DrillSharpenerUI> = {
74
+ slug,
75
+ title,
76
+ description,
77
+ faqTitle: 'Sıkça Sorulan Sorular',
78
+ faq: faqData,
79
+ bibliographyTitle: 'Teknik Referanslar',
80
+ bibliography: [
81
+ { name: 'Atölye El Kitabı - Matkap Bileme (PDF)', url: 'https://tr.wikipedia.org/wiki/Matkap_ucu#Bileme' },
82
+ { name: 'Metal Teknolojisi - Matkap Açıları', url: 'https://www.google.com/search?q=matkap+bileme+acilari' },
83
+ ],
84
+ howTo: howToData,
85
+ schemas: [faqSchema, howToSchema, appSchema],
86
+ seo: [
87
+ { type: 'title', text: 'Usta Matkap Bileme: Profesyonel Teknik', level: 2 },
88
+ { type: 'paragraph', html: 'Matkap ucu bileme, her atölyedeki en değerli becerilerden biridir. Doğru bilenmiş bir matkap, delik kalitesini artırır, elektrikli aletlerinizin ömrünü korur ve operatör güvenliğini sağlar.' },
89
+ { type: 'title', text: 'Bilemenin Temelleri: Uç Açısı', level: 3 },
90
+ { type: 'paragraph', html: 'Uç açısı, matkabın malzemeye nasıl saldırdığını tanımlar. Standart açılar yumuşak çelikler için 118°, paslanmaz için 135° ve sert çelikler için 140°\'dir. Her malzeme, dayanıklılıktan ödün vermeden penetrasyonu maksimize etmek için farklı bir açı gerektirir.' },
91
+ { type: 'title', text: 'En Çok Unutulan: Boşluk Açısı', level: 3 },
92
+ { type: 'paragraph', html: 'En yaygın hata, boşluk açısını veya serbest açıyı görmezden gelmektir. Kesici ağzın arka yüzü düzse, matkap sadece sürtecek ve aşırı ısı üretecektir. Çözüm, ağzın arka kısmını hafifçe aşağıya doğru taşlamaktır.' },
93
+ ],
94
+ ui: {
95
+ labelMaterial: 'İş malzemesi',
96
+ matSteel: 'Çelik',
97
+ matInox: 'Paslanmaz',
98
+ matHard: 'Sertler',
99
+ matBrass: 'Pirinç',
100
+ matPlastic: 'Plastik',
101
+ matWood: 'Ahşap',
102
+ labelDiameter: 'Matkap çapı (mm)',
103
+ unitMm: 'mm',
104
+ btnMinus: '-',
105
+ btnPlus: '+',
106
+ labelVelocity: 'Hız',
107
+ unitRpm: 'RPM',
108
+ labelCooling: 'Kesim',
109
+ btnDiagnosis: 'İyi kesmiyor mu? Teşhis',
110
+ diagTitle: 'Arıza Teşhisi',
111
+ diagClose: 'Kapat',
112
+ diagIssue1: '1. Duman çıkarıyor ve delip geçmiyor',
113
+ diagIssue1Desc: 'Boşluk Açısı eksik. Kesici ağzın arkasındaki metal parçaya sürtüyor. Ağzın en yüksek nokta olması için arka kısmı aşağıya doğru taşlayın.',
114
+ diagIssue2: '2. Eksantrik veya daha büyük delik',
115
+ diagIssue2Desc: 'Uç merkezlenmemiş. Kesici ağızların uzunlukları farklı. Ucun mastarın tam merkezine değdiğinden emin olun.',
116
+ diagIssue3: '3. Kesici ağızlar yanmış (Mavi)',
117
+ diagIssue3Desc: 'Aşırı hız. Bu çap ve malzeme için aletin RPM hesaplamasını kontrol edin.',
118
+ gaugeInstruction: 'ŞAFTI DİKEY ÇİZGİYE DAYAYIN',
119
+ },
120
+ };
@@ -0,0 +1,120 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { DrillSharpenerUI } from '../ui';
4
+
5
+ const slug = 'drill-sharpening-master';
6
+ const title = '钻头修磨大师:精密数字规';
7
+ const description = 'HSS 高速钢钻头修磨交互指南。屏幕数字规可校验 118° 和 135° 角度。计算 RPM 并诊断切削错误。';
8
+
9
+ const faqData = [
10
+ {
11
+ question: '我可以将钻头直接放在屏幕上吗?',
12
+ answer: '可以,该工具设计用于让您将钻头轴线靠在数字规的中心线上,直接校验两个切削刃的对称性。',
13
+ },
14
+ {
15
+ question: '如何知道后角(切削间隙)是否正确?',
16
+ answer: '转动钻头时,切削刃的后部必须明显低于刃口。如果您看到整个尖端金属的光泽是一致的,说明缺少后角(未铲背)。',
17
+ },
18
+ {
19
+ question: '修磨后应使用多大转速?',
20
+ answer: '取决于直径;我们的内置计算器会根据您在第一步中选择的材料给出确切数据。',
21
+ },
22
+ {
23
+ question: 'HSS 和硬质合金(钨钢)有什么区别?',
24
+ answer: 'HSS(高速钢)更经济且耐冲击。硬质合金能承受更高速度但更脆。对于手工修磨,HSS 是标准选择。',
25
+ },
26
+ {
27
+ question: '修磨需要特殊设备吗?',
28
+ answer: '一台目数在中等(120-150 目)的旋转砂轮机就足够了。重要的是保持砂轮平衡且平整,以获得一致的效果。',
29
+ },
30
+ ];
31
+
32
+ const howToData = [
33
+ { name: '选择材料', text: '选择您要钻孔的金属或材料,以确定目标角度和切削速度。' },
34
+ { name: '校验对称性', text: '将钻头靠在屏幕上,确保两个切削刃都与蓝色线条重合。' },
35
+ { name: '检查后角', text: '目测检查切削刃后部是否会摩擦工件(检查后角/铲背)。' },
36
+ { name: '计算 RPM', text: '输入直径并将钻床调整至所选材料的推荐转速。' },
37
+ ];
38
+
39
+ const faqSchema: WithContext<FAQPage> = {
40
+ '@context': 'https://schema.org',
41
+ '@type': 'FAQPage',
42
+ mainEntity: faqData.map((item) => ({
43
+ '@type': 'Question',
44
+ name: item.question,
45
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
46
+ })),
47
+ };
48
+
49
+ const howToSchema: WithContext<HowToThing> = {
50
+ '@context': 'https://schema.org',
51
+ '@type': 'HowTo',
52
+ name: title,
53
+ description,
54
+ step: howToData.map((step, i) => ({
55
+ '@type': 'HowToStep',
56
+ position: i + 1,
57
+ name: step.name,
58
+ text: step.text,
59
+ })),
60
+ };
61
+
62
+ const appSchema: WithContext<SoftwareApplication> = {
63
+ '@context': 'https://schema.org',
64
+ '@type': 'SoftwareApplication',
65
+ name: title,
66
+ description,
67
+ applicationCategory: 'UtilityApplication',
68
+ operatingSystem: 'All',
69
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
70
+ inLanguage: 'zh',
71
+ };
72
+
73
+ export const content: ToolLocaleContent<DrillSharpenerUI> = {
74
+ slug,
75
+ title,
76
+ description,
77
+ faqTitle: '常见问题',
78
+ faq: faqData,
79
+ bibliographyTitle: '技术参考',
80
+ bibliography: [
81
+ { name: '车间手册 - 钻头修磨 (PDF)', url: 'https://zh.wikipedia.org/wiki/钻头#修磨' },
82
+ { name: '金属工艺学 - 钻头角度', url: 'https://www.google.com/search?q=钻头+修磨+角度' },
83
+ ],
84
+ howTo: howToData,
85
+ schemas: [faqSchema, howToSchema, appSchema],
86
+ seo: [
87
+ { type: 'title', text: '钻头修磨大师:专业技巧', level: 2 },
88
+ { type: 'paragraph', html: '钻头修磨是任何车间中最有价值的技能之一。正确修磨的钻头可以提高孔的质量,保护电动工具的使用寿命,并确保操作人员的安全。' },
89
+ { type: 'title', text: '修磨的核心:顶角', level: 3 },
90
+ { type: 'paragraph', html: '顶角决定了钻头如何切入材料。标准角度为:软钢 118°,不锈钢 135°,硬钢 140°。每种材料需要不同的角度来最大化穿透力而不牺牲强度。' },
91
+ { type: 'title', text: '最易遗忘的点:后角', level: 3 },
92
+ { type: 'paragraph', html: '最常见的错误是忽略了后角或铲背。如果切削刃的背面是平的,钻头只会产生摩擦并产生极高的热量。解决方法是轻轻磨掉主切削刃背面的金属。' },
93
+ ],
94
+ ui: {
95
+ labelMaterial: '加工材料',
96
+ matSteel: '普通钢',
97
+ matInox: '不锈钢',
98
+ matHard: '硬钢',
99
+ matBrass: '黄铜',
100
+ matPlastic: '塑料',
101
+ matWood: '木材',
102
+ labelDiameter: '钻头直径 (mm)',
103
+ unitMm: 'mm',
104
+ btnMinus: '-',
105
+ btnPlus: '+',
106
+ labelVelocity: '速度',
107
+ unitRpm: 'RPM',
108
+ labelCooling: '切削',
109
+ btnDiagnosis: '切削不顺?诊断',
110
+ diagTitle: '故障诊断',
111
+ diagClose: '关闭',
112
+ diagIssue1: '1. 冒烟且无法钻透',
113
+ diagIssue1Desc: '缺少后角。主切削刃背面的金属摩擦工件。修磨背面,使切削刃成为最高点。',
114
+ diagIssue2: '2. 偏心或孔径变大',
115
+ diagIssue2Desc: '钻尖未居中。两侧切削刃长度不同。确保钻尖触及数字规的精确中心。',
116
+ diagIssue3: '3. 刃口烧坏(发蓝)',
117
+ diagIssue3Desc: '转速过高。请检查计算出的针对该直径和材料的 RPM。',
118
+ gaugeInstruction: '将钻轴靠在垂直线上',
119
+ },
120
+ };
@@ -11,14 +11,26 @@ export {
11
11
  DrillSharpenerBibliography,
12
12
  };
13
13
 
14
- const es = async () => (await import('./i18n/es')).content;
15
- const en = async () => (await import('./i18n/en')).content;
16
- const fr = async () => (await import('./i18n/fr')).content;
17
-
18
14
  export const drillSharpener: DiyToolEntry<DrillSharpenerUI> = {
19
15
  id: 'drill-sharpener',
20
16
  icons: { bg: 'mdi:tools', fg: 'mdi:speedometer' },
21
- i18n: { es, en, fr },
17
+ i18n: {
18
+ de: () => import('./i18n/de').then((m) => m.content),
19
+ en: () => import('./i18n/en').then((m) => m.content),
20
+ es: () => import('./i18n/es').then((m) => m.content),
21
+ fr: () => import('./i18n/fr').then((m) => m.content),
22
+ id: () => import('./i18n/id').then((m) => m.content),
23
+ it: () => import('./i18n/it').then((m) => m.content),
24
+ ja: () => import('./i18n/ja').then((m) => m.content),
25
+ ko: () => import('./i18n/ko').then((m) => m.content),
26
+ nl: () => import('./i18n/nl').then((m) => m.content),
27
+ pl: () => import('./i18n/pl').then((m) => m.content),
28
+ pt: () => import('./i18n/pt').then((m) => m.content),
29
+ ru: () => import('./i18n/ru').then((m) => m.content),
30
+ sv: () => import('./i18n/sv').then((m) => m.content),
31
+ tr: () => import('./i18n/tr').then((m) => m.content),
32
+ zh: () => import('./i18n/zh').then((m) => m.content),
33
+ },
22
34
  };
23
35
 
24
36
  export const DRILL_SHARPENER_TOOL: ToolDefinition = {
@@ -0,0 +1,118 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { EpoxyCalculatorUI } from '../ui';
4
+
5
+ const slug = 'epoxidharz-rechner';
6
+ const title = 'Epoxidharz Rechner: Mischung und Volumen';
7
+ const description = 'Berechnen Sie die exakte Menge an Epoxidharz und Härter für Ihre Projekte. Vermeiden Sie Verschwendung bei River Tables, Schmuck und Gussformen.';
8
+
9
+ const faqData = [
10
+ {
11
+ question: 'Warum ist das exakte Mischungsverhältnis bei Harz so wichtig?',
12
+ answer: 'Im Gegensatz zu anderen Mischungen trocknet Epoxidharz nicht durch Verdunstung, sondern durch eine chemische Reaktion (Polymerisation). Wenn Harz oder Härter im Übermaß vorhanden sind, bleibt die Reaktion unvollständig, was zu klebrigen, weichen Stellen oder dauerhaften Blasen führt.',
13
+ },
14
+ {
15
+ question: 'Was ist das Verhältnis nach Gewicht vs. Volumen?',
16
+ answer: 'Viele Harze werden im Volumenverhältnis 2:1 gemischt, aber nach Gewicht oft 100:45, da der Härter meist eine andere Dichte hat. Verwenden Sie immer die vom Hersteller angegebene Skala und nutzen Sie nach Möglichkeit eine Digitalwaage für maximale Präzision.',
17
+ },
18
+ {
19
+ question: 'Wie vermeide ich Blasen beim Mischen?',
20
+ answer: 'Mischen Sie langsam mit konstanten kreisenden Bewegungen für mindestens 3 Minuten und kratzen Sie dabei die Wände des Bechers gut ab. Lassen Sie die Mischung vor dem Gießen ein paar Minuten ruhen, damit Blasen an die Oberfläche steigen können.',
21
+ },
22
+ {
23
+ question: 'Was ist die Topfzeit (Pot Life)?',
24
+ answer: 'Dies ist die Zeit, die Sie zur Verarbeitung der Mischung haben, bevor sie beginnt hart zu werden (zu gelieren). Im Sommer oder bei großen Volumina reduziert sich diese Zeit drastisch aufgrund der exothermen Reaktion (Wärmeentwicklung).',
25
+ },
26
+ ];
27
+
28
+ const howToData = [
29
+ { name: 'Formabmessungen messen', text: 'Messen Sie Länge, Breite und Tiefe (Dicke) des Bereichs, den Sie mit Harz füllen möchten.' },
30
+ { name: 'Mischungsverhältnis eingeben', text: 'Prüfen Sie auf dem Etikett Ihres Produkts, ob das Verhältnis 1:1, 2:1 oder 3:1 ist und ob es auf Gewicht oder Volumen basiert.' },
31
+ { name: 'Komponenten abwiegen', text: 'Gießen Sie zuerst Komponente A (Harz) und dann B (Härter) in einen sauberen Behälter auf einer Digitalwaage.' },
32
+ { name: 'Technisches Mischen', text: 'Rühren Sie vorsichtig um, bis die Mischung völlig transparent ist und keine "Schlieren" unterschiedlicher Dichte mehr zu sehen sind.' },
33
+ ];
34
+
35
+ const faqSchema: WithContext<FAQPage> = {
36
+ '@context': 'https://schema.org',
37
+ '@type': 'FAQPage',
38
+ mainEntity: faqData.map((item) => ({
39
+ '@type': 'Question',
40
+ name: item.question,
41
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
42
+ })),
43
+ };
44
+
45
+ const howToSchema: WithContext<HowToThing> = {
46
+ '@context': 'https://schema.org',
47
+ '@type': 'HowTo',
48
+ name: title,
49
+ description,
50
+ step: howToData.map((step, i) => ({
51
+ '@type': 'HowToStep',
52
+ position: i + 1,
53
+ name: step.name,
54
+ text: step.text,
55
+ })),
56
+ };
57
+
58
+ const appSchema: WithContext<SoftwareApplication> = {
59
+ '@context': 'https://schema.org',
60
+ '@type': 'SoftwareApplication',
61
+ name: title,
62
+ description,
63
+ applicationCategory: 'UtilityApplication',
64
+ operatingSystem: 'All',
65
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
66
+ inLanguage: 'de',
67
+ };
68
+
69
+ export const content: ToolLocaleContent<EpoxyCalculatorUI> = {
70
+ slug,
71
+ title,
72
+ description,
73
+ faqTitle: 'Häufig gestellte Fragen',
74
+ faq: faqData,
75
+ bibliographyTitle: 'Technische Referenzen',
76
+ bibliography: [
77
+ { name: 'TotalBoat - Support Center und technische Leitfäden', url: 'https://www.totalboat.com/pages/support' },
78
+ { name: 'ArtResin - FAQ und Gebrauchsanweisung', url: 'https://www.artresin.com/pages/artresin-faq' },
79
+ ],
80
+ howTo: howToData,
81
+ schemas: [faqSchema, howToSchema, appSchema],
82
+ seo: [
83
+ { type: 'title', text: 'Leitfaden zur Berechnung und Mischung von Epoxidharz', level: 2 },
84
+ { type: 'paragraph', html: 'Epoxidharz ist keine Farbe, die durch Verdunstung trocknet; es ist eine komplexe <strong>exotherme chemische Reaktion</strong>. Die Magie geschieht, wenn sich Epoxidmoleküle mit Polyamidmolekülen zu einem kristallinen, festen duroplastischen Polymer verketten.' },
85
+ { type: 'paragraph', html: 'Der Unterschied zwischen einem langlebigen Kunstwerk und einer klebrigen Katastrophe liegt in der <strong>exakten Stöchiometrie</strong>. Ein Fehler von nur 5 % im Mischungsverhältnis kann die Aushärtung dauerhaft verhindern. Dieses Tool eliminiert mathematische Vermutungen, sodass Sie sich auf das Erschaffen konzentrieren können.' },
86
+ { type: 'grid', columns: [
87
+ { type: 'card', icon: 'mdi:scale-balance', title: 'Volumen oder Gewicht?', html: '<p>Der häufigste Fehler von Anfängern ist die Annahme, dass 100 ml 100 g wiegen. <strong>Harz ist dichter als Härter.</strong></p><p>Wenn das Datenblatt Ihres Produkts "100:50 nach Gewicht" angibt, ist das NICHT dasselbe wie "2:1 nach Volumen". Dieser Rechner arbeitet mit dem <strong>Volumen</strong> (V = L × B × H), dem Standard für das Füllen von Formen.</p>' },
88
+ { type: 'card', icon: 'mdi:water-percent', title: 'Gängige Verhältnisse', html: '<ul><li><strong>1:1</strong> — Beschichtungen, Lacke und Schnellkleber.</li><li><strong>2:1</strong> — Standard. River Tables, Schmuck und mittlere Abgüsse.</li><li><strong>3:1</strong> — Industrieböden und hochharte strukturelle Laminate.</li></ul>' },
89
+ ]},
90
+ { type: 'title', text: 'Sicherheitsprotokoll und Best Practices', level: 2 },
91
+ { type: 'grid', columns: [
92
+ { type: 'card', icon: 'mdi:thermometer', title: 'Überlebenswichtige Temperatur', html: '<p>Arbeiten Sie immer zwischen <strong>21°C und 25°C</strong>. Kälte kann die Reaktion stoppen und das Teil trüb machen. Übermäßige Hitze beschleunigt die exotherme Reaktion gefährlich ("Flash Cure").</p>' },
93
+ { type: 'card', icon: 'mdi:cup-outline', title: 'Zwei Becher Methode', html: '<p>Vertrauen Sie nicht auf eine einzige Mischung. Kratzen Sie die Seiten und den Boden gut ab, gießen Sie die Mischung in einen <strong>zweiten sauberen Becher</strong> und mischen Sie erneut. Dies stellt sicher, dass kein unkatalysiertes Material zurückbleibt.</p>' },
94
+ ]},
95
+ ],
96
+ ui: {
97
+ shapeRect: 'Rechteckig',
98
+ shapeCylinder: 'Zylindrisch',
99
+ shapeSphere: 'Sphärisch',
100
+ labelLength: 'Länge (cm)',
101
+ labelWidth: 'Breite (cm)',
102
+ labelDiameter: 'Durchmesser (cm)',
103
+ labelDepth: 'Tiefe (cm)',
104
+ labelRatio: 'Mischungsverhältnis (Gewicht/Volumen)',
105
+ labelCustomRatio: 'Benutzerdefiniertes Verhältnis (A:B)',
106
+ labelResinA: 'Harz (A)',
107
+ labelHardenerB: 'Härter (B)',
108
+ labelWasteTitle: 'Sicherheitsmarge',
109
+ labelWasteDesc: '5% extra für Verluste hinzufügen',
110
+ labelTotalVolume: 'Gesamtvolumen',
111
+ labelPartA: 'Teil A (Harz)',
112
+ labelPartB: 'Teil B (Härter)',
113
+ labelVisualization: 'Visualisierung',
114
+ shapeRectLabel: 'Rechteckiger Block',
115
+ shapeCylinderLabel: 'Zylinder / Runde Form',
116
+ shapeSphereLabel: 'Vollständige Kugel',
117
+ },
118
+ };
@@ -0,0 +1,118 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { EpoxyCalculatorUI } from '../ui';
4
+
5
+ const slug = 'kalkulator-resin-epoksi';
6
+ const title = 'Kalkulator Resin Epoksi: Campuran dan Volume Tepat';
7
+ const description = 'Hitung jumlah tepat resin epoksi dan katalis yang dibutuhkan untuk proyek Anda. Hindari pemborosan pada meja river, perhiasan, dan cetakan.';
8
+
9
+ const faqData = [
10
+ {
11
+ question: 'Mengapa proporsi yang tepat sangat penting dalam resin?',
12
+ answer: 'Berbeda dengan campuran lain, resin epoksi tidak kering melalui penguapan, melainkan melalui reaksi kimia (polimerisasi). Jika ada kelebihan resin atau katalis, reaksi tidak akan sempurna, meninggalkan bagian yang lengket, lunak, atau dengan gelembung permanen.',
13
+ },
14
+ {
15
+ question: 'Apa itu perbandingan berat vs volume?',
16
+ answer: 'Banyak resin dicampur 2:1 dalam volume tetapi 100:45 dalam berat karena katalis biasanya lebih padat. Gunakan selalu skala yang ditentukan pabrikan dan, jika mungkin, gunakan timbangan digital demi presisi maksimal.',
17
+ },
18
+ {
19
+ question: 'Bagaimana cara menghindari gelembung saat mengaduk?',
20
+ answer: 'Aduk perlahan dengan gerakan memutar konstan selama setidaknya 3 menit, bersihkan dinding wadah dengan baik. Diamkan campuran selama beberapa menit sebelum dituang agar gelembung naik ke permukaan.',
21
+ },
22
+ {
23
+ question: 'Apa itu masa pakai (Pot Life)?',
24
+ answer: 'Adalah waktu yang Anda miliki untuk mengerjakan campuran sebelum mulai mengeras (mengental). Di musim panas atau dalam volume besar, waktu ini berkurang drastis karena reaksi eksotermik (menghasilkan panas).',
25
+ },
26
+ ];
27
+
28
+ const howToData = [
29
+ { name: 'Ukur dimensi cetakan', text: 'Ukur panjang, lebar, dan kedalaman (tebal) area yang ingin Anda isi dengan resin.' },
30
+ { name: 'Masukkan rasio campuran', text: 'Periksa label produk Anda apakah campurannya 1:1, 2:1, atau 3:1 dan apakah berdasarkan berat atau volume.' },
31
+ { name: 'Timbang komponen', text: 'Tuang komponen A (resin) terlebih dahulu lalu B (katalis) ke dalam wadah bersih di atas timbangan digital.' },
32
+ { name: 'Pengadukan teknis', text: 'Aduk perlahan hingga campuran benar-benar transparan dan tidak terlihat "alur" dari kepadatan yang berbeda.' },
33
+ ];
34
+
35
+ const faqSchema: WithContext<FAQPage> = {
36
+ '@context': 'https://schema.org',
37
+ '@type': 'FAQPage',
38
+ mainEntity: faqData.map((item) => ({
39
+ '@type': 'Question',
40
+ name: item.question,
41
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
42
+ })),
43
+ };
44
+
45
+ const howToSchema: WithContext<HowToThing> = {
46
+ '@context': 'https://schema.org',
47
+ '@type': 'HowTo',
48
+ name: title,
49
+ description,
50
+ step: howToData.map((step, i) => ({
51
+ '@type': 'HowToStep',
52
+ position: i + 1,
53
+ name: step.name,
54
+ text: step.text,
55
+ })),
56
+ };
57
+
58
+ const appSchema: WithContext<SoftwareApplication> = {
59
+ '@context': 'https://schema.org',
60
+ '@type': 'SoftwareApplication',
61
+ name: title,
62
+ description,
63
+ applicationCategory: 'UtilityApplication',
64
+ operatingSystem: 'All',
65
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
66
+ inLanguage: 'id',
67
+ };
68
+
69
+ export const content: ToolLocaleContent<EpoxyCalculatorUI> = {
70
+ slug,
71
+ title,
72
+ description,
73
+ faqTitle: 'Pertanyaan Umum',
74
+ faq: faqData,
75
+ bibliographyTitle: 'Referensi Teknis',
76
+ bibliography: [
77
+ { name: 'TotalBoat - Pusat Dukungan dan Panduan Teknis', url: 'https://www.totalboat.com/pages/support' },
78
+ { name: 'ArtResin - FAQ dan Panduan Penggunaan', url: 'https://www.artresin.com/pages/artresin-faq' },
79
+ ],
80
+ howTo: howToData,
81
+ schemas: [faqSchema, howToSchema, appSchema],
82
+ seo: [
83
+ { type: 'title', text: 'Panduan Perhitungan dan Pengadukan Resin Epoksi', level: 2 },
84
+ { type: 'paragraph', html: 'Resin epoksi bukan cat yang kering karena penguapan; ini adalah <strong>reaksi kimia eksotermik</strong> yang kompleks. Keajaiban terjadi ketika molekul epoksida berikatan dengan molekul poliamina untuk membentuk polimer termoset padat kristalin.' },
85
+ { type: 'paragraph', html: 'Perbedaan antara karya seni yang tahan lama dan kegagalan yang lengket terletak pada <strong>stoikiometri yang tepat</strong>. Kesalahan bahkan hanya 5% dalam rasio campuran dapat menghambat pengerasan secara permanen. Alat ini menghilangkan tebakan matematis, memungkinkan Anda fokus pada kreasi.' },
86
+ { type: 'grid', columns: [
87
+ { type: 'card', icon: 'mdi:scale-balance', title: 'Volume atau Berat?', html: '<p>Kesalahan #1 pemula adalah menganggap bahwa 100ml beratnya 100g. <strong>Resin lebih padat daripada pengeras.</strong></p><p>Jika data teknis produk Anda menyebutkan "100:50 berdasarkan berat", itu TIDAK sama dengan "2:1 berdasarkan volume". Kalkulator ini bekerja dengan <strong>Volume</strong> (V = L × W × H), yang merupakan standar untuk mengisi cetakan.</p>' },
88
+ { type: 'card', icon: 'mdi:water-percent', title: 'Rasio Umum', html: '<ul><li><strong>1:1</strong> — Pelapis, vernis, dan pelekat cepat.</li><li><strong>2:1</strong> — Standar. Meja river, perhiasan, dan cetakan sedang.</li><li><strong>3:1</strong> — Lantai industri dan laminasi struktural kekerasan tinggi.</li></ul>' },
89
+ ]},
90
+ { type: 'title', text: 'Protokol Keamanan dan Praktik Terbaik', level: 2 },
91
+ { type: 'grid', columns: [
92
+ { type: 'card', icon: 'mdi:thermometer', title: 'Suhu Vital', html: '<p>Bekerjalah selalu antara <strong>21°C hingga 25°C</strong>. Suhu dingin dapat menghentikan reaksi, membuat benda menjadi keruh. Panas berlebih mempercepat reaksi eksotermik secara berbahaya ("flash cure").</p>' },
93
+ { type: 'card', icon: 'mdi:cup-outline', title: 'Teknik Dua Wadah', html: '<p>Jangan mengandalkan satu pengadukan. Bersihkan sisi dan dasar wadah dengan baik, tuang campuran ke <strong>wadah bersih kedua</strong> dan aduk kembali. Ini memastikan tidak ada bahan yang tidak terkatalis tertinggal.</p>' },
94
+ ]},
95
+ ],
96
+ ui: {
97
+ shapeRect: 'Persegi Panjang',
98
+ shapeCylinder: 'Silinder',
99
+ shapeSphere: 'Bola',
100
+ labelLength: 'Panjang (cm)',
101
+ labelWidth: 'Lebar (cm)',
102
+ labelDiameter: 'Diameter (cm)',
103
+ labelDepth: 'Kedalaman (cm)',
104
+ labelRatio: 'Rasio Campuran (Berat/Volume)',
105
+ labelCustomRatio: 'Gunakan rasio kustom (A:B)',
106
+ labelResinA: 'Resin (A)',
107
+ labelHardenerB: 'Pengeras (B)',
108
+ labelWasteTitle: 'Margin Keamanan',
109
+ labelWasteDesc: 'Tambah 5% ekstra untuk kehilangan',
110
+ labelTotalVolume: 'Volume Total',
111
+ labelPartA: 'Bagian A (Resin)',
112
+ labelPartB: 'Bagian B (Katalis)',
113
+ labelVisualization: 'Visualisasi',
114
+ shapeRectLabel: 'Blok Persegi Panjang',
115
+ shapeCylinderLabel: 'Silinder / Cetakan Bulat',
116
+ shapeSphereLabel: 'Bola Penuh',
117
+ },
118
+ };