@jjlmoya/utils-cooking 1.26.0 → 1.28.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 (88) hide show
  1. package/package.json +1 -1
  2. package/src/category/i18n/fr.ts +16 -16
  3. package/src/category/i18n/ru.ts +7 -7
  4. package/src/category/i18n/zh.ts +1 -1
  5. package/src/category/index.ts +2 -0
  6. package/src/entries.ts +3 -1
  7. package/src/index.ts +1 -0
  8. package/src/tests/i18n-titles.test.ts +3 -2
  9. package/src/tests/lacto-fermentation-salt-calculator.test.ts +64 -0
  10. package/src/tests/locale_completeness.test.ts +2 -2
  11. package/src/tests/no_en_dash.test.ts +70 -0
  12. package/src/tests/tool_validation.test.ts +2 -2
  13. package/src/tool/american-kitchen-converter/i18n/en.ts +2 -2
  14. package/src/tool/american-kitchen-converter/i18n/fr.ts +2 -2
  15. package/src/tool/american-kitchen-converter/i18n/pl.ts +2 -2
  16. package/src/tool/american-kitchen-converter/i18n/ru.ts +13 -13
  17. package/src/tool/american-kitchen-converter/i18n/sv.ts +2 -2
  18. package/src/tool/american-kitchen-converter/i18n/zh.ts +3 -3
  19. package/src/tool/banana-ripeness/banana-ripeness.css +56 -0
  20. package/src/tool/banana-ripeness/i18n/fr.ts +5 -5
  21. package/src/tool/banana-ripeness/i18n/ru.ts +5 -5
  22. package/src/tool/brine/i18n/fr.ts +4 -4
  23. package/src/tool/brine/i18n/ru.ts +3 -3
  24. package/src/tool/brine/i18n/sv.ts +9 -9
  25. package/src/tool/cookware-guide/i18n/fr.ts +9 -9
  26. package/src/tool/cookware-guide/i18n/ru.ts +6 -6
  27. package/src/tool/cookware-guide/i18n/zh.ts +3 -3
  28. package/src/tool/egg-timer/i18n/ru.ts +4 -4
  29. package/src/tool/ingredient-rescaler/i18n/en.ts +1 -1
  30. package/src/tool/ingredient-rescaler/i18n/fr.ts +3 -3
  31. package/src/tool/ingredient-rescaler/i18n/pl.ts +1 -1
  32. package/src/tool/ingredient-rescaler/i18n/ru.ts +5 -5
  33. package/src/tool/ingredient-rescaler/i18n/zh.ts +5 -5
  34. package/src/tool/kitchen-timer/i18n/de.ts +1 -1
  35. package/src/tool/kitchen-timer/i18n/fr.ts +8 -8
  36. package/src/tool/kitchen-timer/i18n/id.ts +1 -1
  37. package/src/tool/kitchen-timer/i18n/nl.ts +1 -1
  38. package/src/tool/kitchen-timer/i18n/pl.ts +1 -1
  39. package/src/tool/kitchen-timer/i18n/ru.ts +4 -4
  40. package/src/tool/kitchen-timer/i18n/sv.ts +1 -1
  41. package/src/tool/kitchen-timer/i18n/zh.ts +5 -5
  42. package/src/tool/lacto-fermentation-salt-calculator/bibliography.astro +6 -0
  43. package/src/tool/lacto-fermentation-salt-calculator/bibliography.ts +10 -0
  44. package/src/tool/lacto-fermentation-salt-calculator/component.astro +163 -0
  45. package/src/tool/lacto-fermentation-salt-calculator/components/DigitalScale.astro +43 -0
  46. package/src/tool/lacto-fermentation-salt-calculator/components/PetriDish.astro +55 -0
  47. package/src/tool/lacto-fermentation-salt-calculator/components/WizardMode.astro +83 -0
  48. package/src/tool/lacto-fermentation-salt-calculator/entry.ts +26 -0
  49. package/src/tool/lacto-fermentation-salt-calculator/i18n/de.ts +195 -0
  50. package/src/tool/lacto-fermentation-salt-calculator/i18n/en.ts +195 -0
  51. package/src/tool/lacto-fermentation-salt-calculator/i18n/es.ts +195 -0
  52. package/src/tool/lacto-fermentation-salt-calculator/i18n/fr.ts +195 -0
  53. package/src/tool/lacto-fermentation-salt-calculator/i18n/id.ts +195 -0
  54. package/src/tool/lacto-fermentation-salt-calculator/i18n/it.ts +195 -0
  55. package/src/tool/lacto-fermentation-salt-calculator/i18n/ja.ts +195 -0
  56. package/src/tool/lacto-fermentation-salt-calculator/i18n/ko.ts +195 -0
  57. package/src/tool/lacto-fermentation-salt-calculator/i18n/nl.ts +195 -0
  58. package/src/tool/lacto-fermentation-salt-calculator/i18n/pl.ts +195 -0
  59. package/src/tool/lacto-fermentation-salt-calculator/i18n/pt.ts +195 -0
  60. package/src/tool/lacto-fermentation-salt-calculator/i18n/ru.ts +195 -0
  61. package/src/tool/lacto-fermentation-salt-calculator/i18n/sv.ts +195 -0
  62. package/src/tool/lacto-fermentation-salt-calculator/i18n/tr.ts +195 -0
  63. package/src/tool/lacto-fermentation-salt-calculator/i18n/zh.ts +195 -0
  64. package/src/tool/lacto-fermentation-salt-calculator/index.ts +11 -0
  65. package/src/tool/lacto-fermentation-salt-calculator/lacto-fermentation-salt-calculator.css +692 -0
  66. package/src/tool/lacto-fermentation-salt-calculator/logic.ts +37 -0
  67. package/src/tool/lacto-fermentation-salt-calculator/seo.astro +15 -0
  68. package/src/tool/meringue-peak/i18n/en.ts +3 -3
  69. package/src/tool/meringue-peak/i18n/ru.ts +3 -3
  70. package/src/tool/meringue-peak/i18n/zh.ts +2 -2
  71. package/src/tool/pizza/i18n/de.ts +1 -1
  72. package/src/tool/pizza/i18n/fr.ts +4 -4
  73. package/src/tool/pizza/i18n/ru.ts +6 -6
  74. package/src/tool/roux-guide/i18n/fr.ts +3 -3
  75. package/src/tool/roux-guide/i18n/ru.ts +4 -4
  76. package/src/tool/roux-guide/i18n/zh.ts +1 -1
  77. package/src/tool/sourdough-calculator/i18n/ru.ts +2 -2
  78. package/src/tool/sourdough-calculator/i18n/zh.ts +2 -2
  79. package/src/tool/yeast-converter/i18n/de.ts +1 -1
  80. package/src/tool/yeast-converter/i18n/en.ts +1 -1
  81. package/src/tool/yeast-converter/i18n/fr.ts +19 -19
  82. package/src/tool/yeast-converter/i18n/id.ts +1 -1
  83. package/src/tool/yeast-converter/i18n/nl.ts +1 -1
  84. package/src/tool/yeast-converter/i18n/pl.ts +1 -1
  85. package/src/tool/yeast-converter/i18n/pt.ts +1 -1
  86. package/src/tool/yeast-converter/i18n/ru.ts +4 -4
  87. package/src/tool/yeast-converter/i18n/sv.ts +1 -1
  88. package/src/tools.ts +2 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlmoya/utils-cooking",
3
- "version": "1.26.0",
3
+ "version": "1.28.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -16,15 +16,15 @@ export const content: CategoryLocaleContent = {
16
16
  },
17
17
  {
18
18
  type: 'paragraph',
19
- html: 'Nos outils sont conçus pour éliminer les conjectures. Ils sont basés sur des <strong>protocoles scientifiques réels</strong> : normes de la Specialty Coffee Association, ratios de boulanger, chimie moléculaire, microbiologie de la fermentation. Ce ne sont pas des « astuces de cuisine » ; c\'est une science éprouvée que vous pouvez utiliser dans votre cuisine domestique ou professionnelle.',
19
+ html: 'Nos outils sont conçus pour éliminer les conjectures. Ils sont basés sur des <strong>protocoles scientifiques réels</strong>: normes de la Specialty Coffee Association, ratios de boulanger, chimie moléculaire, microbiologie de la fermentation. Ce ne sont pas des " astuces de cuisine " ; c\'est une science éprouvée que vous pouvez utiliser dans votre cuisine domestique ou professionnelle.',
20
20
  },
21
21
  {
22
22
  type: 'paragraph',
23
- html: 'Des cuisines domestiques aux étoiles Michelin, tous les grands chefs partagent une caractéristique : la <strong>reproductibilité</strong>. Ils ne créent pas un plat exceptionnel par hasard ; ils le créent grâce à des protocoles précis, des mesures exactes et une compréhension profonde de la raison pour laquelle les transformations se produisent.',
23
+ html: 'Des cuisines domestiques aux étoiles Michelin, tous les grands chefs partagent une caractéristique: la <strong>reproductibilité</strong>. Ils ne créent pas un plat exceptionnel par hasard ; ils le créent grâce à des protocoles précis, des mesures exactes et une compréhension profonde de la raison pour laquelle les transformations se produisent.',
24
24
  },
25
25
  {
26
26
  type: 'title',
27
- text: 'Calculateurs de Pâtisserie et de Pâtes : Hydratation, Fermentation et Ratios Exactos',
27
+ text: 'Calculateurs de Pâtisserie et de Pâtes: Hydratation, Fermentation et Ratios Exactos',
28
28
  level: 2,
29
29
  },
30
30
  {
@@ -33,11 +33,11 @@ export const content: CategoryLocaleContent = {
33
33
  },
34
34
  {
35
35
  type: 'paragraph',
36
- html: 'Maintenir une culture vivante nécessite une compréhension biologique. Les rafraîchis, la température, le moment : tout compte. Utilisez cet outil pour comprendre le ratio 1:1:1, les temps de fermentation et comment l\'ajuster en fonction de votre environnement :',
36
+ html: 'Maintenir une culture vivante nécessite une compréhension biologique. Les rafraîchis, la température, le moment: tout compte. Utilisez cet outil pour comprendre le ratio 1:1:1, les temps de fermentation et comment l\'ajuster en fonction de votre environnement :',
37
37
  },
38
38
  {
39
39
  type: 'paragraph',
40
- html: 'Changer la taille d\'un moule ne consiste pas seulement à multiplier les ingrédients. C\'est un problème de géométrie : un moule de 20x30 cm a une surface double de celle d\'un moule circulaire de 20 cm. Cela affecte l\'évaporation, les temps de cuisson et la hauteur finale. Calculez le facteur exact :',
40
+ html: 'Changer la taille d\'un moule ne consiste pas seulement à multiplier les ingrédients. C\'est un problème de géométrie: un moule de 20x30 cm a une surface double de celle d\'un moule circulaire de 20 cm. Cela affecte l\'évaporation, les temps de cuisson et la hauteur finale. Calculez le facteur exact :',
41
41
  },
42
42
  {
43
43
  type: 'paragraph',
@@ -45,7 +45,7 @@ export const content: CategoryLocaleContent = {
45
45
  },
46
46
  {
47
47
  type: 'title',
48
- text: 'Convertisseurs et Adaptateurs de Recettes : Des États-Unis à Votre Cuisine',
48
+ text: 'Convertisseurs et Adaptateurs de Recettes: Des États-Unis à Votre Cuisine',
49
49
  level: 2,
50
50
  },
51
51
  {
@@ -58,7 +58,7 @@ export const content: CategoryLocaleContent = {
58
58
  },
59
59
  {
60
60
  type: 'title',
61
- text: 'Fermentation, Conservation et Saumure : Microbiologie à Domicile',
61
+ text: 'Fermentation, Conservation et Saumure: Microbiologie à Domicile',
62
62
  level: 2,
63
63
  },
64
64
  {
@@ -76,15 +76,15 @@ export const content: CategoryLocaleContent = {
76
76
  },
77
77
  {
78
78
  type: 'paragraph',
79
- html: 'Le point d\'ébullition de l\'eau change avec l\'altitude. À des altitudes plus élevées, l\'eau bout à une température plus basse, ce qui affecte le temps de cuisson. Cet outil s\'ajuste automatiquement en fonction de votre emplacement : 4 minutes au niveau de la mer = 5,5 minutes à 2000 m :',
79
+ html: 'Le point d\'ébullition de l\'eau change avec l\'altitude. À des altitudes plus élevées, l\'eau bout à une température plus basse, ce qui affecte le temps de cuisson. Cet outil s\'ajuste automatiquement en fonction de votre emplacement: 4 minutes au niveau de la mer = 5,5 minutes à 2000 m :',
80
80
  },
81
81
  {
82
82
  type: 'paragraph',
83
- html: 'Lors de la préparation d\'un plat complexe, vous devez coordonner plusieurs tâches : four, plaque, repos. Chacune nécessite son propre temps et sa propre alerte :',
83
+ html: 'Lors de la préparation d\'un plat complexe, vous devez coordonner plusieurs tâches: four, plaque, repos. Chacune nécessite son propre temps et sa propre alerte :',
84
84
  },
85
85
  {
86
86
  type: 'title',
87
- text: 'Sauuces, Émulsions et Techniques Classiques : Fondamentaux Français',
87
+ text: 'Sauuces, Émulsions et Techniques Classiques: Fondamentaux Français',
88
88
  level: 2,
89
89
  },
90
90
  {
@@ -139,7 +139,7 @@ export const content: CategoryLocaleContent = {
139
139
  },
140
140
  {
141
141
  type: 'paragraph',
142
- html: 'La gastronomie mondiale s\'oriente vers la <strong>précision instrumentée</strong>. Les chefs Michelin utilisent des thermomètres infrarouges, des balances de précision au gramme, des pH-mètres. Les cuisines professionnelles disposent de laboratoires d\'analyse des saveurs. Cette tendance atteint désormais les cuisines domestiques : applications de contrôle de la température, balances connectées, bases de données de recettes exactes. Ce n\'est plus réservé aux élites ; c\'est accessible à toute personne désireuse d\'apprendre.',
142
+ html: 'La gastronomie mondiale s\'oriente vers la <strong>précision instrumentée</strong>. Les chefs Michelin utilisent des thermomètres infrarouges, des balances de précision au gramme, des pH-mètres. Les cuisines professionnelles disposent de laboratoires d\'analyse des saveurs. Cette tendance atteint désormais les cuisines domestiques: applications de contrôle de la température, balances connectées, bases de données de recettes exactes. Ce n\'est plus réservé aux élites ; c\'est accessible à toute personne désireuse d\'apprendre.',
143
143
  },
144
144
  {
145
145
  type: 'list',
@@ -152,7 +152,7 @@ export const content: CategoryLocaleContent = {
152
152
  },
153
153
  {
154
154
  type: 'title',
155
- text: 'De débutant à expert : Le chemin de la maîtrise culinaire',
155
+ text: 'De débutant à expert: Le chemin de la maîtrise culinaire',
156
156
  level: 2,
157
157
  },
158
158
  {
@@ -175,16 +175,16 @@ export const content: CategoryLocaleContent = {
175
175
  },
176
176
  {
177
177
  type: 'paragraph',
178
- html: 'Pour la cuisine maison, la précision renforce la confiance. Vous savez que votre pizza fermentera correctement, que votre meringue ne s\'effondrera pas, que votre conserve ne sera pas contaminée. Pour les restaurants, c\'est une question de survie : ils doivent reproduire un plat 50 fois par soir avec une régularité parfaite. Pour l\'industrie alimentaire, il s\'agit d\'une réglementation obligatoire. Dans tous les cas, les connaissances techniques sont le facteur de différenciation.',
178
+ html: 'Pour la cuisine maison, la précision renforce la confiance. Vous savez que votre pizza fermentera correctement, que votre meringue ne s\'effondrera pas, que votre conserve ne sera pas contaminée. Pour les restaurants, c\'est une question de survie: ils doivent reproduire un plat 50 fois par soir avec une régularité parfaite. Pour l\'industrie alimentaire, il s\'agit d\'une réglementation obligatoire. Dans tous les cas, les connaissances techniques sont le facteur de différenciation.',
179
179
  },
180
180
  {
181
181
  type: 'title',
182
- text: 'L\'histoire derrière ces outils : Pourquoi la précision compte',
182
+ text: 'L\'histoire derrière ces outils: Pourquoi la précision compte',
183
183
  level: 2,
184
184
  },
185
185
  {
186
186
  type: 'paragraph',
187
- html: 'J\'ai conçu ces outils parce que j\'ai fait l\'erreur que vous ferez probablement : faire confiance à « une pincée de sel », « un peu plus d\'eau » et « jusqu\'à ce que ce soit prêt ». Dans une cuisine professionnelle, cela ne fonctionne pas. La science ne négocie pas avec l\'« approximativement ».',
187
+ html: 'J\'ai conçu ces outils parce que j\'ai fait l\'erreur que vous ferez probablement: faire confiance à " une pincée de sel ", " un peu plus d\'eau " et " jusqu\'à ce que ce soit prêt ". Dans une cuisine professionnelle, cela ne fonctionne pas. La science ne négocie pas avec l\'" approximativement ".',
188
188
  },
189
189
  {
190
190
  type: 'paragraph',
@@ -196,7 +196,7 @@ export const content: CategoryLocaleContent = {
196
196
  },
197
197
  {
198
198
  type: 'title',
199
- text: 'Investissement dans les connaissances culinaires : ROI à long terme',
199
+ text: 'Investissement dans les connaissances culinaires: ROI à long terme',
200
200
  level: 2,
201
201
  },
202
202
  {
@@ -12,7 +12,7 @@ export const content: CategoryLocaleContent = {
12
12
  },
13
13
  {
14
14
  type: 'paragraph',
15
- html: 'Профессиональная кухня это не интуиция; это <strong>прикладная химия</strong>. Каждое измерение, каждая температура и каждое время напрямую влияют на конечный результат. Ошибка в гидратации теста всего на 5% дает совершенно иную текстуру.',
15
+ html: 'Профессиональная кухня - это не интуиция; это <strong>прикладная химия</strong>. Каждое измерение, каждая температура и каждое время напрямую влияют на конечный результат. Ошибка в гидратации теста всего на 5% дает совершенно иную текстуру.',
16
16
  },
17
17
  {
18
18
  type: 'paragraph',
@@ -25,11 +25,11 @@ export const content: CategoryLocaleContent = {
25
25
  },
26
26
  {
27
27
  type: 'paragraph',
28
- html: 'Пицца это не магия; это инженерия. Гидратация теста напрямую определяет структуру мякиша, растяжимость и хруст. Рассчитайте точную формулу для муки, воды, соли и дрожжей.',
28
+ html: 'Пицца - это не магия; это инженерия. Гидратация теста напрямую определяет структуру мякиша, растяжимость и хруст. Рассчитайте точную формулу для муки, воды, соли и дрожжей.',
29
29
  },
30
30
  {
31
31
  type: 'paragraph',
32
- html: 'Поддержание живой закваски требует биологического понимания. Освежения, температура, график все имеет значение. Используйте этот инструмент, чтобы понять соотношение 1:1:1 и время брожения.',
32
+ html: 'Поддержание живой закваски требует биологического понимания. Освежения, температура, график - все имеет значение. Используйте этот инструмент, чтобы понять соотношение 1:1:1 и время брожения.',
33
33
  },
34
34
  {
35
35
  type: 'title',
@@ -84,10 +84,10 @@ export const content: CategoryLocaleContent = {
84
84
  {
85
85
  type: 'list',
86
86
  items: [
87
- '<strong>Фаза 1 Основы:</strong> изучение конвертации единиц, понимание базовых пропорций (соотношения хлеба, теста, соусов).',
88
- '<strong>Фаза 2 Специфические техники:</strong> освоение контролируемой ферментации, идеальных эмульсий, безопасной консервации.',
89
- '<strong>Фаза 3 Обоснованные инновации:</strong> экспериментирование на основе прочного фундамента знаний.',
90
- '<strong>Фаза 4 Стабильное совершенство:</strong> достижение воспроизводимости. Каждое блюдо так же идеально, как предыдущее.',
87
+ '<strong>Фаза 1 - Основы:</strong> изучение конвертации единиц, понимание базовых пропорций (соотношения хлеба, теста, соусов).',
88
+ '<strong>Фаза 2 - Специфические техники:</strong> освоение контролируемой ферментации, идеальных эмульсий, безопасной консервации.',
89
+ '<strong>Фаза 3 - Обоснованные инновации:</strong> экспериментирование на основе прочного фундамента знаний.',
90
+ '<strong>Фаза 4 - Стабильное совершенство:</strong> достижение воспроизводимости. Каждое блюдо так же идеально, как предыдущее.',
91
91
  ],
92
92
  },
93
93
  ],
@@ -16,7 +16,7 @@ export const content: CategoryLocaleContent = {
16
16
  },
17
17
  {
18
18
  type: 'paragraph',
19
- html: '我们的工具旨在消除猜测。它们基于<strong>真实的科学流程</strong>:SCA 标准、烘焙百分比、分子化学、发酵微生物学。这些不是“厨房小窍门”,而是经过验证的科学。',
19
+ html: '我们的工具旨在消除猜测。它们基于<strong>真实的科学流程</strong>:SCA 标准、烘焙百分比、分子化学、发酵微生物学。这些不是"厨房小窍门",而是经过验证的科学。',
20
20
  },
21
21
  {
22
22
  type: 'title',
@@ -11,6 +11,7 @@ import { ingredientRescaler } from '../tool/ingredient-rescaler/entry';
11
11
  import { sourdoughCalculator } from '../tool/sourdough-calculator/entry';
12
12
  import { rouxGuide } from '../tool/roux-guide/entry';
13
13
  import { cookwareGuide } from '../tool/cookware-guide/entry';
14
+ import { lactoFermentationSalt } from '../tool/lacto-fermentation-salt-calculator/entry';
14
15
 
15
16
  export const cookingCategory: CookingCategoryEntry = {
16
17
  icon: 'mdi:chef-hat',
@@ -27,6 +28,7 @@ export const cookingCategory: CookingCategoryEntry = {
27
28
  sourdoughCalculator,
28
29
  rouxGuide,
29
30
  cookwareGuide,
31
+ lactoFermentationSalt,
30
32
  ],
31
33
  i18n: {
32
34
  es: () => import('./i18n/es').then((m) => m.content),
package/src/entries.ts CHANGED
@@ -11,6 +11,7 @@ export { pizza } from './tool/pizza/entry';
11
11
  export { rouxGuide } from './tool/roux-guide/entry';
12
12
  export { sourdoughCalculator } from './tool/sourdough-calculator/entry';
13
13
  export { yeastConverter } from './tool/yeast-converter/entry';
14
+ export { lactoFermentationSalt } from './tool/lacto-fermentation-salt-calculator/entry';
14
15
  export { cookingCategory } from './category';
15
16
  import { americanKitchenConverter } from './tool/american-kitchen-converter/entry';
16
17
  import { bananaCare } from './tool/banana-ripeness/entry';
@@ -25,4 +26,5 @@ import { pizza } from './tool/pizza/entry';
25
26
  import { rouxGuide } from './tool/roux-guide/entry';
26
27
  import { sourdoughCalculator } from './tool/sourdough-calculator/entry';
27
28
  import { yeastConverter } from './tool/yeast-converter/entry';
28
- export const ALL_ENTRIES = [americanKitchenConverter, bananaCare, brine, cookwareGuide, eggTimer, ingredientRescaler, kitchenTimer, meringuePeak, moldScaler, pizza, rouxGuide, sourdoughCalculator, yeastConverter];
29
+ import { lactoFermentationSalt } from './tool/lacto-fermentation-salt-calculator/entry';
30
+ export const ALL_ENTRIES = [americanKitchenConverter, bananaCare, brine, cookwareGuide, eggTimer, ingredientRescaler, kitchenTimer, meringuePeak, moldScaler, pizza, rouxGuide, sourdoughCalculator, yeastConverter, lactoFermentationSalt];
package/src/index.ts CHANGED
@@ -14,6 +14,7 @@ export { SOURDOUGH_CALCULATOR_TOOL } from './tool/sourdough-calculator';
14
14
  export { ROUX_GUIDE_TOOL } from './tool/roux-guide';
15
15
  export { COOKWARE_GUIDE_TOOL } from './tool/cookware-guide';
16
16
  export { YEAST_CONVERTER_TOOL } from './tool/yeast-converter';
17
+ export { LACTO_FERMENTATION_SALT_TOOL } from './tool/lacto-fermentation-salt-calculator';
17
18
 
18
19
  export type {
19
20
  KnownLocale,
@@ -32,8 +32,8 @@ describe("i18n titles for FAQ", () => {
32
32
  }
33
33
  });
34
34
 
35
- it("should have 13 tools with complete i18n setup", async () => {
36
- expect(ALL_TOOLS.length).toBe(13);
35
+ it("should have 14 tools with complete i18n setup", async () => {
36
+ expect(ALL_TOOLS.length).toBe(14);
37
37
  });
38
38
 
39
39
  it("tool IDs should be correctly registered", () => {
@@ -50,5 +50,6 @@ describe("i18n titles for FAQ", () => {
50
50
  expect(toolIds).toContain("sourdough-calculator");
51
51
  expect(toolIds).toContain("roux-guide");
52
52
  expect(toolIds).toContain("cookware-guide");
53
+ expect(toolIds).toContain("lacto-fermentation-salt-calculator");
53
54
  });
54
55
  });
@@ -0,0 +1,64 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { FermentationLogic } from '../tool/lacto-fermentation-salt-calculator/logic';
3
+
4
+ describe('Lacto-Fermentation Salt Calculator Logic', () => {
5
+ it('calculates correct dry salting values', () => {
6
+ const res = FermentationLogic.calculate({
7
+ vegWeight: 1000,
8
+ waterWeight: 0,
9
+ salinity: 2.5,
10
+ mode: 'dry',
11
+ });
12
+ expect(res.saltGrams).toBe(25);
13
+ expect(res.status).toBe('optimal');
14
+ });
15
+
16
+ it('calculates correct wet brining values', () => {
17
+ const res = FermentationLogic.calculate({
18
+ vegWeight: 1000,
19
+ waterWeight: 500,
20
+ salinity: 2.0,
21
+ mode: 'wet',
22
+ });
23
+ expect(res.saltGrams).toBe(30);
24
+ expect(res.status).toBe('optimal');
25
+ });
26
+
27
+ it('correctly classifies status based on salinity thresholds', () => {
28
+ const dangerRes = FermentationLogic.calculate({
29
+ vegWeight: 1000,
30
+ waterWeight: 0,
31
+ salinity: 1.5,
32
+ mode: 'dry',
33
+ });
34
+ expect(dangerRes.status).toBe('danger');
35
+
36
+ const optimalRes = FermentationLogic.calculate({
37
+ vegWeight: 1000,
38
+ waterWeight: 0,
39
+ salinity: 3.0,
40
+ mode: 'dry',
41
+ });
42
+ expect(optimalRes.status).toBe('optimal');
43
+
44
+ const inhibitedRes = FermentationLogic.calculate({
45
+ vegWeight: 1000,
46
+ waterWeight: 0,
47
+ salinity: 4.0,
48
+ mode: 'dry',
49
+ });
50
+ expect(inhibitedRes.status).toBe('inhibited');
51
+ });
52
+
53
+ it('calculates volumetric conversions accurately', () => {
54
+ const res = FermentationLogic.calculate({
55
+ vegWeight: 1000,
56
+ waterWeight: 0,
57
+ salinity: 2.0,
58
+ mode: 'dry',
59
+ });
60
+ expect(res.saltGrams).toBe(20);
61
+ expect(res.fineTeaspoons).toBe(3.5);
62
+ expect(res.kosherTeaspoons).toBe(4.7);
63
+ });
64
+ });
@@ -24,8 +24,8 @@ describe('Locale Completeness Validation', () => {
24
24
  });
25
25
  });
26
26
 
27
- it('all 13 tools registered', () => {
28
- expect(ALL_TOOLS.length).toBe(13);
27
+ it('all 14 tools registered', () => {
28
+ expect(ALL_TOOLS.length).toBe(14);
29
29
  });
30
30
  });
31
31
 
@@ -0,0 +1,70 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+
5
+ function getFiles(dir: string): string[] {
6
+ const results: string[] = [];
7
+ if (!fs.existsSync(dir)) {
8
+ return results;
9
+ }
10
+ const list = fs.readdirSync(dir);
11
+ for (const file of list) {
12
+ const fullPath = path.join(dir, file);
13
+ const stat = fs.statSync(fullPath);
14
+ if (stat && stat.isDirectory()) {
15
+ if (file !== 'tests' && file !== 'node_modules' && file !== '.astro') {
16
+ results.push(...getFiles(fullPath));
17
+ }
18
+ } else {
19
+ results.push(fullPath);
20
+ }
21
+ }
22
+ return results;
23
+ }
24
+
25
+ function isContentFile(filePath: string): boolean {
26
+ return /\\i18n\\/.test(filePath) || filePath.endsWith('bibliography.ts');
27
+ }
28
+
29
+ const srcDir = path.join(process.cwd(), 'src');
30
+ const scriptsDir = path.join(process.cwd(), 'scripts');
31
+ const filesToTest = [
32
+ ...getFiles(srcDir).filter(isContentFile),
33
+ ...getFiles(scriptsDir).filter(isContentFile),
34
+ ];
35
+
36
+ const aiTypographyGarbage = [
37
+ '\u2013',
38
+ '\u2014',
39
+ '\u2026',
40
+ '\u201C',
41
+ '\u201D',
42
+ '\u2018',
43
+ '\u2019',
44
+ '\u00AB',
45
+ '\u00BB',
46
+ '\u200B',
47
+ '\u201E',
48
+ ];
49
+
50
+ describe('Typography Garbage Character Validation', () => {
51
+ filesToTest.forEach((filePath) => {
52
+ const relativePath = path.relative(process.cwd(), filePath);
53
+ it(`should not contain typography garbage characters in ${relativePath}`, () => {
54
+ const content = fs.readFileSync(filePath, 'utf-8');
55
+ const hasAiPatterns = aiTypographyGarbage.some(char => content.includes(char));
56
+ expect(hasAiPatterns).toBe(false);
57
+ });
58
+
59
+ it(`should not contain space before colon in ${relativePath}`, () => {
60
+ const content = fs.readFileSync(filePath, 'utf-8');
61
+ const spaceBeforeColon = / : /.test(content);
62
+ expect(spaceBeforeColon).toBe(false);
63
+ });
64
+
65
+ it(`should not contain double hyphen in ${relativePath}`, () => {
66
+ const content = fs.readFileSync(filePath, 'utf-8');
67
+ expect(content).not.toContain('--');
68
+ });
69
+ });
70
+ });
@@ -4,8 +4,8 @@ import { cookingCategory } from '../data';
4
4
 
5
5
  describe('Tool Validation Suite', () => {
6
6
  describe('Library Registration', () => {
7
- it('should have 13 tools in ALL_TOOLS', () => {
8
- expect(ALL_TOOLS.length).toBe(13);
7
+ it('should have 14 tools in ALL_TOOLS', () => {
8
+ expect(ALL_TOOLS.length).toBe(14);
9
9
  });
10
10
 
11
11
  it('cookingCategory should be defined', () => {
@@ -18,7 +18,7 @@ const faq = [
18
18
  },
19
19
  {
20
20
  question: "Is a US cup the same as an imperial cup?",
21
- answer: "No. A US cup is 236ml, whereas an Imperial (UK) cup is 284mla 20% difference! Most online recipes use US cups. If not specified, the US standard is the safest assumption.",
21
+ answer: "No. A US cup is 236ml, whereas an Imperial (UK) cup is 284ml-a 20% difference! Most online recipes use US cups. If not specified, the US standard is the safest assumption.",
22
22
  },
23
23
  {
24
24
  question: "What temperature is 'Gas Mark 4'?",
@@ -190,7 +190,7 @@ export const content: ToolLocaleContent = {
190
190
  },
191
191
  {
192
192
  question: "Is a US cup the same as an imperial cup?",
193
- answer: "No. A US cup is 236ml, whereas an Imperial (UK) cup is 284mla 20% difference! Most online recipes use US cups. If not specified, the US standard is the safest assumption.",
193
+ answer: "No. A US cup is 236ml, whereas an Imperial (UK) cup is 284ml-a 20% difference! Most online recipes use US cups. If not specified, the US standard is the safest assumption.",
194
194
  },
195
195
  {
196
196
  question: "What temperature is 'Gas Mark 4'?",
@@ -1,7 +1,7 @@
1
1
  import type { ToolLocaleContent } from "../../../types";
2
2
  import { bibliography } from '../bibliography';
3
3
 
4
- const title = "Convertisseur de Cuisine Américaine : Cups en Grammes, Fahrenheit";
4
+ const title = "Convertisseur de Cuisine Américaine: Cups en Grammes, Fahrenheit";
5
5
  const description = "Convertissez les cups, tablespoons et Fahrenheit en système métrique. Votre boussole pour décoder les recettes américaines avec une précision professionnelle.";
6
6
  const faq = [
7
7
  {
@@ -78,7 +78,7 @@ const appSchema = {
78
78
 
79
79
  export const content: ToolLocaleContent = {
80
80
  slug: "convertisseur-mesures-cuisine-americaine-cups-grammes",
81
- title: "Convertisseur de Cuisine Américaine : Cups en Grammes, Fahrenheit",
81
+ title: "Convertisseur de Cuisine Américaine: Cups en Grammes, Fahrenheit",
82
82
  description:
83
83
  "Convertissez les cups, tablespoons et Fahrenheit en système métrique. Votre boussole pour décoder les recettes américaines avec une précision professionnelle.",
84
84
  ui: {
@@ -32,7 +32,7 @@ const howTo = [
32
32
  },
33
33
  {
34
34
  name: 'Wybierz produkt',
35
- text: 'Każdy produkt ma inną gęstość. Mąka, cukier, masło każdy z nich waży inaczej w tej samej objętości.',
35
+ text: 'Każdy produkt ma inną gęstość. Mąka, cukier, masło - każdy z nich waży inaczej w tej samej objętości.',
36
36
  },
37
37
  {
38
38
  name: 'Wpisz ilość',
@@ -331,7 +331,7 @@ export const content: ToolLocaleContent = {
331
331
  },
332
332
  {
333
333
  name: 'Wybierz produkt',
334
- text: 'Każdy produkt ma inną gęstość. Mąka, cukier, masło każdy z nich waży inaczej w tej samej objętości.',
334
+ text: 'Każdy produkt ma inną gęstość. Mąka, cukier, masło - każdy z nich waży inaczej w tej samej objętości.',
335
335
  },
336
336
  {
337
337
  name: 'Wpisz ilość',
@@ -17,12 +17,12 @@ const faq = [
17
17
  answer: '1 Tablespoon (Tbsp / столовая ложка) = 15 мл. 1 Teaspoon (tsp / чайная ложка) = 5 мл. Столовая ложка в 3 раза больше чайной. В кондитерском деле ошибки со специями (которые измеряются в tsp) очень часто ведут к неудаче.',
18
18
  },
19
19
  {
20
- question: 'Американская чашка и имперская чашка это одно и то же?',
20
+ question: 'Американская чашка и имперская чашка - это одно и то же?',
21
21
  answer: 'Нет. 1 американская чашка = 236 мл. 1 имперская чашка (UK) = 284 мл. Разница составляет 20%. Большинство американских блогов используют US cups. Если в рецепте не указано иное, считайте, что это американские чашки.',
22
22
  },
23
23
  {
24
24
  question: 'Какой температуре соответствует "газ 4" в духовке?',
25
- answer: 'Газ 4 = 180°C = 350°F. Это британская шкала. В рецептах мы ищем эквивалентное значение для вашей духовки: некоторые используют газовые деления, другие электронную установку градусов.',
25
+ answer: 'Газ 4 = 180°C = 350°F. Это британская шкала. В рецептах мы ищем эквивалентное значение для вашей духовки: некоторые используют газовые деления, другие - электронную установку градусов.',
26
26
  },
27
27
  ];
28
28
  const howTo = [
@@ -32,7 +32,7 @@ const howTo = [
32
32
  },
33
33
  {
34
34
  name: 'Выберите ингредиент',
35
- text: 'У каждого продукта своя плотность. Мука, сахар, масло все они весят по-разному при одном и том же объеме.',
35
+ text: 'У каждого продукта своя плотность. Мука, сахар, масло - все они весят по-разному при одном и том же объеме.',
36
36
  },
37
37
  {
38
38
  name: 'Введите количество',
@@ -159,19 +159,19 @@ export const content: ToolLocaleContent = {
159
159
  tempFahrenheitAriaLabel: 'Фаренгейт',
160
160
  tempCelsiusAriaLabel: 'Цельсий',
161
161
  tempPreset275: '275°F',
162
- tempPreset275Desc: '135°C Сушка',
162
+ tempPreset275Desc: '135°C - Сушка',
163
163
  tempPreset275AriaLabel: 'Установить 275 Фаренгейт',
164
164
  tempPreset325: '325°F',
165
- tempPreset325Desc: '165°C Плотные кексы',
165
+ tempPreset325Desc: '165°C - Плотные кексы',
166
166
  tempPreset325AriaLabel: 'Установить 325 Фаренгейт',
167
167
  tempPreset350: '350°F',
168
- tempPreset350Desc: '175°C Стандарт для выпечки',
168
+ tempPreset350Desc: '175°C - Стандарт для выпечки',
169
169
  tempPreset350AriaLabel: 'Установить 350 Фаренгейт',
170
170
  tempPreset400: '400°F',
171
- tempPreset400Desc: '200°C Хлеб / Пироги',
171
+ tempPreset400Desc: '200°C - Хлеб / Пироги',
172
172
  tempPreset400AriaLabel: 'Установить 400 Фаренгейт',
173
173
  tempPreset425: '425°F',
174
- tempPreset425Desc: '220°C Пицца / Слоеное тесто',
174
+ tempPreset425Desc: '220°C - Пицца / Слоеное тесто',
175
175
  tempPreset425AriaLabel: 'Установить 425 Фаренгейт',
176
176
  },
177
177
  seo: [
@@ -182,7 +182,7 @@ export const content: ToolLocaleContent = {
182
182
  },
183
183
  {
184
184
  type: 'paragraph',
185
- html: 'Перевод <strong>чашек в граммы</strong> или <strong>Фаренгейтов в Цельсии</strong> первый шаг к освоению международных рецептов. Американская кулинария основана на объеме, что создает погрешность до 25% в сухих ингредиентах, таких как мука.',
185
+ html: 'Перевод <strong>чашек в граммы</strong> или <strong>Фаренгейтов в Цельсии</strong> - первый шаг к освоению международных рецептов. Американская кулинария основана на объеме, что создает погрешность до 25% в сухих ингредиентах, таких как мука.',
186
186
  },
187
187
  {
188
188
  type: 'stats',
@@ -264,7 +264,7 @@ export const content: ToolLocaleContent = {
264
264
  type: 'diagnostic',
265
265
  variant: 'warning',
266
266
  title: 'Бисквит получился сухим?',
267
- html: 'Самая частая проблема при использовании чашек зачерпывание муки прямо из пакета. Это уплотняет порошок, и вы можете добавить до 40г лишней муки на каждую чашку. Решение <strong>всегда переводить в граммы</strong> с помощью нашего конвертера.',
267
+ html: 'Самая частая проблема при использовании чашек - зачерпывание муки прямо из пакета. Это уплотняет порошок, и вы можете добавить до 40г лишней муки на каждую чашку. Решение - <strong>всегда переводить в граммы</strong> с помощью нашего конвертера.',
268
268
  },
269
269
  {
270
270
  type: 'title',
@@ -316,12 +316,12 @@ export const content: ToolLocaleContent = {
316
316
  answer: '1 Tablespoon (Tbsp / столовая ложка) = 15 мл. 1 Teaspoon (tsp / чайная ложка) = 5 мл. Столовая ложка в 3 раза больше чайной. В кондитерском деле ошибки со специями (которые измеряются в tsp) очень часто ведут к неудаче.',
317
317
  },
318
318
  {
319
- question: 'Американская чашка и имперская чашка это одно и то же?',
319
+ question: 'Американская чашка и имперская чашка - это одно и то же?',
320
320
  answer: 'Нет. 1 американская чашка = 236 мл. 1 имперская чашка (UK) = 284 мл. Разница составляет 20%. Большинство американских блогов используют US cups. Если в рецепте не указано иное, считайте, что это американские чашки.',
321
321
  },
322
322
  {
323
323
  question: 'Какой температуре соответствует "газ 4" в духовке?',
324
- answer: 'Газ 4 = 180°C = 350°F. Это британская шкала. В рецептах мы ищем эквивалентное значение для вашей духовки: некоторые используют газовые деления, другие электронную установку градусов.',
324
+ answer: 'Газ 4 = 180°C = 350°F. Это британская шкала. В рецептах мы ищем эквивалентное значение для вашей духовки: некоторые используют газовые деления, другие - электронную установку градусов.',
325
325
  },
326
326
  ],
327
327
  howTo: [
@@ -331,7 +331,7 @@ export const content: ToolLocaleContent = {
331
331
  },
332
332
  {
333
333
  name: 'Выберите ингредиент',
334
- text: 'У каждого продукта своя плотность. Мука, сахар, масло все они весят по-разному при одном и том же объеме.',
334
+ text: 'У каждого продукта своя плотность. Мука, сахар, масло - все они весят по-разному при одном и том же объеме.',
335
335
  },
336
336
  {
337
337
  name: 'Введите количество',
@@ -32,7 +32,7 @@ const howTo = [
32
32
  },
33
33
  {
34
34
  name: 'Välj ingrediens',
35
- text: 'Varje livsmedel har olika densitet. Mjöl, socker, smör alla väger olika mycket.',
35
+ text: 'Varje livsmedel har olika densitet. Mjöl, socker, smör - alla väger olika mycket.',
36
36
  },
37
37
  {
38
38
  name: 'Ange mängd',
@@ -331,7 +331,7 @@ export const content: ToolLocaleContent = {
331
331
  },
332
332
  {
333
333
  name: 'Välj ingrediens',
334
- text: 'Varje livsmedel har olika densitet. Mjöl, socker, smör alla väger olika mycket.',
334
+ text: 'Varje livsmedel har olika densitet. Mjöl, socker, smör - alla väger olika mycket.',
335
335
  },
336
336
  {
337
337
  name: 'Ange mängd',
@@ -21,7 +21,7 @@ const faq = [
21
21
  answer: "不一样。1美制量杯 = 236毫升,而1英制量杯(英国)= 284毫升。两者相差20%。大多数美国博主使用的是美制标准。如果食谱未注明,请默认按美制计算。",
22
22
  },
23
23
  {
24
- question: "烤箱的“gas 4”对应多少度?",
24
+ question: '烤箱的"gas 4"对应多少度?',
25
25
  answer: "Gas 4 = 180°C = 350°F。这是英国常用的燃气刻度。在厨房中,请对应您烤箱的具体刻度或电子显示进行调整。",
26
26
  },
27
27
  ];
@@ -264,7 +264,7 @@ export const content: ToolLocaleContent = {
264
264
  type: 'diagnostic',
265
265
  variant: 'warning',
266
266
  title: "您的蛋糕做出来太干吗?",
267
- html: "使用量杯时最常见的问题是直接“用杯子在袋子里舀”面粉。这会压实粉末,导致您每杯面粉多加了多达40克。解决方法是<strong>始终使用我们的转换器将其换算为克</strong>。",
267
+ html: '使用量杯时最常见的问题是直接"用杯子在袋子里舀"面粉。这会压实粉末,导致您每杯面粉多加了多达40克。解决方法是<strong>始终使用我们的转换器将其换算为克</strong>。',
268
268
  },
269
269
  {
270
270
  type: 'title',
@@ -320,7 +320,7 @@ export const content: ToolLocaleContent = {
320
320
  answer: "不一样。1美制量杯 = 236毫升,而1英制量杯(英国)= 284毫升。两者相差20%。大多数美国博主使用的是美制标准。如果食谱未注明,请默认按美制计算。",
321
321
  },
322
322
  {
323
- question: "烤箱的“gas 4”对应多少度?",
323
+ question: '烤箱的"gas 4"对应多少度?',
324
324
  answer: "Gas 4 = 180°C = 350°F。这是英国常用的燃气刻度。在厨房中,请对应您烤箱的具体刻度或电子显示进行调整。",
325
325
  },
326
326
  ],