@jjlmoya/utils-alcohol 1.14.0 → 1.16.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 (78) hide show
  1. package/package.json +2 -1
  2. package/src/category/i18n/id.ts +28 -0
  3. package/src/category/i18n/sv.ts +19 -0
  4. package/src/category/index.ts +2 -0
  5. package/src/tests/faq_count.test.ts +12 -10
  6. package/src/tests/i18n_coverage.test.ts +36 -0
  7. package/src/tests/locale_completeness.test.ts +42 -0
  8. package/src/tests/no_h1_in_components.test.ts +48 -0
  9. package/src/tests/seo_length.test.ts +3 -34
  10. package/src/tests/slug_uniqueness.test.ts +81 -0
  11. package/src/tests/tool_validation.test.ts +4 -4
  12. package/src/tool/alcoholClearance/i18n/de.ts +205 -0
  13. package/src/tool/alcoholClearance/i18n/id.ts +205 -0
  14. package/src/tool/alcoholClearance/i18n/it.ts +180 -0
  15. package/src/tool/alcoholClearance/i18n/ja.ts +205 -0
  16. package/src/tool/alcoholClearance/i18n/ko.ts +205 -0
  17. package/src/tool/alcoholClearance/i18n/nl.ts +205 -0
  18. package/src/tool/alcoholClearance/i18n/pl.ts +205 -0
  19. package/src/tool/alcoholClearance/i18n/pt.ts +205 -0
  20. package/src/tool/alcoholClearance/i18n/ru.ts +205 -0
  21. package/src/tool/alcoholClearance/i18n/sv.ts +205 -0
  22. package/src/tool/alcoholClearance/i18n/tr.ts +180 -0
  23. package/src/tool/alcoholClearance/i18n/zh.ts +205 -0
  24. package/src/tool/alcoholClearance/index.ts +13 -1
  25. package/src/tool/beerCooler/i18n/de.ts +197 -0
  26. package/src/tool/beerCooler/i18n/id.ts +197 -0
  27. package/src/tool/beerCooler/i18n/it.ts +197 -0
  28. package/src/tool/beerCooler/i18n/ja.ts +197 -0
  29. package/src/tool/beerCooler/i18n/ko.ts +197 -0
  30. package/src/tool/beerCooler/i18n/nl.ts +197 -0
  31. package/src/tool/beerCooler/i18n/pl.ts +197 -0
  32. package/src/tool/beerCooler/i18n/pt.ts +197 -0
  33. package/src/tool/beerCooler/i18n/ru.ts +197 -0
  34. package/src/tool/beerCooler/i18n/sv.ts +197 -0
  35. package/src/tool/beerCooler/i18n/tr.ts +197 -0
  36. package/src/tool/beerCooler/i18n/zh.ts +197 -0
  37. package/src/tool/beerCooler/index.ts +13 -1
  38. package/src/tool/carbonationCalculator/i18n/de.ts +200 -0
  39. package/src/tool/carbonationCalculator/i18n/id.ts +200 -0
  40. package/src/tool/carbonationCalculator/i18n/it.ts +200 -0
  41. package/src/tool/carbonationCalculator/i18n/ja.ts +200 -0
  42. package/src/tool/carbonationCalculator/i18n/ko.ts +200 -0
  43. package/src/tool/carbonationCalculator/i18n/nl.ts +200 -0
  44. package/src/tool/carbonationCalculator/i18n/pl.ts +200 -0
  45. package/src/tool/carbonationCalculator/i18n/pt.ts +200 -0
  46. package/src/tool/carbonationCalculator/i18n/ru.ts +200 -0
  47. package/src/tool/carbonationCalculator/i18n/sv.ts +200 -0
  48. package/src/tool/carbonationCalculator/i18n/tr.ts +200 -0
  49. package/src/tool/carbonationCalculator/i18n/zh.ts +200 -0
  50. package/src/tool/carbonationCalculator/index.ts +13 -1
  51. package/src/tool/cocktailBalancer/i18n/de.ts +222 -0
  52. package/src/tool/cocktailBalancer/i18n/id.ts +222 -0
  53. package/src/tool/cocktailBalancer/i18n/it.ts +222 -0
  54. package/src/tool/cocktailBalancer/i18n/ja.ts +222 -0
  55. package/src/tool/cocktailBalancer/i18n/ko.ts +222 -0
  56. package/src/tool/cocktailBalancer/i18n/nl.ts +222 -0
  57. package/src/tool/cocktailBalancer/i18n/pl.ts +222 -0
  58. package/src/tool/cocktailBalancer/i18n/pt.ts +222 -0
  59. package/src/tool/cocktailBalancer/i18n/ru.ts +222 -0
  60. package/src/tool/cocktailBalancer/i18n/sv.ts +222 -0
  61. package/src/tool/cocktailBalancer/i18n/tr.ts +222 -0
  62. package/src/tool/cocktailBalancer/i18n/zh.ts +222 -0
  63. package/src/tool/cocktailBalancer/index.ts +13 -1
  64. package/src/tool/partyKeg/i18n/de.ts +187 -0
  65. package/src/tool/partyKeg/i18n/id.ts +187 -0
  66. package/src/tool/partyKeg/i18n/it.ts +187 -0
  67. package/src/tool/partyKeg/i18n/ja.ts +187 -0
  68. package/src/tool/partyKeg/i18n/ko.ts +187 -0
  69. package/src/tool/partyKeg/i18n/nl.ts +187 -0
  70. package/src/tool/partyKeg/i18n/pl.ts +187 -0
  71. package/src/tool/partyKeg/i18n/pt.ts +187 -0
  72. package/src/tool/partyKeg/i18n/ru.ts +187 -0
  73. package/src/tool/partyKeg/i18n/sv.ts +187 -0
  74. package/src/tool/partyKeg/i18n/tr.ts +187 -0
  75. package/src/tool/partyKeg/i18n/zh.ts +187 -0
  76. package/src/tool/partyKeg/index.ts +13 -1
  77. package/src/types.ts +1 -1
  78. package/src/tests/content_mandatory.test.ts +0 -32
@@ -0,0 +1,200 @@
1
+ import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
2
+ import type { CarbonationUI, CarbonationLocaleContent } from '../index';
3
+
4
+ const slug = 'bira-karbonasyon-hesaplayicisi';
5
+ const title = 'Bira Karbonasyon ve Aşılaması Hesaplayıcısı';
6
+ const description = 'Ev yapımı biranızı şişelemek için gereken Dekstroz, Beyaz Şeker veya DME (Kurutulmuş Malt Özütü) gram miktarını hesaplayın. Hacim, fermantasyon sıcaklığı ve stili girerek mükemmel aşılamayı sağlayın.';
7
+
8
+ const ui: CarbonationUI = {
9
+ parametersTitle: 'Parametreler',
10
+ metricBtn: 'Metrik',
11
+ imperialBtn: 'İmparatorluk',
12
+ volumeLabel: 'Bira Hacmi',
13
+ maxTempLabel: 'Maksimum Sıcaklık',
14
+ litersUnit: 'Litre',
15
+ celsiusUnit: '°C',
16
+ gallonsUnit: 'Galon',
17
+ fahrenheitUnit: '°F',
18
+ desiredCo2Label: 'İstenen Karbonasyon',
19
+ volUnit: 'CO2 Vol',
20
+ resultsTitle: 'Aşılama Sonuçları',
21
+ tableSugarLabel: 'Beyaz Şeker',
22
+ cornSugarLabel: 'Mısır Şekeri (Dekstroz)',
23
+ dmeLabel: 'Kurutulmuş Malt Özütü (DME)',
24
+ safetyTitle: 'PATLAMA TEHLİKESİ!',
25
+ lowCarbonation: 'DÜŞÜK KARBONASYON',
26
+ optimalCarbonation: 'OPTİMAL KARBONASYON',
27
+ highEffervescence: 'YÜKSEK KÖPÜKLÜLÜK',
28
+ bubblingVisualizationLabel: 'Yaklaşık kabarcık görselleştirmesi'
29
+ };
30
+
31
+ const faqTitle = 'Sıkça Sorulan Sorular';
32
+ const bibliographyTitle = 'Bibliyografya & Kaynaklar';
33
+
34
+ const faq: CarbonationLocaleContent['faq'] = [
35
+ {
36
+ question: "Karbonasyon için sıcaklık neden önemlidir?",
37
+ answer: "Biranızdaki kalan CO2, fermantasyondan sonra ulaşılan en yüksek sıcaklığa bağlıdır: soğuk sıvı, sıcak sıvıdan daha fazla çözünmüş gaz tutar. Gerçekten daha düşük bir sıcaklık girerseniz, hesaplayıcı gerçekte var olandan daha fazla kalan CO2 olduğunu varsayar ve gerekli olandan daha az şeker önerir. Çok yüksek girerseniz ters olur — ihtiyacından daha fazla şeker ekler ve şişe patlaması tehlike bölgesine girer, burada aşırı basınç şişelerin kırılmasına veya kapakların şiddetli bir şekilde uçmasına neden olur.",
38
+ },
39
+ {
40
+ question: "Aşılama için en iyi şeker nedir?",
41
+ answer: "Dekstroz (mısır şekeri) nötr olduğu ve hızlı çözündüğü için tercih edilir. Beyaz şeker iyi çalışır ancak ağırlığının yaklaşık %10 daha azını gerektirir.",
42
+ },
43
+ {
44
+ question: "Çok fazla aşılama şekeri eklersem ne olur?",
45
+ answer: "Aşırı aşılama, şişe içinde aşırı CO2 basıncı oluşturur. Standart cam şişeler yaklaşık 3,5-4,0 CO2 hacminde başarısız olur. Bu noktanın ötesinde şişe patlamış olabilir veya kapak şiddetli bir şekilde uçabilir. Bu nedenle kesinlik önemlidir — hatta litre başına 5 gram fazla bile bir partiyiyı tehlike bölgesine itebilir.",
46
+ },
47
+ {
48
+ question: "Şişelendikten sonra bira ne kadar sürede karbonas oluyor?",
49
+ answer: "Oda sıcaklığında (18-22°C) 2 ila 3 hafta, mayaların eklenen şekeri tamamen fermente etmesi ve CO2'nin sıvıya entegre olması için tipik aralıktır. Süreç tamamlanmadan şişeyi açmak her zaman yanıltıcı bir sonuç verir: bira yetersiz karbonas gibi görünür, ancak karbonas hala gelişmektedir. DME ile, fermente edilebilir şekerlerin karmaşıklığı nedeniyle süreç biraz daha yavaş olabilir.",
50
+ },
51
+ ];
52
+
53
+ const howTo: CarbonationLocaleContent['howTo'] = [
54
+ {
55
+ name: "Gerçek hacmi ölçün",
56
+ text: "Fermantasyon tamamlandıktan sonra şişelemeye hazır olduğunuz bira litresini (veya galonunu) belirtin.",
57
+ },
58
+ {
59
+ name: "Fermantasyon sıcaklığını tanımlayın",
60
+ text: "Biranın aktif fermantasyon sırasında veya sonrasında ulaştığı en yüksek sıcaklığı girin.",
61
+ },
62
+ {
63
+ name: "Stil veya CO2 hacmini seçin",
64
+ text: "İstenen karbonasyon seviyesini seçin. Stiller 1,5 (Stouts) ile 4,5 (Buğday Bireleri) arasında değişir.",
65
+ },
66
+ ];
67
+
68
+ const bibliography: CarbonationLocaleContent['bibliography'] = [
69
+ {
70
+ name: "How to Brew: Carbonation Tables - John Palmer",
71
+ url: "https://howtobrew.com/section-1/chapter-11/",
72
+ },
73
+ {
74
+ name: "BJCP Style Guidelines: Carbonation Levels",
75
+ url: "https://www.bjcp.org/style/2021/beer/",
76
+ },
77
+ ];
78
+
79
+ const seo: CarbonationLocaleContent['seo'] = [
80
+ {
81
+ type: 'title',
82
+ text: 'Karbonasyon ve Aşılama Için Nihai Kılavuz',
83
+ level: 2
84
+ },
85
+ {
86
+ type: 'paragraph',
87
+ html: 'Aşılama sanatında ustalaşın ve ev yapımı biranızı düz bir deney dari profesyonel bir köpüklü deneyime dönüştürün. Aşılama, şişedeki kalan mayaların ikincil fermantasyon sırasında doğal CO2 üretmesini sağlamak için kesin bir şeker miktarı eklemeyi içerir. Çok az şeker düz bira verir; çok fazla şişeleri kırabilen tehlikeli basınç oluşturur. İkisinin arasındaki fark sadece birkaç gramdır — bu nedenle bu hesaplayıcı vardır.'
88
+ },
89
+ {
90
+ type: 'proscons',
91
+ title: 'Kritik Başarı Faktörleri',
92
+ items: [
93
+ { pro: 'Sıcaklık: Kalan CO2, fermantasyon sonrası sıcaklık tepesine bağlıdır.', con: '' },
94
+ { pro: 'Kesinlik: Litre başına 5 gram fazla, mükemmel karbonasyon ile bir geyser arasındaki fark olabilir.', con: '' },
95
+ { pro: '', con: 'Oksidasyon: Aşılama şekeri karıştırmak için aktarırken sıvının sıçramasını önleyin.' }
96
+ ]
97
+ },
98
+ {
99
+ type: 'title',
100
+ text: 'Bira Stiline Göre CO2 Hacimleri',
101
+ level: 2
102
+ },
103
+ {
104
+ type: 'stats',
105
+ items: [
106
+ { label: 'British Stouts', value: '1,5 - 2,0 Vol', icon: 'mdi:beer' },
107
+ { label: 'IPAs & Ales', value: '2,2 - 2,6 Vol', icon: 'mdi:hops' },
108
+ { label: 'German Wheat', value: '3,3 - 4,5 Vol', icon: 'mdi:barley' }
109
+ ],
110
+ columns: 3
111
+ },
112
+ {
113
+ type: 'card',
114
+ title: 'Hangi Şekeri Seçmelisiniz?',
115
+ icon: 'mdi:corn',
116
+ html: '<strong>Dekstroz</strong> nötr ve profesyonel — endüstri standardı. <strong>Beyaz Şeker</strong> ekonomik ve etkilidir (dekstrozdan %10 daha az ağırlık kullanın). <strong>DME (Kurutulmuş Malt Özütü)</strong> saflık seçeceğidir, ancak marka ve malt bileşimine göre fermente edilebilirliği değiştiği için doğru bir şekilde tahmin etmek daha zordur.'
117
+ },
118
+ {
119
+ type: 'diagnostic',
120
+ title: 'Güvenlik Uyarısı',
121
+ icon: 'mdi:alert-decagram',
122
+ variant: 'error',
123
+ badge: 'Tehlike',
124
+ html: 'Standart cam şişeler 3,5-4,0 CO2 hacminde başarısız olur. İnce camdaki Belçika tarzı veya buğday bireleri karbonasyona çalışmayın. Her zaman gazlı içecekler için derecelendirilmiş şişeler kullanın ve önceki kullanımdan mikroskopik yapısal hasar olabilecek geri dönüştürülmüş ticari şişeleri asla yeniden kullanmayın.'
125
+ },
126
+ {
127
+ type: 'tip',
128
+ title: 'Pro İpucu: Şekeri Doğru Şekilde Çözün',
129
+ html: 'Aşılama şekeri çözeltisini (20L partisi başına yaklaşık 250ml su içinde çözünmüş şeker) biraya eklemeden önce her zaman 10 dakika kaynatın. Kaynama solüsyonu sterilize eder ve şekerin tamamen çözünmüş olduğundan ve tüm partiye eşit şekilde dağıtıldığından emin olur, şişeler arasında eşit olmayan karbonasyona neden olan sıcak noktaları önler.'
130
+ },
131
+ {
132
+ type: 'summary',
133
+ title: 'Bu Araç Kim İçin?',
134
+ items: [
135
+ 'Ev Yapımı Bira Üreticileri: Herhangi bir partisi boyutu, stil ve fermantasyon sıcaklığı için kesin aşılama şekeri hesaplaması alın.',
136
+ 'Zanaat Birası Meraklıları: Ticari birelerin neden farklı karbonasyon seviyeleri olduğunun arkasındaki bilimi anlayın.',
137
+ 'Profesyonel Bira Üreticileri: Büyük ticari partileri şişelemeden önce el hesaplamalarını çapraz kontrol edin.'
138
+ ]
139
+ },
140
+ {
141
+ type: 'title',
142
+ text: 'Karbonasyon Bilimi: Henry\'s Yasası',
143
+ level: 2
144
+ },
145
+ {
146
+ type: 'paragraph',
147
+ html: 'Özünde, karbonasyon <strong>Henry\'s Yasası</strong> tarafından yönetilir: bir sıvıda çözünmüş gaz miktarı, o gazın sıvının üzerindeki kısmi basıncıyla orantılıdır. Bir şişeyi aşılayıp mühürlerseniz, maya şekeri tüketir ve kapalı bir ortamda CO2 üretir. Basınç arttıkça gaz tekrar çözeltiye zorlanır. Bu dengenin ulaşıldığı sıcaklık, son karbonasyon seviyesini belirler — bu nedenle fermantasyon sıcaklığı bu hesaplayıcıda en kritik değişkendir.'
148
+ },
149
+ {
150
+ type: 'paragraph',
151
+ html: 'Aşılamadan önceki biranızdaki kalan CO2 sıfır değildir. Her bira fermantasyon sürecinden çözünmüş CO2 içerir ve tutulan miktar biranın ulaştığı en yüksek sıcaklığa bağlıdır. 22°C\'de fermente edilen bira, 16°C\'de fermente edilen biradan önemli ölçüde daha az kalan CO2 içerir, ancak her ikisi de şu anda soğutulmuştur. Bu kalıntıyı hesaba katmamak sistematik aşırı aşılamaya yol açar — başlangıç ev yapımı bira üreticileri arasında en yaygın hatalardan biridir.'
152
+ }
153
+ ];
154
+
155
+ const schemas: CarbonationLocaleContent['schemas'] = [
156
+ {
157
+ '@context': 'https://schema.org',
158
+ '@type': 'FAQPage',
159
+ mainEntity: faq.map((item) => ({
160
+ '@type': 'Question',
161
+ name: item.question,
162
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
163
+ })),
164
+ } as WithContext<FAQPage>,
165
+ {
166
+ '@context': 'https://schema.org',
167
+ '@type': 'HowTo',
168
+ name: title,
169
+ description: description,
170
+ step: howTo.map((step, i) => ({
171
+ '@type': 'HowToStep',
172
+ position: i + 1,
173
+ name: step.name,
174
+ text: step.text,
175
+ })),
176
+ } as WithContext<HowTo>,
177
+ {
178
+ '@context': 'https://schema.org',
179
+ '@type': 'SoftwareApplication',
180
+ name: title,
181
+ description: description,
182
+ applicationCategory: 'UtilityApplication',
183
+ operatingSystem: 'Web',
184
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
185
+ } as WithContext<SoftwareApplication>,
186
+ ];
187
+
188
+ export const content: CarbonationLocaleContent = {
189
+ slug,
190
+ title,
191
+ description,
192
+ ui,
193
+ seo,
194
+ faqTitle,
195
+ faq,
196
+ bibliographyTitle,
197
+ bibliography,
198
+ howTo,
199
+ schemas,
200
+ };
@@ -0,0 +1,200 @@
1
+ import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
2
+ import type { CarbonationUI, CarbonationLocaleContent } from '../index';
3
+
4
+ const slug = 'beer-carbonation-calculator';
5
+ const title = '啤酒碳酸化和启动剂计算器';
6
+ const description = '计算装瓶自酿啤酒所需的精确葡萄糖、白砂糖或DME(干麦芽提取物)克数。输入体积、发酵温度和风格,实现完美的启动。';
7
+
8
+ const ui: CarbonationUI = {
9
+ parametersTitle: '参数',
10
+ metricBtn: '公制',
11
+ imperialBtn: '英制',
12
+ volumeLabel: '啤酒体积',
13
+ maxTempLabel: '最高温度',
14
+ litersUnit: '升',
15
+ celsiusUnit: '°C',
16
+ gallonsUnit: '加仑',
17
+ fahrenheitUnit: '°F',
18
+ desiredCo2Label: '所需的碳酸化',
19
+ volUnit: 'CO2 Vol',
20
+ resultsTitle: '启动结果',
21
+ tableSugarLabel: '白砂糖',
22
+ cornSugarLabel: '玉米糖(葡萄糖)',
23
+ dmeLabel: '干麦芽提取物(DME)',
24
+ safetyTitle: '爆炸危险!',
25
+ lowCarbonation: '低碳酸化',
26
+ optimalCarbonation: '最优碳酸化',
27
+ highEffervescence: '高气泡性',
28
+ bubblingVisualizationLabel: '近似气泡可视化'
29
+ };
30
+
31
+ const faqTitle = '常见问题';
32
+ const bibliographyTitle = '参考文献和来源';
33
+
34
+ const faq: CarbonationLocaleContent['faq'] = [
35
+ {
36
+ question: "为什么温度对碳酸化很重要?",
37
+ answer: "啤酒中的残余CO2取决于发酵后达到的最高温度:冷液体比热液体保持更多的溶解气体。如果输入的温度低于实际温度,计算器会假设残余CO2比实际存在的要多,并给出少于所需的糖。如果输入过高,就会发生相反的情况——您添加的糖超过必要量,使您的一批进入瓶爆炸危险区,过度的压力会导致瓶子破裂或瓶盖暴力弹出。",
38
+ },
39
+ {
40
+ question: "启动用什么糖最好?",
41
+ answer: "葡萄糖(玉米糖)是首选,因为它是中性的并快速溶解。白砂糖效果很好,但所需重量约少10%。",
42
+ },
43
+ {
44
+ question: "如果我添加过多启动糖会怎样?",
45
+ answer: "过度启动会在瓶子内产生过量的CO2压力。标准玻璃瓶在大约3.5-4.0体积CO2时会失效。超过这一点,瓶子可能会爆裂,或瓶盖可能会暴力弹出。这就是为什么精确性很重要——即使每升5克额外的糖也可能将一批推入危险区域。",
46
+ },
47
+ {
48
+ question: "装瓶后啤酒需要多长时间才能碳酸化?",
49
+ answer: "在室温(18-22°C)下2至3周是酵母完全发酵添加的糖并使CO2融入液体的典型范围。在过程完成前打开瓶子总是会产生误导性结果:啤酒看起来碳酸化不足,尽管碳酸化仍在进行中。使用DME时,由于其可发酵糖的复杂性,过程可能会慢一些。",
50
+ },
51
+ ];
52
+
53
+ const howTo: CarbonationLocaleContent['howTo'] = [
54
+ {
55
+ name: "测量实际体积",
56
+ text: "指出发酵完成后有多少升(或加仑)啤酒准备好装瓶。",
57
+ },
58
+ {
59
+ name: "定义发酵温度",
60
+ text: "输入啤酒在活跃发酵期间或之后达到的最高温度。",
61
+ },
62
+ {
63
+ name: "选择风格或CO2体积",
64
+ text: "选择所需的碳酸化水平。风格从1.5(黑啤)到4.5(小麦啤酒)不等。",
65
+ },
66
+ ];
67
+
68
+ const bibliography: CarbonationLocaleContent['bibliography'] = [
69
+ {
70
+ name: "How to Brew: Carbonation Tables - John Palmer",
71
+ url: "https://howtobrew.com/section-1/chapter-11/",
72
+ },
73
+ {
74
+ name: "BJCP Style Guidelines: Carbonation Levels",
75
+ url: "https://www.bjcp.org/style/2021/beer/",
76
+ },
77
+ ];
78
+
79
+ const seo: CarbonationLocaleContent['seo'] = [
80
+ {
81
+ type: 'title',
82
+ text: '碳酸化和启动的终极指南',
83
+ level: 2
84
+ },
85
+ {
86
+ type: 'paragraph',
87
+ html: '掌握启动艺术,将自酿啤酒从平坦的实验转变为专业的起泡体验。启动涉及添加精确量的糖,以便瓶中的残余酵母在二次发酵期间产生天然CO2。糖太少会导致啤酒变平;太多会产生危险的压力,可能破坏瓶子。两者之间的差异只有几克——这就是该计算器存在的原因。'
88
+ },
89
+ {
90
+ type: 'proscons',
91
+ title: '关键成功因素',
92
+ items: [
93
+ { pro: '温度:残余CO2取决于发酵后的温度峰值。', con: '' },
94
+ { pro: '精确性:每升5克额外的糖可能是完美碳酸化和间歇泉之间的区别。', con: '' },
95
+ { pro: '', con: '氧化:转移以混合启动糖时,避免液体溅出。' }
96
+ ]
97
+ },
98
+ {
99
+ type: 'title',
100
+ text: '按啤酒风格的CO2体积',
101
+ level: 2
102
+ },
103
+ {
104
+ type: 'stats',
105
+ items: [
106
+ { label: 'British Stouts', value: '1.5 - 2.0 Vol', icon: 'mdi:beer' },
107
+ { label: 'IPAs & Ales', value: '2.2 - 2.6 Vol', icon: 'mdi:hops' },
108
+ { label: 'German Wheat', value: '3.3 - 4.5 Vol', icon: 'mdi:barley' }
109
+ ],
110
+ columns: 3
111
+ },
112
+ {
113
+ type: 'card',
114
+ title: '你应该选择哪种糖?',
115
+ icon: 'mdi:corn',
116
+ html: '<strong>葡萄糖</strong>是中性的和专业的——行业标准。<strong>白砂糖</strong>经济且有效(使用比葡萄糖少10%的重量)。<strong>DME(干麦芽提取物)</strong>是纯粹主义者的选择,但因为其可发酵性因品牌和麦芽成分而异,所以更难精确预测。'
117
+ },
118
+ {
119
+ type: 'diagnostic',
120
+ title: '安全警告',
121
+ icon: 'mdi:alert-decagram',
122
+ variant: 'error',
123
+ badge: '危险',
124
+ html: '标准玻璃瓶在3.5-4.0体积CO2时失效。请勿尝试在薄玻璃中对比利时或小麦啤酒进行碳酸化。始终使用为碳酸饮料额定的瓶子,不要重复使用可能从之前使用中有微观结构损伤的回收商业瓶子。'
125
+ },
126
+ {
127
+ type: 'tip',
128
+ title: '专业提示:正确溶解糖',
129
+ html: '在将启动糖溶液(每20L一批中约250ml水中溶解的糖)添加到啤酒之前,请始终煮沸10分钟。煮沸可以对溶液进行消毒,并确保糖完全溶解并均匀分布在整个一批中,防止导致瓶子之间碳酸化不均的热点。'
130
+ },
131
+ {
132
+ type: 'summary',
133
+ title: '这个工具适合谁?',
134
+ items: [
135
+ '家庭酿酒师:获得任何批次大小、风格和发酵温度的精确启动糖计算。',
136
+ '精酿啤酒爱好者:了解为什么商业啤酒有不同碳酸化水平的科学。',
137
+ '专业酿酒师:在装瓶大型商业批次之前交叉检查手工计算。'
138
+ ]
139
+ },
140
+ {
141
+ type: 'title',
142
+ text: '碳酸化科学:Henry\'s定律',
143
+ level: 2
144
+ },
145
+ {
146
+ type: 'paragraph',
147
+ html: '本质上,碳酸化由<strong>Henry\'s定律</strong>控制:液体中溶解的气体量与该气体在液体上方的分压成正比。当您启动瓶子并将其密封时,酵母消耗糖并在密闭环境中产生CO2。随着压力增加,气体被强制回到溶液中。在这个平衡达到的温度决定了最终的碳酸化水平——这就是为什么发酵温度是该计算器中最关键的变量。'
148
+ },
149
+ {
150
+ type: 'paragraph',
151
+ html: '启动前啤酒中的残余CO2不为零。每种啤酒都含有来自发酵过程的溶解CO2,保留的数量取决于啤酒达到的最高温度。在22°C下发酵的啤酒比在16°C下发酵的啤酒含有明显更少的残余CO2,尽管两者现在都已冷却。未能考虑这一剩余量会导致系统性过度启动——初级家庭酿酒师中最常见的错误之一。'
152
+ }
153
+ ];
154
+
155
+ const schemas: CarbonationLocaleContent['schemas'] = [
156
+ {
157
+ '@context': 'https://schema.org',
158
+ '@type': 'FAQPage',
159
+ mainEntity: faq.map((item) => ({
160
+ '@type': 'Question',
161
+ name: item.question,
162
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
163
+ })),
164
+ } as WithContext<FAQPage>,
165
+ {
166
+ '@context': 'https://schema.org',
167
+ '@type': 'HowTo',
168
+ name: title,
169
+ description: description,
170
+ step: howTo.map((step, i) => ({
171
+ '@type': 'HowToStep',
172
+ position: i + 1,
173
+ name: step.name,
174
+ text: step.text,
175
+ })),
176
+ } as WithContext<HowTo>,
177
+ {
178
+ '@context': 'https://schema.org',
179
+ '@type': 'SoftwareApplication',
180
+ name: title,
181
+ description: description,
182
+ applicationCategory: 'UtilityApplication',
183
+ operatingSystem: 'Web',
184
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
185
+ } as WithContext<SoftwareApplication>,
186
+ ];
187
+
188
+ export const content: CarbonationLocaleContent = {
189
+ slug,
190
+ title,
191
+ description,
192
+ ui,
193
+ seo,
194
+ faqTitle,
195
+ faq,
196
+ bibliographyTitle,
197
+ bibliography,
198
+ howTo,
199
+ schemas,
200
+ };
@@ -36,9 +36,21 @@ export const carbonationCalculator: AlcoholToolEntry<CarbonationUI> = {
36
36
  fg: 'mdi:water-opacity',
37
37
  },
38
38
  i18n: {
39
- es: () => import('./i18n/es').then((m) => m.content),
39
+ de: () => import('./i18n/de').then((m) => m.content),
40
40
  en: () => import('./i18n/en').then((m) => m.content),
41
+ es: () => import('./i18n/es').then((m) => m.content),
41
42
  fr: () => import('./i18n/fr').then((m) => m.content),
43
+ id: () => import('./i18n/id').then((m) => m.content),
44
+ it: () => import('./i18n/it').then((m) => m.content),
45
+ ja: () => import('./i18n/ja').then((m) => m.content),
46
+ ko: () => import('./i18n/ko').then((m) => m.content),
47
+ nl: () => import('./i18n/nl').then((m) => m.content),
48
+ pl: () => import('./i18n/pl').then((m) => m.content),
49
+ pt: () => import('./i18n/pt').then((m) => m.content),
50
+ ru: () => import('./i18n/ru').then((m) => m.content),
51
+ sv: () => import('./i18n/sv').then((m) => m.content),
52
+ tr: () => import('./i18n/tr').then((m) => m.content),
53
+ zh: () => import('./i18n/zh').then((m) => m.content),
42
54
  },
43
55
  };
44
56
 
@@ -0,0 +1,222 @@
1
+ import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
2
+ import type { CocktailBalancerUI, CocktailBalancerLocaleContent } from '../index';
3
+
4
+ const slug = 'cocktail-ausgleicher';
5
+ const title = 'Cocktail Balancer: Das Sauer Gesetz';
6
+ const description = 'Berechnen Sie die perfekte Balance zwischen süß und sauer für Ihre Cocktails. Meistern Sie das goldene Verhältnis der Mixologie.';
7
+
8
+ const ui: CocktailBalancerUI = {
9
+ title: 'Cocktail Balancer',
10
+ presetsBtn: 'Rezepte',
11
+ saveBtn: 'Speichern',
12
+ resetBtn: 'Zurücksetzen',
13
+ emptyStateTitle: 'Ihre Werkbank ist leer',
14
+ emptyStateDescription: 'Fügen Sie Zutaten hinzu, um die Balance Ihres Cocktails in Echtzeit zu analysieren.',
15
+ addBtn: 'Zutat hinzufügen',
16
+ addMoreBtn: 'Noch eine Zutat hinzufügen',
17
+ flavorProfileTitle: 'Geschmacksprofil',
18
+ volLabel: 'Volumen',
19
+ sugarLabel: 'Zucker',
20
+ colorLabel: 'Farbe',
21
+ sourLawTitle: 'Sauer-Gesetz',
22
+ acidDryLabel: 'Säure (Trocken)',
23
+ balanceLabel: 'Balance',
24
+ sweetLabel: 'Süß',
25
+ aiSuggestionTitle: 'KI-Vorschlag',
26
+ addIngredientTitle: 'Zutat hinzufügen',
27
+ searchPlaceholder: 'Rum, Limette, Sirup durchsuchen...',
28
+ presetsTitle: 'Rezepte & Vorlagen',
29
+ savedSectionTitle: 'Meine gespeicherten',
30
+ classicsSectionTitle: 'Klassiker',
31
+ confirmDeleteTitle: 'Alles löschen?',
32
+ confirmDeleteText: 'Dadurch werden alle Zutaten von Ihrer Werkbank entfernt. Diese Aktion kann nicht rückgängig gemacht werden.',
33
+ cancelBtn: 'Abbrechen',
34
+ deleteBtn: 'Löschen',
35
+ verdictSpiritSeco: 'Spirituose / Trocken',
36
+ verdictSoloDulce: 'Nur Süß (Old Fashioned)',
37
+ verdictMuyAcido: 'Zu sauer / Knochentrocken',
38
+ verdictAcido: 'Sauer / Herb',
39
+ verdictEquilibrado: 'Ausgewogen (Sauer)',
40
+ verdictDulce: 'Süß / Kommerziell',
41
+ verdictEmpalagoso: 'Zu süß',
42
+ fixAddBitters: 'Bitterkeit fehlt',
43
+ fixAddSugar: 'Zu sauer',
44
+ fixAddAcid: 'Zu süß'
45
+ };
46
+
47
+ const faqTitle = 'Häufig gestellte Fragen';
48
+ const bibliographyTitle = 'Bibliografie & Quellen';
49
+
50
+ const faq: CocktailBalancerLocaleContent['faq'] = [
51
+ {
52
+ question: "Was ist das 'Sauer-Gesetz'?",
53
+ answer: "Es ist das goldene Verhältnis der Mixologie, das drei Elemente ausbalanciert: die starke Basis (Spirituose), die Säure (Zitrusfrüchte) und die Süße (Sirupe). Ein klassisches Rezept folgt in der Regel dem Verhältnis 2:1:1 (Stark:Sauer:Süß), wobei dies je nach Stärke und Dichte variiert.",
54
+ },
55
+ {
56
+ question: "Wie wirkt sich Verdünnung auf die Cocktail-Balance aus?",
57
+ answer: "Eis kühlt nicht nur ab; es fügt Wasser (Verdünnung) hinzu, das die Aromen der Spirituose öffnet und die Spitzen von Säure und Süße abschwächt. Ein ausgewogener Cocktail im Shaker kann unausgewogen werden, wenn er zu lange mit Eis im Glas bleibt.",
58
+ },
59
+ {
60
+ question: "Warum schmecken meine selbstgemachten Cocktails nicht wie die in einer Bar?",
61
+ answer: "Es liegt meist an der fehlenden Balance zwischen Zucker und dem pH-Wert der Zitrusfrüchte. Zitronen variieren je nach Jahreszeit in ihrer Säure. Unser Rechner hilft Ihnen, die genaue Menge Sirup basierend auf dem verwendeten Saftvolumen anzupassen.",
62
+ },
63
+ {
64
+ question: "Was sind Brix-Grade und warum sind sie für Cocktails wichtig?",
65
+ answer: "Brix ist eine Skala, die die Menge des gelösten Zuckers in einer Flüssigkeit misst. Ein einfacher Sirup (1:1) liegt bei etwa 50 °Brix; ein Rich Syrup (2:1) überschreitet 66 °Brix. Je höher der Brix-Wert, desto mehr Körper und Süße trägt er pro Volumeneinheit bei. Dieses Wissen ermöglicht es Ihnen, Sirupe in einem Rezept auszutauschen, ohne die Balance zu beeinträchtigen.",
66
+ },
67
+ ];
68
+
69
+ const howTo: CocktailBalancerLocaleContent['howTo'] = [
70
+ {
71
+ name: "Wählen Sie die alkoholische Basis",
72
+ text: "Wählen Sie die Hauptspirituose (Gin, Rum, Whiskey) aus unserer Datenbank, um ihren Körper und Alkoholbeitrag zu kennen.",
73
+ },
74
+ {
75
+ name: "Geben Sie den Säureagenten ein",
76
+ text: "Fügen Sie das Volumen von Zitronensaft, Limettensaft oder Grapefruitsaft hinzu. Der Rechner analysiert die pH-Auswirkung auf die Mischung.",
77
+ },
78
+ {
79
+ name: "Passen Sie die süße Komponente an",
80
+ text: "Geben Sie den Siruptyp (einfach, 2:1, Agave) ein und beobachten Sie, wie sich der Balance-Indikator in Echtzeit bewegt.",
81
+ },
82
+ {
83
+ name: "Perfekte Serviertechnik",
84
+ text: "Überprüfen Sie das endgültige Urteil des Tools: das Sauer-Verhältnis, die geschätzte ABV nach Verdünnung und die Korrekturvorschläge. Mit frischem Eis servieren und Zitrus oder Sirup nach Geschmack feinabstimmen.",
85
+ },
86
+ ];
87
+
88
+ const bibliography: CocktailBalancerLocaleContent['bibliography'] = [
89
+ {
90
+ name: "Liquid Intelligence: The Art and Science of the Perfect Cocktail",
91
+ url: "https://www.indigo.ca/en-ca/liquid-intelligence-the-art-and-science-of-the-perfect-cocktail/9780393089035.html",
92
+ },
93
+ {
94
+ name: "Cocktails: The Science of Shaking",
95
+ url: "https://cookingissues.com/2009/07/22/cocktails-the-science-of-shaking/",
96
+ },
97
+ {
98
+ name: "Cocktail Balance - Difford's Guide",
99
+ url: "https://www.diffordsguide.com/encyclopedia/1066/cocktails/cocktail-balance",
100
+ },
101
+ ];
102
+
103
+ const seo: CocktailBalancerLocaleContent['seo'] = [
104
+ {
105
+ type: 'title',
106
+ text: 'Molekulare Ingenieurskunst & Flüssigkeitsbalance',
107
+ level: 2
108
+ },
109
+ {
110
+ type: 'paragraph',
111
+ html: 'Willkommen im digitalen Labor, wo Intuition auf Mathematik trifft. Dieses Tool ist kein einfaches Rezeptbuch; es ist ein <strong>fortgeschrittener physikalisch-chemischer Simulator</strong>, der dazu entwickelt wurde, die molekulare Struktur Ihrer Cocktails in Echtzeit zu dekonstruieren und zu analysieren. Jeder Tropfen Zitrus, jede Menge Spirituose, jedes Gramm Sirup interagiert nach unveränderlichen Gesetzen der Chemie, die darüber entscheiden, ob Ihr Drink ein Meisterwerk oder ein Fehlschlag wird.'
112
+ },
113
+ {
114
+ type: 'stats',
115
+ items: [
116
+ { label: 'Limette', value: '~6% Säure', icon: 'mdi:fruit-citrus' },
117
+ { label: 'Zitrone', value: '~6% Säure', icon: 'mdi:fruit-citrus' },
118
+ { label: 'Grapefruit', value: '~1-2% Säure', icon: 'mdi:fruit-citrus' }
119
+ ],
120
+ columns: 3
121
+ },
122
+ {
123
+ type: 'card',
124
+ title: 'Die Wissenschaft der Säure',
125
+ icon: 'mdi:fruit-citrus',
126
+ html: 'Säure ist nicht nur ein Geschmack; sie ist das strukturelle Fundament jedes ausgewogenen Cocktails. Ohne die korrekte Säure wird ein Drink flach, eindimensional und vergesslich. Unser Algorithmus unterscheidet zwischen der titrierbaren Säure einer persischen Limette und einer Eureka-Zitrone und berücksichtigt saisonale Schwankungen des pH-Wertes von Zitrusfrüchten, die Ihr Rezept um einen ganzen Balancepunkt verschieben können.'
127
+ },
128
+ {
129
+ type: 'card',
130
+ title: 'Brix Kontrolle (Süße)',
131
+ icon: 'mdi:spoon-sugar',
132
+ html: 'Der Körper und die Textur Ihres Cocktails hängen vollständig von gelöstem Zucker ab. Ein einfacher Sirup (1:1) verhält sich ganz anders als ein Rich Syrup (2:1), Honig oder Agavendicksaft. Jeder Süßstoff hat einen anderen Brix-Grad und eine andere Viskosität, die beeinflussen, wie der Drink am Gaumen haftet. Unser Rechner berechnet die genaue Grammmenge gelösten Zuckers, um das endgültige Mundgefühl und die Süßewahrnehmung vorherzusagen.'
133
+ },
134
+ {
135
+ type: 'card',
136
+ title: 'Thermodynamik und Verdünnung',
137
+ icon: 'mdi:water-percent',
138
+ html: 'Ein geschüttelter Cocktail verdünnt sich je nach Eistemperatur, Schütteltechnik und Dauer um 25-40%. Dieser Wasserzusatz ist kein Fehler; er ist eine wesentliche Zutat, die Aromen öffnet und die Alkoholschärfe abschwächt. Unser Rechner schätzt die endgültige ABV nach Verdünnung, damit Sie Drinks mit genau beabsichtigter Stärke und Geschmacksbalance kreieren können.'
139
+ },
140
+ {
141
+ type: 'title',
142
+ text: 'Jenseits des einfachen Verhältnisses',
143
+ level: 2
144
+ },
145
+ {
146
+ type: 'paragraph',
147
+ html: 'Viele Barkeeper lernen die klassische 2:1:1-Regel (2 Teile Spirituose, 1 Teil Sauer, 1 Teil Süß) und behandeln sie als universelle Wahrheit. Aber <strong>Chemie ist weitaus nuancierter</strong>. Eine sizilianische Zitrone enthält andere Säure als eine mexikanische Limette. Ein Triple Sec wie Cointreau verhält sich radikal anders als ein Blue Curaçao. Dasselbe Rezept kann eine Woche perfekt ausgewogen schmecken und die nächste unbarmherzig sauer, einfach wegen saisonaler Fruchtvariation.'
148
+ },
149
+ {
150
+ type: 'paragraph',
151
+ html: 'Dieser Balancer durchbricht diese simplen Grenzen. Indem Sie Ihre spezifischen Zutaten eingeben, konsultieren Sie eine lebende Datenbank, die Säure- und Süßevektoren dynamisch anpasst, um eine präzise sensorische Karte Ihrer Kreation anzubieten. Hören Sie auf zu raten und beginnen Sie, Ihre Cocktails mit der gleichen wissenschaftlichen Genauigkeit zu entwickeln, die Barkeeper in Weltklasse-Etablissements bei jedem Service nutzen.'
152
+ },
153
+ {
154
+ type: 'summary',
155
+ title: 'Für wen ist dieses Tool gedacht?',
156
+ items: [
157
+ 'Professionelle Barkeeper: Standardisieren Sie Rezepte und erstellen Sie Signature Menus mit reproduzierbarer Konsistenz.',
158
+ 'Heimbegeisterte: Hören Sie auf zu raten und verstehen Sie, warum Ihre Cocktails erfolgreich oder erfolglos sind.',
159
+ 'Getränkeentwickler: Prototypisieren Sie schnell neue Geschmackskonzepte, bevor teure Produktionsläufe anfallen.'
160
+ ]
161
+ },
162
+ {
163
+ type: 'diagnostic',
164
+ title: 'Die goldene Zone',
165
+ icon: 'mdi:star',
166
+ variant: 'success',
167
+ badge: 'Ziel',
168
+ html: 'Dies ist das ultimative Ziel: ein kontrollierter pH-Wert, bei dem Zucker die Aggression der Säure neutralisiert, ohne die ätherischen Öle und aromatischen Verbindungen der Basisspirituose zu maskieren. Diese präzise Balance ist der Ort, wo unsterbliche Klassiker leben — der Daiquiri, die Margarita, der Sidecar — Drinks, die Jahrzehnte überdauert haben, weil sie den grundlegenden Gesetzen der Geschmackschemie gehorchen.'
169
+ },
170
+ {
171
+ type: 'tip',
172
+ title: 'Expertentipp: Verwenden Sie immer frische Zitrusfrüchte',
173
+ html: 'Pressen Sie Zitrusfrüchte immer in letzter Minute. Zitronensaft und Limettensaft oxidieren schnell und verlieren innerhalb von 20-30 Minuten nach dem Auspressen ihre lebendige Säure. Ein Cocktail aus wirklich frischem Saft hat immer eine Helligkeit und Lebendigkeit am Gaumen, die kein Fertigprodukt replizieren kann. Verwenden Sie Frucht bei Raumtemperatur, um die Saftausbeute zu maximieren.'
174
+ }
175
+ ];
176
+
177
+ const schemas: CocktailBalancerLocaleContent['schemas'] = [
178
+ {
179
+ '@context': 'https://schema.org',
180
+ '@type': 'FAQPage',
181
+ mainEntity: faq.map((item) => ({
182
+ '@type': 'Question',
183
+ name: item.question,
184
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
185
+ })),
186
+ } as WithContext<FAQPage>,
187
+ {
188
+ '@context': 'https://schema.org',
189
+ '@type': 'HowTo',
190
+ name: title,
191
+ description: description,
192
+ step: howTo.map((step, i) => ({
193
+ '@type': 'HowToStep',
194
+ position: i + 1,
195
+ name: step.name,
196
+ text: step.text,
197
+ })),
198
+ } as WithContext<HowTo>,
199
+ {
200
+ '@context': 'https://schema.org',
201
+ '@type': 'SoftwareApplication',
202
+ name: title,
203
+ description: description,
204
+ applicationCategory: 'UtilityApplication',
205
+ operatingSystem: 'Web',
206
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
207
+ } as WithContext<SoftwareApplication>,
208
+ ];
209
+
210
+ export const content: CocktailBalancerLocaleContent = {
211
+ slug,
212
+ title,
213
+ description,
214
+ ui,
215
+ seo,
216
+ faqTitle,
217
+ faq,
218
+ bibliographyTitle,
219
+ bibliography,
220
+ howTo,
221
+ schemas,
222
+ };