@jjlmoya/utils-hardware 1.16.0 → 1.18.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 (111) hide show
  1. package/package.json +1 -1
  2. package/src/category/i18n/de.ts +4 -4
  3. package/src/category/i18n/id.ts +3 -3
  4. package/src/category/i18n/it.ts +3 -3
  5. package/src/category/i18n/nl.ts +3 -3
  6. package/src/category/i18n/pl.ts +4 -4
  7. package/src/category/i18n/pt.ts +3 -3
  8. package/src/category/i18n/ru.ts +6 -6
  9. package/src/category/i18n/sv.ts +3 -3
  10. package/src/category/i18n/tr.ts +3 -3
  11. package/src/category/i18n/zh.ts +3 -3
  12. package/src/category/index.ts +2 -1
  13. package/src/entries.ts +4 -1
  14. package/src/index.ts +1 -0
  15. package/src/layouts/PreviewLayout.astro +1 -0
  16. package/src/tests/diacritics_density.test.ts +118 -0
  17. package/src/tests/inverted_punctuation.test.ts +84 -0
  18. package/src/tests/locale_completeness.test.ts +2 -2
  19. package/src/tests/no_en_dash.test.ts +70 -0
  20. package/src/tests/no_h1_in_components.test.ts +1 -1
  21. package/src/tests/script_density.test.ts +94 -0
  22. package/src/tests/tool_validation.test.ts +2 -2
  23. package/src/tool/batteryHealthEstimator/bibliography.ts +8 -8
  24. package/src/tool/batteryHealthEstimator/i18n/de.ts +1 -1
  25. package/src/tool/batteryHealthEstimator/i18n/en.ts +1 -1
  26. package/src/tool/batteryHealthEstimator/i18n/fr.ts +5 -5
  27. package/src/tool/batteryHealthEstimator/i18n/id.ts +1 -1
  28. package/src/tool/batteryHealthEstimator/i18n/nl.ts +1 -1
  29. package/src/tool/batteryHealthEstimator/i18n/pl.ts +2 -2
  30. package/src/tool/batteryHealthEstimator/i18n/pt.ts +1 -1
  31. package/src/tool/batteryHealthEstimator/i18n/ru.ts +5 -5
  32. package/src/tool/batteryHealthEstimator/i18n/sv.ts +1 -1
  33. package/src/tool/batteryHealthEstimator/i18n/tr.ts +1 -1
  34. package/src/tool/batteryHealthEstimator/i18n/zh.ts +1 -1
  35. package/src/tool/colorAccuracyTest/bibliography.astro +14 -0
  36. package/src/tool/colorAccuracyTest/bibliography.ts +16 -0
  37. package/src/tool/colorAccuracyTest/color-accuracy-test.css +841 -0
  38. package/src/tool/colorAccuracyTest/component.astro +157 -0
  39. package/src/tool/colorAccuracyTest/entry.ts +29 -0
  40. package/src/tool/colorAccuracyTest/i18n/de.ts +284 -0
  41. package/src/tool/colorAccuracyTest/i18n/en.ts +284 -0
  42. package/src/tool/colorAccuracyTest/i18n/es.ts +284 -0
  43. package/src/tool/colorAccuracyTest/i18n/fr.ts +284 -0
  44. package/src/tool/colorAccuracyTest/i18n/id.ts +284 -0
  45. package/src/tool/colorAccuracyTest/i18n/it.ts +284 -0
  46. package/src/tool/colorAccuracyTest/i18n/ja.ts +284 -0
  47. package/src/tool/colorAccuracyTest/i18n/ko.ts +284 -0
  48. package/src/tool/colorAccuracyTest/i18n/nl.ts +284 -0
  49. package/src/tool/colorAccuracyTest/i18n/pl.ts +284 -0
  50. package/src/tool/colorAccuracyTest/i18n/pt.ts +284 -0
  51. package/src/tool/colorAccuracyTest/i18n/ru.ts +284 -0
  52. package/src/tool/colorAccuracyTest/i18n/sv.ts +284 -0
  53. package/src/tool/colorAccuracyTest/i18n/tr.ts +284 -0
  54. package/src/tool/colorAccuracyTest/i18n/zh.ts +284 -0
  55. package/src/tool/colorAccuracyTest/index.ts +9 -0
  56. package/src/tool/colorAccuracyTest/logic.ts +226 -0
  57. package/src/tool/colorAccuracyTest/seo.astro +15 -0
  58. package/src/tool/colorAccuracyTest/ui.ts +27 -0
  59. package/src/tool/deadPixelTest/i18n/ru.ts +6 -6
  60. package/src/tool/deadPixelTest/i18n/sv.ts +1 -1
  61. package/src/tool/deadPixelTest/i18n/zh.ts +5 -5
  62. package/src/tool/gamepadTest/gamepad-test.css +171 -3
  63. package/src/tool/gamepadTest/i18n/es.ts +4 -4
  64. package/src/tool/gamepadTest/i18n/ru.ts +2 -2
  65. package/src/tool/gamepadTest/i18n/zh.ts +1 -1
  66. package/src/tool/gamepadVibrationTester/bibliography.ts +8 -8
  67. package/src/tool/gamepadVibrationTester/i18n/es.ts +1 -1
  68. package/src/tool/gamepadVibrationTester/i18n/fr.ts +2 -2
  69. package/src/tool/gamepadVibrationTester/i18n/ru.ts +3 -3
  70. package/src/tool/keyboardTest/keyboard-test.css +115 -2
  71. package/src/tool/mousePollingTest/bibliography.ts +8 -8
  72. package/src/tool/mousePollingTest/i18n/de.ts +1 -1
  73. package/src/tool/mousePollingTest/i18n/en.ts +1 -1
  74. package/src/tool/mousePollingTest/i18n/es.ts +1 -1
  75. package/src/tool/mousePollingTest/i18n/fr.ts +3 -3
  76. package/src/tool/mousePollingTest/i18n/id.ts +1 -1
  77. package/src/tool/mousePollingTest/i18n/it.ts +1 -1
  78. package/src/tool/mousePollingTest/i18n/ja.ts +1 -1
  79. package/src/tool/mousePollingTest/i18n/ko.ts +1 -1
  80. package/src/tool/mousePollingTest/i18n/nl.ts +1 -1
  81. package/src/tool/mousePollingTest/i18n/pl.ts +2 -2
  82. package/src/tool/mousePollingTest/i18n/pt.ts +1 -1
  83. package/src/tool/mousePollingTest/i18n/ru.ts +3 -3
  84. package/src/tool/mousePollingTest/i18n/sv.ts +1 -1
  85. package/src/tool/mousePollingTest/i18n/tr.ts +1 -1
  86. package/src/tool/mousePollingTest/i18n/zh.ts +2 -2
  87. package/src/tool/refreshRateDetector/bibliography.ts +3 -11
  88. package/src/tool/refreshRateDetector/i18n/de.ts +3 -3
  89. package/src/tool/refreshRateDetector/i18n/en.ts +3 -3
  90. package/src/tool/refreshRateDetector/i18n/fr.ts +7 -7
  91. package/src/tool/refreshRateDetector/i18n/id.ts +3 -3
  92. package/src/tool/refreshRateDetector/i18n/nl.ts +3 -3
  93. package/src/tool/refreshRateDetector/i18n/pl.ts +2 -2
  94. package/src/tool/refreshRateDetector/i18n/pt.ts +3 -3
  95. package/src/tool/refreshRateDetector/i18n/ru.ts +4 -4
  96. package/src/tool/refreshRateDetector/i18n/sv.ts +3 -3
  97. package/src/tool/refreshRateDetector/i18n/tr.ts +2 -2
  98. package/src/tool/refreshRateDetector/i18n/zh.ts +2 -2
  99. package/src/tool/toneGenerator/bibliography.ts +8 -8
  100. package/src/tool/toneGenerator/i18n/de.ts +1 -1
  101. package/src/tool/toneGenerator/i18n/en.ts +1 -1
  102. package/src/tool/toneGenerator/i18n/fr.ts +3 -3
  103. package/src/tool/toneGenerator/i18n/id.ts +1 -1
  104. package/src/tool/toneGenerator/i18n/it.ts +1 -1
  105. package/src/tool/toneGenerator/i18n/nl.ts +1 -1
  106. package/src/tool/toneGenerator/i18n/pl.ts +2 -2
  107. package/src/tool/toneGenerator/i18n/pt.ts +1 -1
  108. package/src/tool/toneGenerator/i18n/ru.ts +4 -4
  109. package/src/tool/toneGenerator/i18n/sv.ts +1 -1
  110. package/src/tool/toneGenerator/i18n/zh.ts +3 -3
  111. package/src/tools.ts +2 -1
@@ -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
+ });
@@ -40,7 +40,7 @@ describe('No H1 in Components', () => {
40
40
  const content = readFileSync(file, 'utf-8');
41
41
  expect(
42
42
  hasH1(content),
43
- `File "${relativePath}" contains a <h1> element. Use <h2> or lower inside components h1 belongs to the page layout.`,
43
+ `File "${relativePath}" contains a <h1> element. Use <h2> or lower inside components -h1 belongs to the page layout.`,
44
44
  ).toBe(false);
45
45
  });
46
46
  });
@@ -0,0 +1,94 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { ALL_TOOLS } from '../tools';
3
+
4
+ type ScriptLocale = keyof typeof SCRIPT_RULES;
5
+
6
+ const SCRIPT_RULES = {
7
+ ja: {
8
+ language: 'Japanese',
9
+ scriptName: 'kana/kanji',
10
+ scriptCharacters: /[\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Han}]/gu,
11
+ minScriptRatio: 0.45,
12
+ },
13
+ ko: {
14
+ language: 'Korean',
15
+ scriptName: 'hangul',
16
+ scriptCharacters: /\p{Script=Hangul}/gu,
17
+ minScriptRatio: 0.55,
18
+ },
19
+ ru: {
20
+ language: 'Russian',
21
+ scriptName: 'cyrillic',
22
+ scriptCharacters: /\p{Script=Cyrillic}/gu,
23
+ minScriptRatio: 0.65,
24
+ },
25
+ zh: {
26
+ language: 'Chinese',
27
+ scriptName: 'han',
28
+ scriptCharacters: /\p{Script=Han}/gu,
29
+ minScriptRatio: 0.45,
30
+ },
31
+ } as const;
32
+
33
+ const LETTERS = /\p{L}/gu;
34
+ const TRANSLATABLE_KEYS = ['title', 'description', 'ui', 'seo', 'faq', 'howTo'] as const;
35
+
36
+ function collectStrings(value: unknown): string[] {
37
+ if (typeof value === 'string') return [value];
38
+ if (!value || typeof value !== 'object') return [];
39
+ if (Array.isArray(value)) return value.flatMap(collectStrings);
40
+ return Object.values(value).flatMap(collectStrings);
41
+ }
42
+
43
+ function normalizeText(value: unknown): string {
44
+ return collectStrings(value).join(' ').normalize('NFC');
45
+ }
46
+
47
+ function translatableContent(content: Record<string, unknown>) {
48
+ return TRANSLATABLE_KEYS.map((key) => content[key]);
49
+ }
50
+
51
+ function letterCount(text: string): number {
52
+ return text.match(LETTERS)?.length ?? 0;
53
+ }
54
+
55
+ function scriptCount(text: string, locale: ScriptLocale): number {
56
+ return text.match(SCRIPT_RULES[locale].scriptCharacters)?.length ?? 0;
57
+ }
58
+
59
+ function scriptRatio(text: string, locale: ScriptLocale): number {
60
+ const letters = letterCount(text);
61
+ if (letters === 0) return 0;
62
+ return scriptCount(text, locale) / letters;
63
+ }
64
+
65
+ describe('Native script density validation', () => {
66
+ ALL_TOOLS.forEach((tool) => {
67
+ describe(`Tool: ${tool.entry.id}`, () => {
68
+ Object.keys(SCRIPT_RULES).forEach((locale) => {
69
+ it(`${locale} keeps most translated text in its native script`, async () => {
70
+ const typedLocale = locale as ScriptLocale;
71
+ const loader = tool.entry.i18n[typedLocale];
72
+ if (!loader) return;
73
+
74
+ const content = await loader();
75
+ const rule = SCRIPT_RULES[typedLocale];
76
+ const text = normalizeText(translatableContent(content as Record<string, unknown>));
77
+ const letters = letterCount(text);
78
+ const matches = scriptCount(text, typedLocale);
79
+ const ratio = scriptRatio(text, typedLocale);
80
+
81
+ expect(
82
+ ratio,
83
+ [
84
+ `Possible broken translation detected in ${tool.entry.id}/${typedLocale} (${rule.language}).`,
85
+ `The text has ${matches} ${rule.scriptName} characters out of ${letters} analyzed letters (${(ratio * 100).toFixed(1)}%).`,
86
+ `Most translatable content should be written in ${rule.scriptName} script.`,
87
+ 'Non-translatable fields such as slug, bibliography, and schemas are ignored to avoid false positives.',
88
+ ].join(' '),
89
+ ).toBeGreaterThanOrEqual(rule.minScriptRatio);
90
+ });
91
+ });
92
+ });
93
+ });
94
+ });
@@ -4,8 +4,8 @@ import { hardwareCategory } from '../data';
4
4
 
5
5
  describe('Tool Validation Suite', () => {
6
6
  describe('Library Registration', () => {
7
- it('should have 8 tools in ALL_TOOLS', () => {
8
- expect(ALL_TOOLS.length).toBe(8);
7
+ it('should have 9 tools in ALL_TOOLS', () => {
8
+ expect(ALL_TOOLS.length).toBe(9);
9
9
  });
10
10
 
11
11
  it('hardwareCategory should be defined', () => {
@@ -2,12 +2,12 @@ import type { BibliographyEntry } from '../../../types';
2
2
 
3
3
  export const bibliography: BibliographyEntry[] = [
4
4
 
5
- {
6
- name: 'Journal of Power Sources',
7
- url: 'https://www.sciencedirect.com/journal/journal-of-power-sources',
8
- },
9
- {
10
- name: 'IEEE Xplore Lithium-Ion Battery Life Prediction',
11
- url: 'https://ieeexplore.ieee.org/abstract/document/11090151',
12
- },
5
+ {
6
+ name: 'Journal of Power Sources',
7
+ url: 'https://www.sciencedirect.com/journal/journal-of-power-sources',
8
+ },
9
+ {
10
+ name: 'IEEE Xplore -Lithium-Ion Battery Life Prediction',
11
+ url: 'https://ieeexplore.ieee.org/abstract/document/11090151',
12
+ },
13
13
  ];
@@ -143,6 +143,6 @@ export const content: ToolLocaleContent<EstimadorSaludBateriaUI> = {
143
143
  recVoltageHigh: 'Vermeiden Sie es, die Batterie über längere Zeit bei 100 % Ladung (4,2 V) zu halten.',
144
144
  recVoltageLow: 'Tiefe Entladungen vermeiden; Zyklen zwischen 20 % und 80 % verdoppeln die Lebensdauer.',
145
145
  recSohLow: 'Kapazität ist unter den optimalen Standard gefallen. Erwägen Sie einen Austausch, wenn die Autonomie nicht ausreicht.',
146
- recDefault: 'Behalten Sie Ihre aktuellen Gewohnheiten bei Ihre Batterie befindet sich in einem idealen Betriebsbereich.',
146
+ recDefault: 'Behalten Sie Ihre aktuellen Gewohnheiten bei -Ihre Batterie befindet sich in einem idealen Betriebsbereich.',
147
147
  },
148
148
  };
@@ -143,6 +143,6 @@ export const content: ToolLocaleContent<EstimadorSaludBateriaUI> = {
143
143
  recVoltageHigh: 'Avoid keeping the battery at 100% charge (4.2V) for extended periods.',
144
144
  recVoltageLow: 'Avoid deep discharges; cycles between 20% and 80% double battery life.',
145
145
  recSohLow: 'Capacity has dropped below the optimal standard. Consider a replacement if autonomy is insufficient.',
146
- recDefault: 'Keep your current habits your battery is in an ideal operating range.',
146
+ recDefault: 'Keep your current habits -your battery is in an ideal operating range.',
147
147
  },
148
148
  };
@@ -93,7 +93,7 @@ export const content: ToolLocaleContent<EstimadorSaludBateriaUI> = {
93
93
  schemas: [faqSchema, howToSchema, appSchema],
94
94
  bibliography,
95
95
  seo: [
96
- { type: 'title', text: 'La chimie du temps : pourquoi les batteries lithium meurent', level: 2 },
96
+ { type: 'title', text: 'La chimie du temps: pourquoi les batteries lithium meurent', level: 2 },
97
97
  {
98
98
  type: 'paragraph',
99
99
  html: "Une batterie lithium-ion n'est pas une boîte d'énergie statique, mais un écosystème chimique dynamique en dégradation constante depuis sa fabrication. Chaque cycle de charge et décharge, chaque variation de température et chaque minute à des tensions extrêmes contribue à la formation de sous-produits qui entravent le flux d'ions.",
@@ -103,7 +103,7 @@ export const content: ToolLocaleContent<EstimadorSaludBateriaUI> = {
103
103
  type: 'paragraph',
104
104
  html: "<strong>Couche SEI :</strong> l'interface électrolyte solide croît avec le temps, consomme du lithium actif et augmente la résistance interne. <strong>Oxydation de l'électrolyte :</strong> des tensions supérieures à 4,1V accélèrent l'oxydation et peuvent gonfler la batterie. <strong>Lithium Plating :</strong> charger à basse température dépose du lithium sous forme métallique, créant des dendrites qui peuvent percer le séparateur.",
105
105
  },
106
- { type: 'title', text: "Le mythe des 100% : pourquoi charger toute la nuit est une erreur", level: 3 },
106
+ { type: 'title', text: "Le mythe des 100%: pourquoi charger toute la nuit est une erreur", level: 3 },
107
107
  {
108
108
  type: 'paragraph',
109
109
  html: "Pour un ion lithium, être à 100% de charge (4,2V) est un état de haute tension. Les recherches montrent que la durée de vie double ou triple si l'on maintient l'appareil entre <strong>20% et 80%</strong>. De plus, pour chaque hausse de 10°C au-dessus de 25°C, la vitesse de dégradation chimique double approximativement.",
@@ -111,7 +111,7 @@ export const content: ToolLocaleContent<EstimadorSaludBateriaUI> = {
111
111
  { type: 'title', text: 'Protocole de survie énergétique', level: 3 },
112
112
  {
113
113
  type: 'paragraph',
114
- html: "Ne chargez jamais une batterie en dessous de 0°C : le lithium se dépose sur l'anode, causant des dommages permanents. La charge rapide génère de la chaleur localisée et du stress mécanique ; utilisez-la uniquement en cas de stricte nécessité. Pour un stockage prolongé, conservez la batterie à 50% dans un endroit frais.",
114
+ html: "Ne chargez jamais une batterie en dessous de 0°C: le lithium se dépose sur l'anode, causant des dommages permanents. La charge rapide génère de la chaleur localisée et du stress mécanique ; utilisez-la uniquement en cas de stricte nécessité. Pour un stockage prolongé, conservez la batterie à 50% dans un endroit frais.",
115
115
  },
116
116
  ],
117
117
  ui: {
@@ -122,7 +122,7 @@ export const content: ToolLocaleContent<EstimadorSaludBateriaUI> = {
122
122
  voltageLabel: 'Tension Actuelle',
123
123
  cyclesLabel: 'Cycles de Charge',
124
124
  tempLabel: 'Température',
125
- voltageHint: 'Plage nominale : 3,0V (vide) à 4,2V (plein).',
125
+ voltageHint: 'Plage nominale: 3,0V (vide) à 4,2V (plein).',
126
126
  labelUsefulLife: 'Durée de Vie',
127
127
  yearsPrefix: 'Est.',
128
128
  yearsSuffix: 'ans',
@@ -143,6 +143,6 @@ export const content: ToolLocaleContent<EstimadorSaludBateriaUI> = {
143
143
  recVoltageHigh: "Évitez de maintenir la batterie à 100% de charge (4,2V) pendant de longues périodes.",
144
144
  recVoltageLow: "Évitez les décharges profondes ; les cycles entre 20% et 80% doublent la durée de vie.",
145
145
  recSohLow: "La capacité est tombée en dessous du standard optimal. Envisagez un remplacement si l'autonomie est insuffisante.",
146
- recDefault: "Maintenez vos habitudes actuelles votre batterie est dans une plage de fonctionnement idéale.",
146
+ recDefault: "Maintenez vos habitudes actuelles -votre batterie est dans une plage de fonctionnement idéale.",
147
147
  },
148
148
  };
@@ -143,6 +143,6 @@ export const content: ToolLocaleContent<EstimadorSaludBateriaUI> = {
143
143
  recVoltageHigh: 'Hindari menjaga baterai pada daya 100% (4.2V) untuk waktu yang lama.',
144
144
  recVoltageLow: 'Hindari pengosongan daya yang dalam; siklus antara 20% dan 80% menggandakan masa pakai baterai.',
145
145
  recSohLow: 'Kapasitas telah turun di bawah standar optimal. Pertimbangkan penggantian jika otonomi tidak mencukupi.',
146
- recDefault: 'Pertahankan kebiasaan Anda saat ini baterai Anda berada dalam rentang operasi yang ideal.',
146
+ recDefault: 'Pertahankan kebiasaan Anda saat ini -baterai Anda berada dalam rentang operasi yang ideal.',
147
147
  },
148
148
  };
@@ -143,6 +143,6 @@ export const content: ToolLocaleContent<EstimadorSaludBateriaUI> = {
143
143
  recVoltageHigh: 'Vermijd het langdurig op 100% lading (4,2 V) houden van de batterij.',
144
144
  recVoltageLow: 'Vermijd diepe ontladingen; cycli tussen 20% en 80% verdubbelen de levensduur van de batterij.',
145
145
  recSohLow: 'De capaciteit is onder de optimale standaard gezakt. Overweeg vervanging als de autonomie onvoldoende is.',
146
- recDefault: 'Houd uw huidige gewoonten aan uw batterij bevindt zich in een ideaal werkingsbereik.',
146
+ recDefault: 'Houd uw huidige gewoonten aan -uw batterij bevindt zich in een ideaal werkingsbereik.',
147
147
  },
148
148
  };
@@ -106,7 +106,7 @@ export const content: ToolLocaleContent<EstimadorSaludBateriaUI> = {
106
106
  { type: 'title', text: 'Mit 100%: dlaczego ładowanie przez noc to błąd', level: 3 },
107
107
  {
108
108
  type: 'paragraph',
109
- html: 'Dla jonu litu stan naładowania 100% (4.2V) jest stanem wysokiego stresu. Badania pokazują, że żywotność cyklu wzrasta dwu- lub trzykrotnie przy utrzymywaniu urządzenia w zakresie <strong>20% 80%</strong>. Ponadto na każde 10°C powyżej 25°C tempo degradacji chemicznej wzrasta około dwukrotnie.',
109
+ html: 'Dla jonu litu stan naładowania 100% (4.2V) jest stanem wysokiego stresu. Badania pokazują, że żywotność cyklu wzrasta dwu- lub trzykrotnie przy utrzymywaniu urządzenia w zakresie <strong>20% - 80%</strong>. Ponadto na każde 10°C powyżej 25°C tempo degradacji chemicznej wzrasta około dwukrotnie.',
110
110
  },
111
111
  { type: 'title', text: 'Protokół przetrwania energii', level: 3 },
112
112
  {
@@ -143,6 +143,6 @@ export const content: ToolLocaleContent<EstimadorSaludBateriaUI> = {
143
143
  recVoltageHigh: 'Unikaj trzymania baterii naładowanej w 100% (4.2V) przez dłuższy czas.',
144
144
  recVoltageLow: 'Unikaj głębokich rozładowań; cykle między 20% a 80% podwajają żywotność baterii.',
145
145
  recSohLow: 'Pojemność spadła poniżej optymalnego standardu. Rozważ wymianę, jeśli czas pracy jest niewystarczający.',
146
- recDefault: 'Utrzymuj obecne nawyki Twoja bateria pracuje w idealnym zakresie.',
146
+ recDefault: 'Utrzymuj obecne nawyki -Twoja bateria pracuje w idealnym zakresie.',
147
147
  },
148
148
  };
@@ -143,6 +143,6 @@ export const content: ToolLocaleContent<EstimadorSaludBateriaUI> = {
143
143
  recVoltageHigh: 'Evite manter a bateria com 100% de carga (4.2V) por períodos prolongados.',
144
144
  recVoltageLow: 'Evite descargas profundas; ciclos entre 20% e 80% duplicam a vida útil da bateria.',
145
145
  recSohLow: 'A capacidade caiu abaixo do padrão ideal. Considere uma substituição se a autonomia for insuficiente.',
146
- recDefault: 'Mantenha os seus hábitos atuais a sua bateria está numa gama de funcionamento ideal.',
146
+ recDefault: 'Mantenha os seus hábitos atuais -a sua bateria está numa gama de funcionamento ideal.',
147
147
  },
148
148
  };
@@ -22,12 +22,12 @@ const faqData = [
22
22
  {
23
23
  question: 'Как тепло влияет на срок службы батареи?',
24
24
  answer:
25
- 'Тепло враг номер один. На каждые 10 градусов повышения выше оптимальной температуры окружающей среды (25 градусов) скорость химической деградации примерно удваивается.',
25
+ 'Тепло -враг номер один. На каждые 10 градусов повышения выше оптимальной температуры окружающей среды (25 градусов) скорость химической деградации примерно удваивается.',
26
26
  },
27
27
  {
28
28
  question: 'Что такое полный цикл зарядки?',
29
29
  answer:
30
- 'Цикл это использование 100% емкости батареи, но это не обязательно должно происходить за один раз. Если вы используете 50% сегодня, зарядите ее и используете 50% завтра, вы завершите 1 полный цикл.',
30
+ 'Цикл -это использование 100% емкости батареи, но это не обязательно должно происходить за один раз. Если вы используете 50% сегодня, зарядите ее и используете 50% завтра, вы завершите 1 полный цикл.',
31
31
  },
32
32
  ];
33
33
 
@@ -96,14 +96,14 @@ export const content: ToolLocaleContent<EstimadorSaludBateriaUI> = {
96
96
  { type: 'title', text: 'Химия времени: почему умирают литиевые батареи', level: 2 },
97
97
  {
98
98
  type: 'paragraph',
99
- html: 'Литий-ионный аккумулятор это не статичная коробка с энергией, а динамичная химическая экосистема, находящаяся в состоянии постоянной деградации с момента изготовления. Каждый цикл заряда и разряда, каждое колебание температуры и каждая минута при экстремальном напряжении способствуют образованию побочных продуктов, препятствующих потоку ионов.',
99
+ html: 'Литий-ионный аккумулятор -это не статичная коробка с энергией, а динамичная химическая экосистема, находящаяся в состоянии постоянной деградации с момента изготовления. Каждый цикл заряда и разряда, каждое колебание температуры и каждая минута при экстремальном напряжении способствуют образованию побочных продуктов, препятствующих потоку ионов.',
100
100
  },
101
101
  { type: 'title', text: 'Основные механизмы деградации', level: 3 },
102
102
  {
103
103
  type: 'paragraph',
104
104
  html: '<strong>Слой SEI:</strong> межфазный слой твердого электролита растет со временем, потребляя активный литий и увеличивая внутреннее сопротивление. <strong>Окисление электролита:</strong> напряжение выше 4,1 В ускоряет окисление и может привести к вздутию батареи. <strong>Lithium Plating:</strong> зарядка при низких температурах осаждает литий в металлической форме, создавая дендриты, которые могут проколоть сепаратор.',
105
105
  },
106
- { type: 'title', text: 'Миф о 100%: почему зарядка на ночь это ошибка', level: 3 },
106
+ { type: 'title', text: 'Миф о 100%: почему зарядка на ночь -это ошибка', level: 3 },
107
107
  {
108
108
  type: 'paragraph',
109
109
  html: 'Для иона лития пребывание при 100% заряде (4,2 В) является состоянием высокого стресса. Исследования показывают, что срок службы увеличивается в два или три раза, если держать устройство в диапазоне <strong>от 20% до 80%</strong>. Кроме того, на каждые 10°C выше 25°C скорость химической деградации примерно удваивается.',
@@ -143,6 +143,6 @@ export const content: ToolLocaleContent<EstimadorSaludBateriaUI> = {
143
143
  recVoltageHigh: 'Избегайте длительного удержания аккумулятора при 100% заряде (4,2 В).',
144
144
  recVoltageLow: 'Избегайте глубоких разрядов; циклы между 20% и 80% удваивают срок службы.',
145
145
  recSohLow: 'Емкость упала ниже оптимального стандарта. Рассмотрите возможность замены, если автономности недостаточно.',
146
- recDefault: 'Придерживайтесь текущих привычек ваша батарея находится в идеальном рабочем диапазоне.',
146
+ recDefault: 'Придерживайтесь текущих привычек -ваша батарея находится в идеальном рабочем диапазоне.',
147
147
  },
148
148
  };
@@ -143,6 +143,6 @@ export const content: ToolLocaleContent<EstimadorSaludBateriaUI> = {
143
143
  recVoltageHigh: 'Undvik att hålla batteriet vid 100 % laddning (4,2 V) under längre perioder.',
144
144
  recVoltageLow: 'Undvik djupa urladdningar; cykler mellan 20 % och 80 % fördubblar batteriets livslängd.',
145
145
  recSohLow: 'Kapaciteten har sjunkit under den optimala nivån. Överväg ett byte om batteritiden är otillräcklig.',
146
- recDefault: 'Behåll dina nuvarande vanor ditt batteri är i ett idealiskt driftintervall.',
146
+ recDefault: 'Behåll dina nuvarande vanor -ditt batteri är i ett idealiskt driftintervall.',
147
147
  },
148
148
  };
@@ -143,6 +143,6 @@ export const content: ToolLocaleContent<EstimadorSaludBateriaUI> = {
143
143
  recVoltageHigh: 'Pili uzun süre %100 şarjda (4.2V) tutmaktan kaçının.',
144
144
  recVoltageLow: 'Derin deşarjlardan kaçının; %20 ile %80 arasındaki döngüler pil ömrünü iki katına çıkarır.',
145
145
  recSohLow: 'Kapasite optimal standardın altına düştü. Otonomi yetersizse değişim yapmayı düşünün.',
146
- recDefault: 'Mevcut alışkanlıklarınızı koruyun piliniz ideal çalışma aralığında.',
146
+ recDefault: 'Mevcut alışkanlıklarınızı koruyun -piliniz ideal çalışma aralığında.',
147
147
  },
148
148
  };
@@ -143,6 +143,6 @@ export const content: ToolLocaleContent<EstimadorSaludBateriaUI> = {
143
143
  recVoltageHigh: '避免让电池长时间保持 100% 电量 (4.2V)。',
144
144
  recVoltageLow: '避免深度放电;将电量保持在 20% 到 80% 之间可使电池寿命翻倍。',
145
145
  recSohLow: '容量已降至最佳标准以下。如果续航不足,请考虑更换电池。',
146
- recDefault: '保持当前习惯 — 你的电池处于理想的工作范围内。',
146
+ recDefault: '保持当前习惯 -你的电池处于理想的工作范围内。',
147
147
  },
148
148
  };
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
+ import type { KnownLocale } from '../../types';
4
+ import { spectrumCanvas } from './index';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'es' } = Astro.props;
11
+ const content = await spectrumCanvas.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && content.bibliography.length > 0 && <SharedBibliography links={content.bibliography} />}
@@ -0,0 +1,16 @@
1
+ import type { BibliographyEntry } from '../../../types';
2
+
3
+ export const bibliography: BibliographyEntry[] = [
4
+ {
5
+ name: 'CIE 1931 Color Space and Tristimulus Values',
6
+ url: 'https://en.wikipedia.org/wiki/CIE_1931_color_space',
7
+ },
8
+ {
9
+ name: 'sRGB: IEC 61966-2-1 Standard Color Space',
10
+ url: 'https://en.wikipedia.org/wiki/SRGB',
11
+ },
12
+ {
13
+ name: 'DCI-P3 Digital Cinema Initiatives Color Space',
14
+ url: 'https://en.wikipedia.org/wiki/DCI-P3',
15
+ }
16
+ ];