@jjlmoya/utils-cooking 1.10.0 → 1.12.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 (33) hide show
  1. package/package.json +58 -58
  2. package/src/tests/schemas_fulfillment.test.ts +23 -0
  3. package/src/tests/title_quality.test.ts +55 -0
  4. package/src/tool/american-kitchen-converter/i18n/fr.ts +1 -1
  5. package/src/tool/banana-ripeness/i18n/fr.ts +86 -86
  6. package/src/tool/brine/component.astro +20 -22
  7. package/src/tool/cookware-guide/component.astro +22 -6
  8. package/src/tool/cookware-guide/i18n/en.ts +2 -2
  9. package/src/tool/cookware-guide/i18n/es.ts +3 -3
  10. package/src/tool/cookware-guide/i18n/fr.ts +109 -110
  11. package/src/tool/ingredient-rescaler/component.astro +8 -3
  12. package/src/tool/ingredient-rescaler/i18n/en.ts +74 -97
  13. package/src/tool/ingredient-rescaler/i18n/es.ts +77 -100
  14. package/src/tool/kitchen-timer/component.astro +27 -9
  15. package/src/tool/kitchen-timer/i18n/en.ts +6 -7
  16. package/src/tool/kitchen-timer/i18n/es.ts +7 -8
  17. package/src/tool/kitchen-timer/i18n/fr.ts +76 -77
  18. package/src/tool/kitchen-timer/init.ts +23 -6
  19. package/src/tool/kitchen-timer/lib/KitchenTimer.ts +20 -8
  20. package/src/tool/meringue-peak/component.astro +4 -4
  21. package/src/tool/meringue-peak/i18n/fr.ts +1 -1
  22. package/src/tool/mold-scaler/component.astro +17 -11
  23. package/src/tool/mold-scaler/i18n/en.ts +87 -60
  24. package/src/tool/mold-scaler/i18n/es.ts +87 -61
  25. package/src/tool/mold-scaler/i18n/fr.ts +97 -69
  26. package/src/tool/pizza/i18n/en.ts +2 -2
  27. package/src/tool/pizza/i18n/es.ts +2 -2
  28. package/src/tool/pizza/i18n/fr.ts +2 -2
  29. package/src/tool/roux-guide/i18n/en.ts +18 -1
  30. package/src/tool/roux-guide/i18n/es.ts +21 -4
  31. package/src/tool/roux-guide/i18n/fr.ts +18 -1
  32. package/src/tool/roux-guide/init.ts +55 -52
  33. package/src/tool/sourdough-calculator/i18n/es.ts +133 -133
package/package.json CHANGED
@@ -1,60 +1,60 @@
1
1
  {
2
- "name": "@jjlmoya/utils-cooking",
3
- "version": "1.10.0",
4
- "type": "module",
5
- "main": "./src/index.ts",
6
- "types": "./src/index.ts",
7
- "exports": {
8
- ".": "./src/index.ts",
9
- "./data": "./src/data.ts"
10
- },
11
- "files": [
12
- "src"
13
- ],
14
- "publishConfig": {
15
- "access": "public"
16
- },
17
- "scripts": {
18
- "dev": "astro dev",
19
- "start": "astro dev",
20
- "build": "astro build",
21
- "preview": "astro preview",
22
- "astro": "astro",
23
- "lint": "eslint src/ --max-warnings 0 && stylelint \"src/**/*.{css,astro}\"",
24
- "check": "astro check",
25
- "type-check": "astro check",
26
- "test": "vitest run",
27
- "preversion": "npm run lint && npm run test",
28
- "postversion": "git push && git push --tags",
29
- "patch": "npm version patch",
30
- "minor": "npm version minor",
31
- "major": "npm version major"
32
- },
33
- "lint-staged": {
34
- "*.{ts,tsx,astro}": [
35
- "eslint --fix"
36
- ]
37
- },
38
- "dependencies": {
39
- "@iconify-json/mdi": "^1.2.3",
40
- "@jjlmoya/utils-shared": "^1.1.0",
41
- "astro": "^6.1.2",
42
- "astro-icon": "^1.1.0"
43
- },
44
- "devDependencies": {
45
- "@astrojs/check": "^0.9.8",
46
- "eslint": "^9.39.4",
47
- "eslint-plugin-astro": "^1.6.0",
48
- "eslint-plugin-no-comments": "^1.1.10",
49
- "husky": "^9.1.7",
50
- "lint-staged": "^16.4.0",
51
- "postcss-html": "^1.8.1",
52
- "schema-dts": "^1.1.2",
53
- "stylelint": "^17.6.0",
54
- "stylelint-config-standard": "^40.0.0",
55
- "stylelint-declaration-strict-value": "^1.11.1",
56
- "typescript": "^5.4.0",
57
- "typescript-eslint": "^8.58.0",
58
- "vitest": "^4.1.2"
59
- }
2
+ "name": "@jjlmoya/utils-cooking",
3
+ "version": "1.12.0",
4
+ "type": "module",
5
+ "main": "./src/index.ts",
6
+ "types": "./src/index.ts",
7
+ "exports": {
8
+ ".": "./src/index.ts",
9
+ "./data": "./src/data.ts"
10
+ },
11
+ "files": [
12
+ "src"
13
+ ],
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "scripts": {
18
+ "dev": "astro dev",
19
+ "start": "astro dev",
20
+ "build": "astro build",
21
+ "preview": "astro preview",
22
+ "astro": "astro",
23
+ "lint": "eslint src/ --max-warnings 0 && stylelint \"src/**/*.{css,astro}\"",
24
+ "check": "astro check",
25
+ "type-check": "astro check",
26
+ "test": "vitest run",
27
+ "preversion": "npm run lint && npm run test",
28
+ "postversion": "git push && git push --tags",
29
+ "patch": "npm version patch",
30
+ "minor": "npm version minor",
31
+ "major": "npm version major"
32
+ },
33
+ "lint-staged": {
34
+ "*.{ts,tsx,astro}": [
35
+ "eslint --fix"
36
+ ]
37
+ },
38
+ "dependencies": {
39
+ "@iconify-json/mdi": "^1.2.3",
40
+ "@jjlmoya/utils-shared": "1.2.0",
41
+ "astro": "^6.1.2",
42
+ "astro-icon": "^1.1.0"
43
+ },
44
+ "devDependencies": {
45
+ "@astrojs/check": "^0.9.8",
46
+ "eslint": "^9.39.4",
47
+ "eslint-plugin-astro": "^1.6.0",
48
+ "eslint-plugin-no-comments": "^1.1.10",
49
+ "husky": "^9.1.7",
50
+ "lint-staged": "^16.4.0",
51
+ "postcss-html": "^1.8.1",
52
+ "schema-dts": "^1.1.2",
53
+ "stylelint": "^17.6.0",
54
+ "stylelint-config-standard": "^40.0.0",
55
+ "stylelint-declaration-strict-value": "^1.11.1",
56
+ "typescript": "^5.4.0",
57
+ "typescript-eslint": "^8.58.0",
58
+ "vitest": "^4.1.2"
59
+ }
60
60
  }
@@ -0,0 +1,23 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { ALL_TOOLS } from '../tools';
3
+ import type { ToolLocaleContent } from '../types';
4
+
5
+ describe('Schemas Fulfillment Validation', () => {
6
+ ALL_TOOLS.forEach((tool) => {
7
+ describe(`Tool: ${tool.entry.id}`, () => {
8
+ Object.keys(tool.entry.i18n).forEach((locale) => {
9
+ it(`Locale: ${locale} should have faqSchema, appSchema and howToSchema`, async () => {
10
+ const loader = tool.entry.i18n[locale as keyof typeof tool.entry.i18n];
11
+ if (!loader) return;
12
+ const content = (await loader()) as ToolLocaleContent;
13
+
14
+ const schemaTypes = content.schemas.map((s: any) => s['@type']);
15
+
16
+ expect(schemaTypes, `Tool "${tool.entry.id}" locale "${locale}" is missing FAQPage schema`).toContain('FAQPage');
17
+ expect(schemaTypes, `Tool "${tool.entry.id}" locale "${locale}" is missing SoftwareApplication schema`).toContain('SoftwareApplication');
18
+ expect(schemaTypes, `Tool "${tool.entry.id}" locale "${locale}" is missing HowTo schema`).toContain('HowTo');
19
+ });
20
+ });
21
+ });
22
+ });
23
+ });
@@ -0,0 +1,55 @@
1
+ import { describe, it } from 'vitest';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+
5
+ function getFiles(dir: string, ext: string[]): string[] {
6
+ const results: string[] = [];
7
+ if (!fs.existsSync(dir)) return results;
8
+ const list = fs.readdirSync(dir);
9
+ for (const file of list) {
10
+ const fullPath = path.join(dir, file);
11
+ const stat = fs.statSync(fullPath);
12
+ if (stat && stat.isDirectory()) {
13
+ results.push(...getFiles(fullPath, ext));
14
+ } else if (ext.some((e) => file.endsWith(e))) {
15
+ results.push(fullPath);
16
+ }
17
+ }
18
+ return results;
19
+ }
20
+
21
+ const SRC_DIR = path.join(process.cwd(), 'src');
22
+
23
+ describe('Project Titles - Separator Validation', () => {
24
+ const files = [
25
+ ...getFiles(path.join(SRC_DIR, 'tool'), ['.ts']),
26
+ ...getFiles(path.join(SRC_DIR, 'category'), ['.ts']),
27
+ ].filter(f => f.includes('i18n'));
28
+
29
+ it.each(files)('Verify that titles in %s do not contain | or -', (filePath) => {
30
+ const content = fs.readFileSync(filePath, 'utf-8');
31
+ const relativePath = path.relative(process.cwd(), filePath);
32
+
33
+ const titlePatterns = [
34
+ /const\s+title\s*=\s*['"]([^'"]+)['"]/g,
35
+ /title\s*:\s*['"]([^'"]+)['"]/g,
36
+ ];
37
+
38
+ const findings: string[] = [];
39
+
40
+ for (const pattern of titlePatterns) {
41
+ let match;
42
+ while ((match = pattern.exec(content)) !== null) {
43
+ const title = match[1]!;
44
+ if (title.includes('|') || title.includes('-')) {
45
+ findings.push(title);
46
+ }
47
+ }
48
+ }
49
+
50
+ if (findings.length > 0) {
51
+ const list = findings.map((f) => ` - "${f}"`).join('\n');
52
+ throw new Error(`Forbidden separators (| or -) found in titles in ${relativePath}:\n${list}`);
53
+ }
54
+ });
55
+ });
@@ -324,7 +324,7 @@ export const content: ToolLocaleContent = {
324
324
  {
325
325
  type: "diagnostic",
326
326
  variant: "warning",
327
- title: "Votre Gâteau est-il trop sec ?",
327
+ title: "Votre Gâteau est il trop sec ?",
328
328
  html: "L'erreur classique avec les cups est de plonger la tasse dans le sac de farine. Cela tasse la poudre et vous risquez d'ajouter 40g de farine excédentaire. La solution est de <strong>toujours convertir en grammes</strong>.",
329
329
  },
330
330
  {
@@ -1,41 +1,41 @@
1
1
  import type { ToolLocaleContent } from '../../../types';
2
2
 
3
- const title = "Banana Diagnostics and Conservation: Scientific Guide";
4
- const description = "Analyze your banana ripening stage with scientific precision. Learn conservation techniques, ethylene biochemistry, and nutritional optimization.";
3
+ const title = "Diagnostic et Conservation des Bananes : Guide Scientifique";
4
+ const description = "Analysez le stade de maturité de vos bananes avec une précision scientifique. Apprenez les techniques de conservation, la biochimie de l'éthylène et l'optimisation nutritionnelle.";
5
5
  const faq = [
6
6
  {
7
- question: 'Why do bananas turn black in the fridge?',
8
- answer: 'Cold breaks down cell walls in the peel, releasing enzymes that oxidize phenols and create black polyphenols. However, the inside usually stays firm and sweet longer than outside.',
7
+ question: 'Pourquoi les bananes deviennent-elles noires au réfrigérateur ?',
8
+ answer: "Le froid rompt les parois cellulaires de la peau, libérant des enzymes qui oxydent les phénols et créent des polyphénols noirs. Cependant, l'intérieur reste généralement ferme et sucré plus longtemps qu'à l'extérieur.",
9
9
  },
10
10
  {
11
- question: 'How can I ripen a banana quickly?',
12
- answer: 'Put them in a closed paper bag with an apple or tomato. These emit ethylene gas, which accelerates ripening. If in a hurry, you can put them in the oven at low temperature for a few minutes.',
11
+ question: 'Comment faire mûrir une banane rapidement ?',
12
+ answer: 'Placez-les dans un sac en papier fermé avec une pomme ou une tomate. Celles-ci émettent de l\'éthylène, un gaz qui accélère la maturité. Si vous êtes pressé, vous pouvez les mettre quelques minutes au four à basse température.',
13
13
  },
14
14
  {
15
- question: 'Is it safe to eat spotted bananas?',
16
- answer: 'Yes, totally. Spots indicate starch has converted to sugar, making them sweeter and more digestible. Only discard if they have mold, smell bad, or are excessively soft.',
15
+ question: 'Est-il prudent de manger des bananes tachetées ?',
16
+ answer: 'Oui, tout à fait. Les taches indiquent que l\'amidon s\'est transformé en sucre, les rendant plus sucrées et digestes. Ne les jetez que si elles présentent de la moisissure, une mauvaise odeur ou sont excessivement molles.',
17
17
  },
18
18
  {
19
- question: 'What is ethylene?',
20
- answer: 'It\'s a plant hormone in gas form that regulates growth and ripening. Banana is a climacteric fruit, meaning it continues producing ethylene and ripening after harvest.',
19
+ question: 'Qu\'est-ce que l\'éthylène ?',
20
+ answer: 'C\'est une hormone végétale sous forme de gaz qui régule la croissance et la maturation. La banane est un fruit climatérique, ce qui signifie qu\'elle continue à produire de l\'éthylène et à mûrir après sa récolte.',
21
21
  },
22
22
  ];
23
23
  const howTo = [
24
24
  {
25
- name: 'Observe the color',
26
- text: 'Carefully examine peel color, from green to dark brown, to determine current ripening stage.',
25
+ name: 'Observer la couleur',
26
+ text: 'Examinez attentivement la couleur de la peau, du vert au brun foncé, pour déterminer le stade actuel de maturité.',
27
27
  },
28
28
  {
29
- name: 'Use the simulator',
30
- text: 'Slide the ripeness indicator to see accurate predictions about when it reaches the next stage.',
29
+ name: 'Utiliser le simulateur',
30
+ text: 'Faites glisser l\'indicateur de maturité pour voir des prédictions précises sur le moment elle atteindra la prochaine étape.',
31
31
  },
32
32
  {
33
- name: 'Adjust conditions',
34
- text: 'Modify temperature and humidity to see how they affect ripening speed.',
33
+ name: 'Ajuster les conditions',
34
+ text: 'Modifiez la température et l\'humidité pour voir comment elles affectent la vitesse de maturation.',
35
35
  },
36
36
  {
37
- name: 'Apply conservation',
38
- text: 'Follow specific conservation and acceleration recommendations based on current stage.',
37
+ name: 'Appliquer la conservation',
38
+ text: 'Suivez les recommandations spécifiques de conservation et d\'accélération selon le stade actuel.',
39
39
  },
40
40
  ];
41
41
 
@@ -73,75 +73,75 @@ const appSchema = {
73
73
 
74
74
  export const content: ToolLocaleContent = {
75
75
  slug: 'banana-ripeness',
76
- title: 'Banana Diagnostics and Conservation: Scientific Guide',
77
- description: 'Analyze your banana ripening stage with scientific precision. Learn conservation techniques, ethylene biochemistry, and nutritional optimization.',
76
+ title: 'Diagnostic et Conservation des Bananes : Guide Scientifique',
77
+ description: 'Analysez le stade de maturité de vos bananes avec une précision scientifique. Apprenez les techniques de conservation, la biochimie de l\'éthylène et l\'optimisation nutritionnelle.',
78
78
  faqTitle: 'Questions Fréquemment Posées',
79
79
  bibliographyTitle: 'Sources et Références',
80
80
  ui: {
81
- ripesnessLabel: 'Ripeness State',
82
- nextStageLabel: 'Next Stage in',
83
- daysUnit: 'Days',
84
- tempLabel: 'Temperature',
85
- humidityLabel: 'Humidity',
86
- partnerToggleTitle: 'Climacteric Companion',
87
- partnerToggleSubtitle: 'External ethylene effect',
81
+ ripesnessLabel: 'État de Maturité',
82
+ nextStageLabel: 'Prochaine Étape dans',
83
+ daysUnit: 'Jours',
84
+ tempLabel: 'Température',
85
+ humidityLabel: 'Humidité',
86
+ partnerToggleTitle: 'Accompagnement Climatérique',
87
+ partnerToggleSubtitle: 'Effet de l\'éthylène externe',
88
88
  conservationTitle: 'Conservation',
89
- accelerationTitle: 'Acceleration',
90
- stage1Name: 'Emerald Green',
91
- stage1Desc: 'Maximum resistant starch content. Full firmness.',
92
- stage1Conservation: 'Room temperature (18-20°C). Avoid cold (<12°C).',
93
- stage1Acceleration: 'Paper bag with a ripe apple or tomato.',
94
- stage2Name: 'Radiant Yellow',
95
- stage2Desc: 'Perfect balance between firmness and initial sweetness.',
96
- stage2Conservation: 'Cool place, separate from bunch to slow ethylene.',
97
- stage2Acceleration: 'Keep in bunch and wrap in plastic.',
98
- stage3Name: 'Sweet Spotted',
99
- stage3Desc: 'Antioxidant peak. Intense sweetness and creamy texture.',
100
- stage3Conservation: 'Refrigerate to preserve pulp (though skin darkens).',
101
- stage3Acceleration: 'Gentle heat (near heat source, not direct).',
102
- stage4Name: 'Ripe Cinnamon',
103
- stage4Desc: 'Very soft texture. Ideal for sugar-free baking.',
104
- stage4Conservation: 'Peel and freeze immediately.',
105
- stage4Acceleration: 'Already reached its peak.',
106
- stage5Name: 'Overripe / Fermented',
107
- stage5Desc: 'Advanced degradation process.',
108
- stage5Conservation: 'Not recommended for direct consumption.',
89
+ accelerationTitle: 'Accélération',
90
+ stage1Name: 'Vert Émeraude',
91
+ stage1Desc: 'Teneur maximale en amidon résistant. Fermeté totale.',
92
+ stage1Conservation: 'Température ambiante (18-20°C). Éviter le froid (<12°C).',
93
+ stage1Acceleration: 'Sac en papier avec une pomme ou une tomate mûre.',
94
+ stage2Name: 'Jaune Éclatant',
95
+ stage2Desc: 'Équilibre parfait entre fermeté et douceur initiale.',
96
+ stage2Conservation: 'Endroit frais, séparer du régime pour ralentir l\'éthylène.',
97
+ stage2Acceleration: 'Garder en régime et envelopper dans du plastique.',
98
+ stage3Name: 'Tachetée Sucrée',
99
+ stage3Desc: 'Pic d\'antioxydants. Douceur intense et texture crémeuse.',
100
+ stage3Conservation: 'Réfrigérer pour préserver la pulpe (bien que la peau noircisse).',
101
+ stage3Acceleration: 'Chaleur douce (près d\'une source de chaleur, pas directe).',
102
+ stage4Name: 'Mûre Cannelle',
103
+ stage4Desc: 'Texture très molle. Idéal pour la pâtisserie sans sucre.',
104
+ stage4Conservation: 'Éplucher et congeler immédiatement.',
105
+ stage4Acceleration: 'A déjà atteint son apogée.',
106
+ stage5Name: 'Trop Mûre / Fermentée',
107
+ stage5Desc: 'Processus de dégradation avancé.',
108
+ stage5Conservation: 'Non recommandé pour la consommation directe.',
109
109
  stage5Acceleration: 'N/A',
110
110
  },
111
111
  faq: [
112
112
  {
113
- question: 'Why do bananas turn black in the fridge?',
114
- answer: 'Cold breaks down cell walls in the peel, releasing enzymes that oxidize phenols and create black polyphenols. However, the inside usually stays firm and sweet longer than outside.',
113
+ question: 'Pourquoi les bananes deviennent-elles noires au réfrigérateur ?',
114
+ answer: "Le froid rompt les parois cellulaires de la peau, libérant des enzymes qui oxydent les phénols et créent des polyphénols noirs. Cependant, l'intérieur reste généralement ferme et sucré plus longtemps qu'à l'extérieur.",
115
115
  },
116
116
  {
117
- question: 'How can I ripen a banana quickly?',
118
- answer: 'Put them in a closed paper bag with an apple or tomato. These emit ethylene gas, which accelerates ripening. If in a hurry, you can put them in the oven at low temperature for a few minutes.',
117
+ question: 'Comment faire mûrir une banane rapidement ?',
118
+ answer: 'Placez-les dans un sac en papier fermé avec une pomme ou une tomate. Celles-ci émettent de l\'éthylène, un gaz qui accélère la maturité. Si vous êtes pressé, vous pouvez les mettre quelques minutes au four à basse température.',
119
119
  },
120
120
  {
121
- question: 'Is it safe to eat spotted bananas?',
122
- answer: 'Yes, totally. Spots indicate starch has converted to sugar, making them sweeter and more digestible. Only discard if they have mold, smell bad, or are excessively soft.',
121
+ question: 'Est-il prudent de manger des bananes tachetées ?',
122
+ answer: 'Oui, tout à fait. Les taches indiquent que l\'amidon s\'est transformé en sucre, les rendant plus sucrées et digestes. Ne les jetez que si elles présentent de la moisissure, une mauvaise odeur ou sont excessivement molles.',
123
123
  },
124
124
  {
125
- question: 'What is ethylene?',
126
- answer: 'It\'s a plant hormone in gas form that regulates growth and ripening. Banana is a climacteric fruit, meaning it continues producing ethylene and ripening after harvest.',
125
+ question: 'Qu\'est-ce que l\'éthylène ?',
126
+ answer: 'C\'est une hormone végétale sous forme de gaz qui régule la croissance et la maturation. La banane est un fruit climatérique, ce qui signifie qu\'elle continue à produire de l\'éthylène et à mûrir après sa récolte.',
127
127
  },
128
128
  ],
129
129
  howTo: [
130
130
  {
131
- name: 'Observe the color',
132
- text: 'Carefully examine peel color, from green to dark brown, to determine current ripening stage.',
131
+ name: 'Observer la couleur',
132
+ text: 'Examinez attentivement la couleur de la peau, du vert au brun foncé, pour déterminer le stade actuel de maturité.',
133
133
  },
134
134
  {
135
- name: 'Use the simulator',
136
- text: 'Slide the ripeness indicator to see accurate predictions about when it reaches the next stage.',
135
+ name: 'Utiliser le simulateur',
136
+ text: 'Faites glisser l\'indicateur de maturité pour voir des prédictions précises sur le moment elle atteindra la prochaine étape.',
137
137
  },
138
138
  {
139
- name: 'Adjust conditions',
140
- text: 'Modify temperature and humidity to see how they affect ripening speed.',
139
+ name: 'Ajuster les conditions',
140
+ text: 'Modifiez la température et l\'humidité pour voir comment elles affectent la vitesse de maturation.',
141
141
  },
142
142
  {
143
- name: 'Apply conservation',
144
- text: 'Follow specific conservation and acceleration recommendations based on current stage.',
143
+ name: 'Appliquer la conservation',
144
+ text: 'Suivez les recommandations spécifiques de conservation et d\'accélération selon le stade actuel.',
145
145
  },
146
146
  ],
147
147
  bibliography: [
@@ -161,87 +161,87 @@ export const content: ToolLocaleContent = {
161
161
  seo: [
162
162
  {
163
163
  type: 'title',
164
- text: 'Science of Ripening in Musa × paradisiaca',
164
+ text: 'Science de la maturation chez la Musa × paradisiaca',
165
165
  level: 2,
166
166
  },
167
167
  {
168
168
  type: 'paragraph',
169
- html: 'Banana is one of the most consumed fruits in the world, yet also one of the most biologically misunderstood. Unlike non-climacteric fruits like citrus or grapes, banana is a <strong>climacteric fruit</strong>. This means it continues ripening after harvest, drastically increasing cellular respiration and production of a critical gaseous phytohormone: <strong>ethylene</strong>.',
169
+ html: 'La banane est l\'un des fruits les plus consommés au monde, mais aussi l\'un des plus mal compris biologiquement. Contrairement aux fruits non climatériques comme les agrumes ou les raisins, la banane est un <strong>fruit climatérique</strong>. Cela signifie qu\'elle continue à mûrir après la récolte, augmentant considérablement la respiration cellulaire et la production d\'une phytohormone gazeuse cruciale : <strong>l\'éthylène</strong>.',
170
170
  },
171
171
  {
172
172
  type: 'paragraph',
173
- html: 'From a biochemical perspective, ripening is a cascade of enzymatic events. During this process, enzymes like amylase break down complex carbohydrates (starches) into simple sugars (fructose, glucose, and sucrose). This change not only alters flavor, making it sweeter, but also modifies texture by degrading pectin in cell walls, resulting in that soft, creamy consistency characterizing ripe banana.',
173
+ html: 'D\'un point de vue biochimique, la maturation est une cascade d\'événements enzymatiques. Au cours de ce processus, des enzymes comme l\'amylase décomposent les glucides complexes (amidons) en sucres simples (fructose, glucose et saccharose). Ce changement alterne non seulement la saveur, la rendant plus sucrée, mais modifie également la texture en dégradant la pectine des parois cellulaires, ce qui donne cette consistance douce et crémeuse caractérisant la banane mûre.',
174
174
  },
175
175
  {
176
176
  type: 'title',
177
- text: 'The Ethylene Cycle',
177
+ text: 'Le Cycle de l\'Éthylène',
178
178
  level: 3,
179
179
  },
180
180
  {
181
181
  type: 'paragraph',
182
- html: 'Ethylene functions as a biological switch. Once fruit detects small ethylene concentration, it activates genes responsible for producing more ethylene, creating a positive feedback loop. This is why a very ripe banana accelerates ripening of all neighbors in the fruit bowl. To slow this process, it\'s vital to isolate specimens already showing brown spots from those still green.',
182
+ html: 'L\'éthylène fonctionne comme un interrupteur biologique. Une fois que le fruit détecte une faible concentration d\'éthylène, il active les gènes responsables de la production de plus d\'éthylène, créant une boucle de rétroaction positive. C\'est pourquoi une banane très mûre accélère la maturation de toutes ses voisines dans le compotier. Pour ralentir ce processus, il est vital d\'isoler les spécimens présentant déjà des taches brunes de ceux encore verts.',
183
183
  },
184
184
  {
185
185
  type: 'title',
186
- text: 'The Refrigerator Myth',
186
+ text: 'Le Mythe du Réfrigérateur',
187
187
  level: 3,
188
188
  },
189
189
  {
190
190
  type: 'paragraph',
191
- html: 'There\'s a popular belief that bananas shouldn\'t go in the fridge. Reality is more complex: cold (below 12°C) causes chilling injury in peel cells, releasing enzymes that oxidize phenols and turn skin black. However, this only affects appearance. If the inside has already reached desired ripeness, cold will almost completely halt pulp softening, preserving flavor and texture for several additional days.',
191
+ html: 'Il existe une croyance populaire selon laquelle les bananes ne devraient pas aller au réfrigérateur. La réalité est plus complexe : le froid (en dessous de 12°C) cause des dommages dus au refroidissement dans les cellules de la peau, libérant des enzymes qui oxydent les phénols et font noircir la peau. Cependant, cela n\'affecte que l\'apparence. Si l\'intérieur a déjà atteint la maturité souhaitée, le froid arrêtera presque complètement le ramollissement de la pulpe, préservant la saveur et la texture pendant plusieurs jours supplémentaires.',
192
192
  },
193
193
  {
194
194
  type: 'title',
195
- text: 'Advanced Conservation Strategies',
195
+ text: 'Stratégies de Conservation Avancées',
196
196
  level: 3,
197
197
  },
198
198
  {
199
199
  type: 'paragraph',
200
- html: '<strong>Crown Wrapping:</strong> Wrapping the stem of a banana bunch with plastic wrap dramatically reduces ethylene release, extending commercial shelf life by up to 72 additional hours.',
200
+ html: '<strong>Emballage de la couronne :</strong> Envelopper la tige d\'un régime de bananes avec du film plastique réduit considérablement la libération d\'éthylène, prolongeant la durée de conservation commerciale jusqu\'à 72 heures supplémentaires.',
201
201
  },
202
202
  {
203
203
  type: 'paragraph',
204
- html: '<strong>Dynamic Suspension:</strong> Hanging bananas prevents pressure bruising. Damaged tissues release ethylene faster, creating hotspots of accelerated ripening that spread through the fruit.',
204
+ html: '<strong>Suspension Dynamique :</strong> Suspendre les bananes évite les meurtrissures dues à la pression. Les tissus endommagés libèrent de l\'éthylène plus rapidement, créant des points chauds de maturation accélérée qui se propagent à travers le fruit.',
205
205
  },
206
206
  {
207
207
  type: 'paragraph',
208
- html: '<strong>Cryotherapy (Freezing):</strong> For bananas in stage 4 (brown), freezing is best option. Peeling fruit before freezing prevents trapped moisture, maintaining fiber quality.',
208
+ html: '<strong>Cryothérapie (Congélation) :</strong> Pour les bananes au stade 4 (brune), la congélation est la meilleure option. Éplucher le fruit avant de le congeler empêche l\'humidité d\'être piégée, préservant la qualité des fibres.',
209
209
  },
210
210
  {
211
211
  type: 'title',
212
- text: 'Nutritional Changes by Stage',
212
+ text: 'Changements Nutritionnels par Étape',
213
213
  level: 2,
214
214
  },
215
215
  {
216
216
  type: 'paragraph',
217
- html: 'As banana ripens, its nutritional profile transforms dramatically, allowing it to be used as a specific dietary tool according to consumer objectives.',
217
+ html: 'À mesure que la banane mûrit, son profil nutritionnel se transforme radicalement, ce qui lui permet d\'être utilisée comme un outil diététique spécifique selon les objectifs du consommateur.',
218
218
  },
219
219
  {
220
220
  type: 'table',
221
- headers: ['Stage', 'Resistant Starch', 'Characteristics', 'Main Benefit'],
221
+ headers: ['Stade', 'Amidons Résistants', 'Caractéristiques', 'Bénéfice Principal'],
222
222
  rows: [
223
- ['Green (1-2)', '~80%', 'Very firm, maximum starch content', 'Gut health and glycemic control'],
224
- ['Yellow (3)', '~5%', 'Balance of firmness and sweetness', 'Quick energy and B vitamins'],
225
- ['Spotted (4)', 'Minimal', 'Very soft, high sugar content', 'Maximum antioxidant potential'],
226
- ['Brown/Overripe (5)', 'Practically none', 'Very soft texture, advanced fermentation', 'Not recommended for consumption'],
223
+ ['Vert (1-2)', '~80%', 'Très ferme, teneur maximale en amidon', 'Santé intestinale et contrôle glycémique'],
224
+ ['Jaune (3)', '~5%', 'Équilibre entre fermeté et douceur', 'Énergie rapide et vitamines B'],
225
+ ['Tachetée (4)', 'Minimal', 'Très molle, haute teneur en sucre', 'Potentiel antioxydant maximal'],
226
+ ['Brune (5)', 'Pratiquement nul', 'Texture très molle, fermentation avancée', 'Non recommandé pour la consommation'],
227
227
  ],
228
228
  },
229
229
  {
230
230
  type: 'title',
231
- text: 'Conclusion and Practical Application',
231
+ text: 'Conclusion et Application Pratique',
232
232
  level: 2,
233
233
  },
234
234
  {
235
235
  type: 'list',
236
236
  items: [
237
- '<strong>Reduce food waste:</strong> Precise banana stage diagnosis enables identifying optimal consumption moment, preventing valuable fruit loss.',
238
- '<strong>Optimize nutritional benefits:</strong> From resistant starch in green for gut health to antioxidants in spotted for maximum antioxidant potential.',
239
- '<strong>Plan strategic consumption:</strong> Adapt banana use according to your health objectives: glycemic control, quick energy, digestion, or antioxidants.',
237
+ '<strong>Réduire le gaspillage alimentaire :</strong> Un diagnostic précis du stade de la banane permet d\'identifier le moment de consommation optimal, évitant ainsi la perte de fruits précieux.',
238
+ '<strong>Optimiser les bénéfices nutritionnels :</strong> De l\'amidon résistant des bananes vertes pour la santé intestinale aux antioxydants des bananes tachetées pour un potentiel antioxydant maximal.',
239
+ '<strong>Planifier une consommation stratégique :</strong> Adaptez l\'utilisation des bananes selon vos objectifs de santé : contrôle glycémique, énergie rapide, digestion ou antioxydants.',
240
240
  ],
241
241
  },
242
242
  {
243
243
  type: 'tip',
244
- html: '<strong>Degradation Alert:</strong> External factors like relative humidity over 85% or temperatures above 25°C can drastically accelerate degradation, taking banana from optimal to inedible in hours. This simulator helps you anticipate these changes and plan strategically.',
244
+ html: '<strong>Alerte de Dégradation :</strong> Des facteurs externes comme une humidité relative supérieure à 85 % ou des températures supérieures à 25 °C peuvent accélérer considérablement la dégradation, faisant passer la banane d\'optimale à immangeable en quelques heures. Ce simulateur vous aide à anticiper ces changements et à planifier de manière stratégique.',
245
245
  },
246
246
  ],
247
247
  schemas: [faqSchema, howToSchema, appSchema],