@jjlmoya/utils-chrono 1.17.0 → 1.19.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.
- package/package.json +1 -1
- package/src/category/i18n/fr.ts +1 -1
- package/src/category/index.ts +4 -0
- package/src/entries.ts +7 -1
- package/src/index.ts +2 -0
- package/src/tests/locale_completeness.test.ts +1 -1
- package/src/tests/no_en_dash.test.ts +40 -6
- package/src/tests/title_quality.test.ts +2 -2
- package/src/tests/tool_validation.test.ts +1 -1
- package/src/tool/beat-rate-converter/i18n/de.ts +30 -30
- package/src/tool/beat-rate-converter/i18n/es.ts +33 -33
- package/src/tool/beat-rate-converter/i18n/fr.ts +45 -45
- package/src/tool/beat-rate-converter/i18n/id.ts +6 -6
- package/src/tool/beat-rate-converter/i18n/it.ts +28 -28
- package/src/tool/beat-rate-converter/i18n/ja.ts +56 -56
- package/src/tool/beat-rate-converter/i18n/ko.ts +56 -56
- package/src/tool/beat-rate-converter/i18n/nl.ts +14 -14
- package/src/tool/beat-rate-converter/i18n/pl.ts +48 -48
- package/src/tool/beat-rate-converter/i18n/pt.ts +30 -30
- package/src/tool/beat-rate-converter/i18n/ru.ts +56 -56
- package/src/tool/beat-rate-converter/i18n/sv.ts +44 -44
- package/src/tool/beat-rate-converter/i18n/tr.ts +51 -51
- package/src/tool/beat-rate-converter/i18n/zh.ts +56 -56
- package/src/tool/crown-reference-guide/i18n/de.ts +9 -9
- package/src/tool/crown-reference-guide/i18n/en.ts +8 -8
- package/src/tool/crown-reference-guide/i18n/es.ts +10 -10
- package/src/tool/crown-reference-guide/i18n/fr.ts +18 -18
- package/src/tool/crown-reference-guide/i18n/id.ts +9 -9
- package/src/tool/crown-reference-guide/i18n/it.ts +9 -9
- package/src/tool/crown-reference-guide/i18n/nl.ts +8 -8
- package/src/tool/crown-reference-guide/i18n/pl.ts +8 -8
- package/src/tool/crown-reference-guide/i18n/pt.ts +8 -8
- package/src/tool/crown-reference-guide/i18n/ru.ts +8 -8
- package/src/tool/crown-reference-guide/i18n/sv.ts +8 -8
- package/src/tool/crown-reference-guide/i18n/tr.ts +8 -8
- package/src/tool/crown-reference-guide/i18n/zh.ts +9 -9
- package/src/tool/demagnetizing-timer/i18n/fr.ts +1 -1
- package/src/tool/gear-train-explorer/i18n/de.ts +2 -2
- package/src/tool/gear-train-explorer/i18n/en.ts +2 -2
- package/src/tool/gear-train-explorer/i18n/es.ts +2 -2
- package/src/tool/gear-train-explorer/i18n/fr.ts +2 -2
- package/src/tool/gear-train-explorer/i18n/id.ts +2 -2
- package/src/tool/gear-train-explorer/i18n/it.ts +2 -2
- package/src/tool/gear-train-explorer/i18n/ja.ts +2 -2
- package/src/tool/gear-train-explorer/i18n/ko.ts +2 -2
- package/src/tool/gear-train-explorer/i18n/nl.ts +2 -2
- package/src/tool/gear-train-explorer/i18n/pl.ts +2 -2
- package/src/tool/gear-train-explorer/i18n/pt.ts +2 -2
- package/src/tool/gear-train-explorer/i18n/ru.ts +6 -6
- package/src/tool/gear-train-explorer/i18n/sv.ts +2 -2
- package/src/tool/gear-train-explorer/i18n/tr.ts +2 -2
- package/src/tool/gear-train-explorer/i18n/zh.ts +2 -2
- package/src/tool/gmt-world-timer/i18n/en.ts +7 -7
- package/src/tool/gmt-world-timer/i18n/es.ts +8 -8
- package/src/tool/gmt-world-timer/i18n/fr.ts +12 -12
- package/src/tool/gmt-world-timer/i18n/id.ts +7 -7
- package/src/tool/gmt-world-timer/i18n/it.ts +8 -8
- package/src/tool/gmt-world-timer/i18n/ja.ts +5 -5
- package/src/tool/gmt-world-timer/i18n/ko.ts +5 -5
- package/src/tool/gmt-world-timer/i18n/nl.ts +7 -7
- package/src/tool/gmt-world-timer/i18n/pl.ts +7 -7
- package/src/tool/gmt-world-timer/i18n/pt.ts +7 -7
- package/src/tool/gmt-world-timer/i18n/ru.ts +11 -11
- package/src/tool/gmt-world-timer/i18n/sv.ts +7 -7
- package/src/tool/gmt-world-timer/i18n/tr.ts +6 -6
- package/src/tool/gmt-world-timer/i18n/zh.ts +6 -6
- package/src/tool/lume-color-simulator/i18n/fr.ts +4 -4
- package/src/tool/lume-color-simulator/i18n/id.ts +5 -5
- package/src/tool/lume-color-simulator/i18n/it.ts +4 -4
- package/src/tool/lume-color-simulator/i18n/ja.ts +5 -5
- package/src/tool/lume-color-simulator/i18n/nl.ts +2 -2
- package/src/tool/lume-color-simulator/i18n/pt.ts +5 -5
- package/src/tool/lume-color-simulator/i18n/ru.ts +14 -14
- package/src/tool/lume-color-simulator/i18n/zh.ts +4 -4
- package/src/tool/mainspring-finder/bibliography.astro +16 -0
- package/src/tool/mainspring-finder/bibliography.ts +16 -0
- package/src/tool/mainspring-finder/client.ts +89 -0
- package/src/tool/mainspring-finder/component.astro +72 -0
- package/src/tool/mainspring-finder/entry.ts +50 -0
- package/src/tool/mainspring-finder/helpers.ts +52 -0
- package/src/tool/mainspring-finder/i18n/de.ts +212 -0
- package/src/tool/mainspring-finder/i18n/en.ts +212 -0
- package/src/tool/mainspring-finder/i18n/es.ts +212 -0
- package/src/tool/mainspring-finder/i18n/fr.ts +212 -0
- package/src/tool/mainspring-finder/i18n/id.ts +212 -0
- package/src/tool/mainspring-finder/i18n/it.ts +212 -0
- package/src/tool/mainspring-finder/i18n/ja.ts +212 -0
- package/src/tool/mainspring-finder/i18n/ko.ts +212 -0
- package/src/tool/mainspring-finder/i18n/nl.ts +212 -0
- package/src/tool/mainspring-finder/i18n/pl.ts +212 -0
- package/src/tool/mainspring-finder/i18n/pt.ts +212 -0
- package/src/tool/mainspring-finder/i18n/ru.ts +212 -0
- package/src/tool/mainspring-finder/i18n/sv.ts +212 -0
- package/src/tool/mainspring-finder/i18n/tr.ts +212 -0
- package/src/tool/mainspring-finder/i18n/zh.ts +212 -0
- package/src/tool/mainspring-finder/index.ts +11 -0
- package/src/tool/mainspring-finder/mainspring-finder.css +242 -0
- package/src/tool/mainspring-finder/seo.astro +16 -0
- package/src/tool/moon-phase-visualizer/i18n/fr.ts +4 -4
- package/src/tool/moon-phase-visualizer/i18n/id.ts +4 -4
- package/src/tool/moon-phase-visualizer/i18n/it.ts +4 -4
- package/src/tool/moon-phase-visualizer/i18n/ja.ts +2 -2
- package/src/tool/moon-phase-visualizer/i18n/nl.ts +2 -2
- package/src/tool/moon-phase-visualizer/i18n/pt.ts +4 -4
- package/src/tool/moon-phase-visualizer/i18n/ru.ts +7 -7
- package/src/tool/moon-phase-visualizer/i18n/zh.ts +4 -4
- package/src/tool/perpetual-calendar/i18n/de.ts +1 -1
- package/src/tool/perpetual-calendar/i18n/en.ts +1 -1
- package/src/tool/perpetual-calendar/i18n/es.ts +1 -1
- package/src/tool/perpetual-calendar/i18n/fr.ts +1 -1
- package/src/tool/perpetual-calendar/i18n/id.ts +1 -1
- package/src/tool/perpetual-calendar/i18n/it.ts +1 -1
- package/src/tool/perpetual-calendar/i18n/ja.ts +1 -1
- package/src/tool/perpetual-calendar/i18n/ko.ts +1 -1
- package/src/tool/perpetual-calendar/i18n/nl.ts +1 -1
- package/src/tool/perpetual-calendar/i18n/pl.ts +1 -1
- package/src/tool/perpetual-calendar/i18n/pt.ts +1 -1
- package/src/tool/perpetual-calendar/i18n/ru.ts +2 -2
- package/src/tool/perpetual-calendar/i18n/sv.ts +1 -1
- package/src/tool/perpetual-calendar/i18n/tr.ts +1 -1
- package/src/tool/perpetual-calendar/i18n/zh.ts +1 -1
- package/src/tool/power-reserve-estimator/i18n/de.ts +26 -26
- package/src/tool/power-reserve-estimator/i18n/es.ts +22 -22
- package/src/tool/power-reserve-estimator/i18n/fr.ts +36 -36
- package/src/tool/power-reserve-estimator/i18n/id.ts +5 -5
- package/src/tool/power-reserve-estimator/i18n/it.ts +18 -18
- package/src/tool/power-reserve-estimator/i18n/ja.ts +3 -3
- package/src/tool/power-reserve-estimator/i18n/ko.ts +3 -3
- package/src/tool/power-reserve-estimator/i18n/nl.ts +7 -7
- package/src/tool/power-reserve-estimator/i18n/pl.ts +9 -9
- package/src/tool/power-reserve-estimator/i18n/pt.ts +25 -25
- package/src/tool/power-reserve-estimator/i18n/ru.ts +15 -15
- package/src/tool/power-reserve-estimator/i18n/sv.ts +7 -7
- package/src/tool/power-reserve-estimator/i18n/tr.ts +7 -7
- package/src/tool/power-reserve-estimator/i18n/zh.ts +7 -7
- package/src/tool/quartz-battery-health/bibliography.astro +16 -0
- package/src/tool/quartz-battery-health/bibliography.ts +16 -0
- package/src/tool/quartz-battery-health/client.ts +198 -0
- package/src/tool/quartz-battery-health/component.astro +15 -0
- package/src/tool/quartz-battery-health/components/BatteryHealthPanel.astro +163 -0
- package/src/tool/quartz-battery-health/entry.ts +57 -0
- package/src/tool/quartz-battery-health/i18n/de.ts +327 -0
- package/src/tool/quartz-battery-health/i18n/en.ts +327 -0
- package/src/tool/quartz-battery-health/i18n/es.ts +327 -0
- package/src/tool/quartz-battery-health/i18n/fr.ts +327 -0
- package/src/tool/quartz-battery-health/i18n/id.ts +326 -0
- package/src/tool/quartz-battery-health/i18n/it.ts +327 -0
- package/src/tool/quartz-battery-health/i18n/ja.ts +327 -0
- package/src/tool/quartz-battery-health/i18n/ko.ts +327 -0
- package/src/tool/quartz-battery-health/i18n/nl.ts +327 -0
- package/src/tool/quartz-battery-health/i18n/pl.ts +327 -0
- package/src/tool/quartz-battery-health/i18n/pt.ts +327 -0
- package/src/tool/quartz-battery-health/i18n/ru.ts +327 -0
- package/src/tool/quartz-battery-health/i18n/sv.ts +326 -0
- package/src/tool/quartz-battery-health/i18n/tr.ts +327 -0
- package/src/tool/quartz-battery-health/i18n/zh.ts +327 -0
- package/src/tool/quartz-battery-health/index.ts +11 -0
- package/src/tool/quartz-battery-health/quartz-battery-health.css +447 -0
- package/src/tool/quartz-battery-health/seo.astro +16 -0
- package/src/tool/service-interval-tracker/i18n/fr.ts +1 -1
- package/src/tool/sidereal-time-tracker/i18n/ru.ts +2 -2
- package/src/tool/strap-length-calculator/i18n/fr.ts +1 -1
- package/src/tool/strap-length-calculator/i18n/ru.ts +4 -4
- package/src/tool/strap-taper-calculator/i18n/de.ts +3 -3
- package/src/tool/strap-taper-calculator/i18n/en.ts +1 -1
- package/src/tool/strap-taper-calculator/i18n/es.ts +3 -3
- package/src/tool/strap-taper-calculator/i18n/fr.ts +4 -4
- package/src/tool/strap-taper-calculator/i18n/id.ts +3 -3
- package/src/tool/strap-taper-calculator/i18n/it.ts +3 -3
- package/src/tool/strap-taper-calculator/i18n/ja.ts +2 -2
- package/src/tool/strap-taper-calculator/i18n/ko.ts +2 -2
- package/src/tool/strap-taper-calculator/i18n/nl.ts +3 -3
- package/src/tool/strap-taper-calculator/i18n/pl.ts +3 -3
- package/src/tool/strap-taper-calculator/i18n/pt.ts +3 -3
- package/src/tool/strap-taper-calculator/i18n/ru.ts +2 -2
- package/src/tool/strap-taper-calculator/i18n/sv.ts +3 -3
- package/src/tool/strap-taper-calculator/i18n/tr.ts +3 -3
- package/src/tool/strap-taper-calculator/i18n/zh.ts +3 -3
- package/src/tool/tachymeter-calculator/i18n/ru.ts +6 -6
- package/src/tool/telemeter-calculator/i18n/ru.ts +3 -3
- package/src/tool/telemeter-calculator/i18n/zh.ts +2 -2
- package/src/tool/tourbillon-visualizer/i18n/de.ts +3 -3
- package/src/tool/tourbillon-visualizer/i18n/en.ts +3 -3
- package/src/tool/tourbillon-visualizer/i18n/es.ts +3 -3
- package/src/tool/tourbillon-visualizer/i18n/fr.ts +3 -3
- package/src/tool/tourbillon-visualizer/i18n/id.ts +3 -3
- package/src/tool/tourbillon-visualizer/i18n/it.ts +3 -3
- package/src/tool/tourbillon-visualizer/i18n/ja.ts +2 -2
- package/src/tool/tourbillon-visualizer/i18n/ko.ts +2 -2
- package/src/tool/tourbillon-visualizer/i18n/nl.ts +3 -3
- package/src/tool/tourbillon-visualizer/i18n/pl.ts +3 -3
- package/src/tool/tourbillon-visualizer/i18n/pt.ts +3 -3
- package/src/tool/tourbillon-visualizer/i18n/ru.ts +5 -5
- package/src/tool/tourbillon-visualizer/i18n/sv.ts +3 -3
- package/src/tool/tourbillon-visualizer/i18n/tr.ts +3 -3
- package/src/tool/tourbillon-visualizer/i18n/zh.ts +3 -3
- package/src/tool/watch-accuracy-tracker/i18n/fr.ts +1 -1
- package/src/tool/watch-accuracy-tracker/i18n/zh.ts +1 -1
- package/src/tool/watch-savings-planner/i18n/de.ts +25 -25
- package/src/tool/watch-savings-planner/i18n/es.ts +39 -39
- package/src/tool/watch-savings-planner/i18n/fr.ts +51 -51
- package/src/tool/watch-savings-planner/i18n/id.ts +5 -5
- package/src/tool/watch-savings-planner/i18n/it.ts +29 -29
- package/src/tool/watch-savings-planner/i18n/ja.ts +73 -73
- package/src/tool/watch-savings-planner/i18n/ko.ts +73 -73
- package/src/tool/watch-savings-planner/i18n/nl.ts +10 -10
- package/src/tool/watch-savings-planner/i18n/pl.ts +5 -5
- package/src/tool/watch-savings-planner/i18n/pt.ts +43 -43
- package/src/tool/watch-savings-planner/i18n/ru.ts +7 -7
- package/src/tool/watch-savings-planner/i18n/sv.ts +54 -54
- package/src/tool/watch-savings-planner/i18n/tr.ts +50 -50
- package/src/tool/watch-savings-planner/i18n/zh.ts +73 -73
- package/src/tool/watch-size-comparator/i18n/de.ts +2 -2
- package/src/tool/watch-size-comparator/i18n/en.ts +3 -3
- package/src/tool/watch-size-comparator/i18n/es.ts +1 -1
- package/src/tool/watch-size-comparator/i18n/fr.ts +10 -10
- package/src/tool/watch-size-comparator/i18n/id.ts +9 -9
- package/src/tool/watch-size-comparator/i18n/it.ts +8 -8
- package/src/tool/watch-size-comparator/i18n/ja.ts +6 -6
- package/src/tool/watch-size-comparator/i18n/nl.ts +7 -7
- package/src/tool/watch-size-comparator/i18n/pl.ts +2 -2
- package/src/tool/watch-size-comparator/i18n/pt.ts +9 -9
- package/src/tool/watch-size-comparator/i18n/ru.ts +16 -16
- package/src/tool/watch-size-comparator/i18n/tr.ts +1 -1
- package/src/tool/watch-size-comparator/i18n/zh.ts +5 -5
- package/src/tool/water-resistance-converter/i18n/de.ts +1 -1
- package/src/tool/water-resistance-converter/i18n/en.ts +1 -1
- package/src/tool/water-resistance-converter/i18n/es.ts +1 -1
- package/src/tool/water-resistance-converter/i18n/fr.ts +2 -2
- package/src/tool/water-resistance-converter/i18n/id.ts +1 -1
- package/src/tool/water-resistance-converter/i18n/it.ts +1 -1
- package/src/tool/water-resistance-converter/i18n/ja.ts +1 -1
- package/src/tool/water-resistance-converter/i18n/ko.ts +1 -1
- package/src/tool/water-resistance-converter/i18n/nl.ts +1 -1
- package/src/tool/water-resistance-converter/i18n/pl.ts +1 -1
- package/src/tool/water-resistance-converter/i18n/pt.ts +1 -1
- package/src/tool/water-resistance-converter/i18n/ru.ts +1 -1
- package/src/tool/water-resistance-converter/i18n/sv.ts +1 -1
- package/src/tool/water-resistance-converter/i18n/tr.ts +1 -1
- package/src/tool/water-resistance-converter/i18n/zh.ts +4 -4
- package/src/tool/wrist-presence-calculator/i18n/en.ts +1 -1
- package/src/tool/wrist-presence-calculator/i18n/fr.ts +5 -5
- package/src/tool/wrist-presence-calculator/i18n/id.ts +1 -1
- package/src/tool/wrist-presence-calculator/i18n/zh.ts +1 -1
- package/src/tools.ts +4 -0
|
@@ -29,32 +29,32 @@ export const content: ToolLocaleContent<PowerReserveEstimatorUI> = {
|
|
|
29
29
|
fullWindTurns: 'Об. до полного',
|
|
30
30
|
step1: 'Выберите ваш механизм из выпадающего списка.',
|
|
31
31
|
step2: 'Укажите число оборотов заводной головки и часы ношения.',
|
|
32
|
-
step3: 'Нажмите
|
|
32
|
+
step3: 'Нажмите "Рассчитать", чтобы узнать запас хода.',
|
|
33
33
|
tipTitle: 'Совет',
|
|
34
34
|
tipContent: 'Механизмы с ручным заводом заряжаются только при вращении заводной головки. Автоматические механизмы также заряжаются во время ношения.',
|
|
35
35
|
},
|
|
36
36
|
seo: [
|
|
37
|
-
{ type: 'title', text: 'Расчет запаса хода часов
|
|
38
|
-
{ type: 'paragraph', html: 'Хотите узнать, сколько энергии осталось в ваших механических часах? Завели ли вы их утром или носили весь день
|
|
37
|
+
{ type: 'title', text: 'Расчет запаса хода часов - сколько энергии осталось в вашем механизме?', level: 2 },
|
|
38
|
+
{ type: 'paragraph', html: 'Хотите узнать, сколько энергии осталось в ваших механических часах? Завели ли вы их утром или носили весь день - этот калькулятор покажет примерный уровень заряда и оставшееся время для популярных калибров, таких как <strong>ETA, Sellita, Miyota, Seiko и Rolex</strong>.' },
|
|
39
39
|
{ type: 'title', text: 'Как работает запас хода в механических часах', level: 3 },
|
|
40
|
-
{ type: 'paragraph', html: 'Запас хода
|
|
40
|
+
{ type: 'paragraph', html: 'Запас хода - это количество энергии, накопленной в заводной пружине. При вращении заводной головки пружина затягивается, накапливая потенциальную энергию. Автоматический ротор также подзаводит пружину, пока вы носите часы. Затем энергия расходуется с постоянной скоростью - обычно 2-3% в час - пока часы не остановятся.' },
|
|
41
41
|
{ type: 'title', text: 'Завод головкой vs. зарядка ротором', level: 3 },
|
|
42
|
-
{ type: 'paragraph', html: 'Ручной завод заводной головкой
|
|
42
|
+
{ type: 'paragraph', html: 'Ручной завод заводной головкой - самый эффективный способ зарядить часы: каждый полный оборот добавляет предсказуемое количество энергии, обычно около 2,5% от общего запаса. Ношение часов заряжает медленнее и зависит от уровня активности: офисный работник может заряжать 4-6% в час, а активный человек - 8-10%. Данный калькулятор использует консервативное среднее значение.' },
|
|
43
43
|
{ type: 'title', text: 'Почему важно оценивать запас хода', level: 3 },
|
|
44
44
|
{ type: 'paragraph', html: 'Знание уровня заряда часов помогает избежать неожиданных остановок. Если часы останавливаются за ночь, возможно, их нужно дольше заводить перед сном или они недостаточно долго носились в течение дня. Используйте этот инструмент, чтобы понять свои привычки зарядки и поддерживать ваши автоматические часы в работе.' },
|
|
45
45
|
],
|
|
46
46
|
faq: [
|
|
47
47
|
{
|
|
48
48
|
question: 'Сколько заряжает один оборот заводной головки?',
|
|
49
|
-
answer: 'Зависит от механизма. Большинство автоматических калибров достигают полного завода за 30
|
|
49
|
+
answer: 'Зависит от механизма. Большинство автоматических калибров достигают полного завода за 30-40 оборотов, поэтому каждый оборот добавляет около 2,5-3,3% от общего запаса. Механизмы с ручным заводом, такие как Unitas 6498, также требуют около 35 оборотов для полного завода.',
|
|
50
50
|
},
|
|
51
51
|
{
|
|
52
52
|
question: 'Ношение часов заряжает их так же, как завод?',
|
|
53
|
-
answer: 'Ношение заряжает медленнее и менее стабильно. При офисной работе вы можете заряжать 4
|
|
53
|
+
answer: 'Ношение заряжает медленнее и менее стабильно. При офисной работе вы можете заряжать 4-6% в час через ротор. При активном движении (ходьба, спорт) этот показатель может достигать 8-10% в час. Ручной завод быстрее и предсказуемее.',
|
|
54
54
|
},
|
|
55
55
|
{
|
|
56
56
|
question: 'Сколько запаса хода часы теряют в час?',
|
|
57
|
-
answer: 'Расход постоянен: разделите 100 на запас хода в часах. 38-часовой механизм теряет около 2,6% в час, 42-часовой
|
|
57
|
+
answer: 'Расход постоянен: разделите 100 на запас хода в часах. 38-часовой механизм теряет около 2,6% в час, 42-часовой - 2,4%, а 70-часовой - около 1,4% в час.',
|
|
58
58
|
},
|
|
59
59
|
{
|
|
60
60
|
question: 'Можно ли перевести часы чрезмерным заводом?',
|
|
@@ -65,7 +65,7 @@ export const content: ToolLocaleContent<PowerReserveEstimatorUI> = {
|
|
|
65
65
|
howTo: [
|
|
66
66
|
{
|
|
67
67
|
name: 'Выберите механизм',
|
|
68
|
-
text: 'Выберите калибр ваших часов из выпадающего списка. Если его нет в списке, выберите
|
|
68
|
+
text: 'Выберите калибр ваших часов из выпадающего списка. Если его нет в списке, выберите "Другой" и укажите его запас хода и число оборотов до полного завода.',
|
|
69
69
|
},
|
|
70
70
|
{
|
|
71
71
|
name: 'Введите данные',
|
|
@@ -73,7 +73,7 @@ export const content: ToolLocaleContent<PowerReserveEstimatorUI> = {
|
|
|
73
73
|
},
|
|
74
74
|
{
|
|
75
75
|
name: 'Рассчитать',
|
|
76
|
-
text: 'Нажмите кнопку
|
|
76
|
+
text: 'Нажмите кнопку "Рассчитать". Результат покажет расчетный процент заряда и оставшиеся часы запаса хода.',
|
|
77
77
|
},
|
|
78
78
|
{
|
|
79
79
|
name: 'Скорректируйте привычки',
|
|
@@ -90,7 +90,7 @@ export const content: ToolLocaleContent<PowerReserveEstimatorUI> = {
|
|
|
90
90
|
'name': 'Сколько заряжает один оборот заводной головки?',
|
|
91
91
|
'acceptedAnswer': {
|
|
92
92
|
'@type': 'Answer',
|
|
93
|
-
'text': 'Зависит от механизма. Большинство автоматических калибров достигают полного завода за 30
|
|
93
|
+
'text': 'Зависит от механизма. Большинство автоматических калибров достигают полного завода за 30-40 оборотов, поэтому каждый оборот добавляет около 2,5-3,3% от общего запаса. Механизмы с ручным заводом, такие как Unitas 6498, также требуют около 35 оборотов для полного завода.',
|
|
94
94
|
},
|
|
95
95
|
},
|
|
96
96
|
{
|
|
@@ -98,7 +98,7 @@ export const content: ToolLocaleContent<PowerReserveEstimatorUI> = {
|
|
|
98
98
|
'name': 'Ношение часов заряжает их так же, как завод?',
|
|
99
99
|
'acceptedAnswer': {
|
|
100
100
|
'@type': 'Answer',
|
|
101
|
-
'text': 'Ношение заряжает медленнее и менее стабильно. При офисной работе вы можете заряжать 4
|
|
101
|
+
'text': 'Ношение заряжает медленнее и менее стабильно. При офисной работе вы можете заряжать 4-6% в час через ротор. При активном движении этот показатель может достигать 8-10% в час. Ручной завод быстрее и предсказуемее.',
|
|
102
102
|
},
|
|
103
103
|
},
|
|
104
104
|
{
|
|
@@ -106,7 +106,7 @@ export const content: ToolLocaleContent<PowerReserveEstimatorUI> = {
|
|
|
106
106
|
'name': 'Сколько запаса хода часы теряют в час?',
|
|
107
107
|
'acceptedAnswer': {
|
|
108
108
|
'@type': 'Answer',
|
|
109
|
-
'text': 'Расход постоянен: разделите 100 на запас хода в часах. 38-часовой механизм теряет около 2,6% в час, 42-часовой
|
|
109
|
+
'text': 'Расход постоянен: разделите 100 на запас хода в часах. 38-часовой механизм теряет около 2,6% в час, 42-часовой - 2,4%, а 70-часовой - около 1,4% в час.',
|
|
110
110
|
},
|
|
111
111
|
},
|
|
112
112
|
{
|
|
@@ -135,7 +135,7 @@ export const content: ToolLocaleContent<PowerReserveEstimatorUI> = {
|
|
|
135
135
|
{
|
|
136
136
|
'@type': 'HowToStep',
|
|
137
137
|
'name': 'Выберите механизм',
|
|
138
|
-
'text': 'Выберите калибр ваших часов из выпадающего списка. Если его нет в списке, выберите
|
|
138
|
+
'text': 'Выберите калибр ваших часов из выпадающего списка. Если его нет в списке, выберите "Другой" и укажите его запас хода и число оборотов до полного завода.',
|
|
139
139
|
},
|
|
140
140
|
{
|
|
141
141
|
'@type': 'HowToStep',
|
|
@@ -145,7 +145,7 @@ export const content: ToolLocaleContent<PowerReserveEstimatorUI> = {
|
|
|
145
145
|
{
|
|
146
146
|
'@type': 'HowToStep',
|
|
147
147
|
'name': 'Рассчитать',
|
|
148
|
-
'text': 'Нажмите кнопку
|
|
148
|
+
'text': 'Нажмите кнопку "Рассчитать". Результат покажет расчетный процент заряда и оставшиеся часы запаса хода.',
|
|
149
149
|
},
|
|
150
150
|
{
|
|
151
151
|
'@type': 'HowToStep',
|
|
@@ -34,23 +34,23 @@ export const content: ToolLocaleContent<PowerReserveEstimatorUI> = {
|
|
|
34
34
|
tipContent: 'Manuella urverk laddas bara när du vrider på kronan. Automatiska urverk laddas även medan de bärs.',
|
|
35
35
|
},
|
|
36
36
|
seo: [
|
|
37
|
-
{ type: 'title', text: 'Uppskatta kraftreserven i din klocka
|
|
37
|
+
{ type: 'title', text: 'Uppskatta kraftreserven i din klocka - hur mycket kraft har ditt urverk kvar?', level: 2 },
|
|
38
38
|
{ type: 'paragraph', html: 'Undrar du hur mycket kraft som finns kvar i din mekaniska klocka? Oavsett om du vred på kronan i morse eller bar den hela dagen, ger denna uppskattning en ungefärlig laddningsnivå och återstående tid för populära kalibrar som <strong>ETA, Sellita, Miyota, Seiko och Rolex</strong>.' },
|
|
39
39
|
{ type: 'title', text: 'Så fungerar kraftreserv i en mekanisk klocka', level: 3 },
|
|
40
|
-
{ type: 'paragraph', html: 'Kraftreserven är mängden energi som lagrats i drivfjädern. När du vrider på kronan spänner du drivfjädern och lagrar potentiell energi. En automatisk rotor laddar också drivfjädern medan du bär klockan. Energin förbrukas sedan i en jämn takt
|
|
40
|
+
{ type: 'paragraph', html: 'Kraftreserven är mängden energi som lagrats i drivfjädern. När du vrider på kronan spänner du drivfjädern och lagrar potentiell energi. En automatisk rotor laddar också drivfjädern medan du bär klockan. Energin förbrukas sedan i en jämn takt - vanligtvis 2-3% per timme - tills klockan stannar.' },
|
|
41
41
|
{ type: 'title', text: 'Kronuppdragning vs. rotorladdning', level: 3 },
|
|
42
|
-
{ type: 'paragraph', html: 'Manuell uppdragning via kronan är det mest effektiva sättet att ladda en klocka
|
|
42
|
+
{ type: 'paragraph', html: 'Manuell uppdragning via kronan är det mest effektiva sättet att ladda en klocka - varje helt varv tillför en förutsägbar mängd energi, vanligtvis cirka 2,5% av den totala reserven. Att bära klockan laddar långsammare och beror på din aktivitetsnivå: en kontorsarbetare kan ladda 4-6% per timme, medan en aktiv person kan ladda 8-10%. Denna uppskattning använder ett konservativt medelvärde.' },
|
|
43
43
|
{ type: 'title', text: 'Varför kraftreservsuppskattning är viktig', level: 3 },
|
|
44
44
|
{ type: 'paragraph', html: 'Att känna till klockans laddningsnivå hjälper dig att undvika oväntade stopp. En klocka som stannar över natten kan behöva mer uppdragning innan läggdags, eller så får den inte tillräckligt med bäntid. Använd detta verktyg för att förstå dina laddningsvanor och hålla din automatklocka igång.' },
|
|
45
45
|
],
|
|
46
46
|
faq: [
|
|
47
47
|
{
|
|
48
48
|
question: 'Hur mycket laddar ett kronvarv klockan?',
|
|
49
|
-
answer: 'Det beror på urverket. De flesta automatiska kalibrar når full laddning på 30
|
|
49
|
+
answer: 'Det beror på urverket. De flesta automatiska kalibrar når full laddning på 30-40 varv, så varje varv tillför cirka 2,5-3,3% av den totala reserven. Handuppdragna urverk som Unitas 6498 behöver också cirka 35 varv för full laddning.',
|
|
50
50
|
},
|
|
51
51
|
{
|
|
52
52
|
question: 'Laddar det lika mycket att bära klockan som att dra upp den?',
|
|
53
|
-
answer: 'Att bära klockan laddar långsammare och mer varierat. Vid skrivbordsarbete kan du ladda 4
|
|
53
|
+
answer: 'Att bära klockan laddar långsammare och mer varierat. Vid skrivbordsarbete kan du ladda 4-6% per timme genom rotorn. Vid aktiv rörelse (promenader, sport) kan det nå 8-10% per timme. Handuppdragning är snabbare och mer förutsägbar.',
|
|
54
54
|
},
|
|
55
55
|
{
|
|
56
56
|
question: 'Hur mycket reserv förlorar en klocka per timme?',
|
|
@@ -90,7 +90,7 @@ export const content: ToolLocaleContent<PowerReserveEstimatorUI> = {
|
|
|
90
90
|
'name': 'Hur mycket laddar ett kronvarv klockan?',
|
|
91
91
|
'acceptedAnswer': {
|
|
92
92
|
'@type': 'Answer',
|
|
93
|
-
'text': 'Det beror på urverket. De flesta automatiska kalibrar når full laddning på 30
|
|
93
|
+
'text': 'Det beror på urverket. De flesta automatiska kalibrar når full laddning på 30-40 varv, så varje varv tillför cirka 2,5-3,3% av den totala reserven. Handuppdragna urverk som Unitas 6498 behöver också cirka 35 varv för full laddning.',
|
|
94
94
|
},
|
|
95
95
|
},
|
|
96
96
|
{
|
|
@@ -98,7 +98,7 @@ export const content: ToolLocaleContent<PowerReserveEstimatorUI> = {
|
|
|
98
98
|
'name': 'Laddar det lika mycket att bära klockan som att dra upp den?',
|
|
99
99
|
'acceptedAnswer': {
|
|
100
100
|
'@type': 'Answer',
|
|
101
|
-
'text': 'Att bära klockan laddar långsammare och mer varierat. Vid skrivbordsarbete kan du ladda 4
|
|
101
|
+
'text': 'Att bära klockan laddar långsammare och mer varierat. Vid skrivbordsarbete kan du ladda 4-6% per timme genom rotorn. Vid aktiv rörelse kan det nå 8-10% per timme. Handuppdragning är snabbare och mer förutsägbar.',
|
|
102
102
|
},
|
|
103
103
|
},
|
|
104
104
|
{
|
|
@@ -34,23 +34,23 @@ export const content: ToolLocaleContent<PowerReserveEstimatorUI> = {
|
|
|
34
34
|
tipContent: 'Kurmalı mekanizmalar yalnızca kurma kolunu çevirdiğinizde şarj olur. Otomatik mekanizmalar takılıyken de şarj olur.',
|
|
35
35
|
},
|
|
36
36
|
seo: [
|
|
37
|
-
{ type: 'title', text: 'Saat Güç Rezervi Tahmincisi
|
|
37
|
+
{ type: 'title', text: 'Saat Güç Rezervi Tahmincisi - Mekanizmanızda Ne Kadar Güç Kaldı?', level: 2 },
|
|
38
38
|
{ type: 'paragraph', html: 'Mekanik saatinizde ne kadar güç kaldığını merak ediyor musunuz? İster bu sabah kurma kolunu çevirmiş olun, ister tüm gün takmış olun, bu tahmin aracı <strong>ETA, Sellita, Miyota, Seiko ve Rolex</strong> gibi popüler kalibreler için yaklaşık şarj seviyesini ve kalan süreyi gösterir.' },
|
|
39
39
|
{ type: 'title', text: 'Mekanik Bir Saatte Güç Rezervi Nasıl Çalışır', level: 3 },
|
|
40
|
-
{ type: 'paragraph', html: 'Güç rezervi, ana yayda depolanan enerji miktarıdır. Kurma kolunu çevirdiğinizde ana yayı sıkıştırarak potansiyel enerji depolarsınız. Otomatik bir rotor da saati takarken ana yayı kurar. Enerji daha sonra sabit bir hızla
|
|
40
|
+
{ type: 'paragraph', html: 'Güç rezervi, ana yayda depolanan enerji miktarıdır. Kurma kolunu çevirdiğinizde ana yayı sıkıştırarak potansiyel enerji depolarsınız. Otomatik bir rotor da saati takarken ana yayı kurar. Enerji daha sonra sabit bir hızla - genellikle saatte %2-3 - saat durana kadar tükenir.' },
|
|
41
41
|
{ type: 'title', text: 'Kurma Kolu ile Kurma ve Rotor Şarjı', level: 3 },
|
|
42
|
-
{ type: 'paragraph', html: 'Kurma koluyla manuel kurma, bir saati şarj etmenin en verimli yoludur
|
|
42
|
+
{ type: 'paragraph', html: 'Kurma koluyla manuel kurma, bir saati şarj etmenin en verimli yoludur - her tam dönüş, genellikle toplam rezervin yaklaşık %2,5\'i kadar tahmin edilebilir bir enerji ekler. Saati takmak daha yavaş şarj eder ve aktivite seviyenize bağlıdır: bir ofis çalışanı saatte %4-6, aktif bir kişi ise saatte %8-10 şarj edebilir. Bu tahmin aracı muhafazakâr bir ortalama kullanır.' },
|
|
43
43
|
{ type: 'title', text: 'Güç Rezervi Tahmini Neden Önemlidir', level: 3 },
|
|
44
44
|
{ type: 'paragraph', html: 'Saatinizin şarj seviyesini bilmek, beklenmedik duruşları önlemeye yardımcı olur. Gece boyunca duran bir saat, yatmadan önce daha fazla kurma gerektirebilir veya yeterince takılmıyor olabilir. Bu aracı kullanarak şarj alışkanlıklarınızı anlayın ve otomatik saatinizi çalışır durumda tutun.' },
|
|
45
45
|
],
|
|
46
46
|
faq: [
|
|
47
47
|
{
|
|
48
48
|
question: 'Bir kurma kolu dönüşü saati ne kadar şarj eder?',
|
|
49
|
-
answer: 'Mekanizmaya bağlıdır. Çoğu otomatik kalibre 30
|
|
49
|
+
answer: 'Mekanizmaya bağlıdır. Çoğu otomatik kalibre 30-40 dönüşte tam şarja ulaşır, bu nedenle her dönüş toplam rezervin yaklaşık %2,5-3,3\'ünü ekler. Unitas 6498 gibi kurmalı mekanizmalar da tam şarj için yaklaşık 35 dönüş gerektirir.',
|
|
50
50
|
},
|
|
51
51
|
{
|
|
52
52
|
question: 'Saati takmak, kurmak kadar şarj eder mi?',
|
|
53
|
-
answer: 'Takmak daha yavaş ve değişken şarj eder. Masabaşı bir işte rotor aracılığıyla saatte %4
|
|
53
|
+
answer: 'Takmak daha yavaş ve değişken şarj eder. Masabaşı bir işte rotor aracılığıyla saatte %4-6 şarj edebilirsiniz. Aktif hareket sırasında (yürüyüş, spor) saatte %8-10\'a ulaşabilir. Elle kurmak daha hızlı ve öngörülebilirdir.',
|
|
54
54
|
},
|
|
55
55
|
{
|
|
56
56
|
question: 'Bir saat saatte ne kadar güç rezervi kaybeder?',
|
|
@@ -90,7 +90,7 @@ export const content: ToolLocaleContent<PowerReserveEstimatorUI> = {
|
|
|
90
90
|
'name': 'Bir kurma kolu dönüşü saati ne kadar şarj eder?',
|
|
91
91
|
'acceptedAnswer': {
|
|
92
92
|
'@type': 'Answer',
|
|
93
|
-
'text': 'Mekanizmaya bağlıdır. Çoğu otomatik kalibre 30
|
|
93
|
+
'text': 'Mekanizmaya bağlıdır. Çoğu otomatik kalibre 30-40 dönüşte tam şarja ulaşır, bu nedenle her dönüş toplam rezervin yaklaşık %2,5-3,3\'ünü ekler. Unitas 6498 gibi kurmalı mekanizmalar da tam şarj için yaklaşık 35 dönüş gerektirir.',
|
|
94
94
|
},
|
|
95
95
|
},
|
|
96
96
|
{
|
|
@@ -98,7 +98,7 @@ export const content: ToolLocaleContent<PowerReserveEstimatorUI> = {
|
|
|
98
98
|
'name': 'Saati takmak, kurmak kadar şarj eder mi?',
|
|
99
99
|
'acceptedAnswer': {
|
|
100
100
|
'@type': 'Answer',
|
|
101
|
-
'text': 'Takmak daha yavaş ve değişken şarj eder. Masabaşı bir işte rotor aracılığıyla saatte %4
|
|
101
|
+
'text': 'Takmak daha yavaş ve değişken şarj eder. Masabaşı bir işte rotor aracılığıyla saatte %4-6 şarj edebilirsiniz. Aktif hareket sırasında saatte %8-10\'a ulaşabilir. Elle kurmak daha hızlı ve öngörülebilirdir.',
|
|
102
102
|
},
|
|
103
103
|
},
|
|
104
104
|
{
|
|
@@ -34,23 +34,23 @@ export const content: ToolLocaleContent<PowerReserveEstimatorUI> = {
|
|
|
34
34
|
tipContent: '手动上链机芯仅在转动表冠时充能。自动机芯在佩戴过程中也会充能。',
|
|
35
35
|
},
|
|
36
36
|
seo: [
|
|
37
|
-
{ type: 'title', text: '
|
|
37
|
+
{ type: 'title', text: '手表动力储存估算器-您的机芯还剩多少动力?', level: 2 },
|
|
38
38
|
{ type: 'paragraph', html: '想知道您的机械手表还剩多少动力吗?无论您今早拧了表冠,还是戴了一整天,这个估算器都能告诉您 <strong>ETA、Sellita、Miyota、Seiko、Rolex</strong> 等热门机芯的大致充能水平和剩余时间。' },
|
|
39
39
|
{ type: 'title', text: '机械手表的动力储存原理', level: 3 },
|
|
40
|
-
{ type: 'paragraph', html: '
|
|
40
|
+
{ type: 'paragraph', html: '动力储存是发条中储存的能量。转动表冠时,发条被拧紧,储存势能。自动摆陀也会在您佩戴时给发条上弦。随后能量以稳定速率-通常每小时 2-3%-持续消耗,直到手表停止。' },
|
|
41
41
|
{ type: 'title', text: '表冠上链与摆陀充能的区别', level: 3 },
|
|
42
|
-
{ type: 'paragraph', html: '
|
|
42
|
+
{ type: 'paragraph', html: '通过表冠手动上链是为手表充能最有效的方式-每转一圈可增加可预测的能量,通常约为总动力储存的 2.5%。佩戴时充能较慢,且取决于您的活动水平:办公室工作者每小时可充能 4-6%,而活跃者可达 8-10%。本估算器采用保守平均值。' },
|
|
43
43
|
{ type: 'title', text: '为什么动力储存估算很重要', level: 3 },
|
|
44
44
|
{ type: 'paragraph', html: '了解手表的充能水平有助于避免意外停走。如果手表在夜间停走,可能需要在睡前多上几圈,或者佩戴时间不够。使用此工具了解您的充能习惯,让您的自动手表持续运转。' },
|
|
45
45
|
],
|
|
46
46
|
faq: [
|
|
47
47
|
{
|
|
48
48
|
question: '转动表冠一圈能为手表充多少电?',
|
|
49
|
-
answer: '取决于机芯。大多数自动机芯在 30
|
|
49
|
+
answer: '取决于机芯。大多数自动机芯在 30-40 圈内达到满链,因此每圈约增加总动力储存的 2.5-3.3%。Unitas 6498 等手动上链机芯也大约需要 35 圈才能满链。',
|
|
50
50
|
},
|
|
51
51
|
{
|
|
52
52
|
question: '佩戴手表充能和上链效果一样吗?',
|
|
53
|
-
answer: '佩戴时充能较慢且不稳定。在办公桌前工作时,通过摆陀每小时可充能 4
|
|
53
|
+
answer: '佩戴时充能较慢且不稳定。在办公桌前工作时,通过摆陀每小时可充能 4-6%。在活动状态下(步行、运动),每小时可达 8-10%。手动上链更快、更可预测。',
|
|
54
54
|
},
|
|
55
55
|
{
|
|
56
56
|
question: '手表每小时消耗多少动力储存?',
|
|
@@ -90,7 +90,7 @@ export const content: ToolLocaleContent<PowerReserveEstimatorUI> = {
|
|
|
90
90
|
'name': '转动表冠一圈能为手表充多少电?',
|
|
91
91
|
'acceptedAnswer': {
|
|
92
92
|
'@type': 'Answer',
|
|
93
|
-
'text': '取决于机芯。大多数自动机芯在 30
|
|
93
|
+
'text': '取决于机芯。大多数自动机芯在 30-40 圈内达到满链,因此每圈约增加总动力储存的 2.5-3.3%。Unitas 6498 等手动上链机芯也大约需要 35 圈才能满链。',
|
|
94
94
|
},
|
|
95
95
|
},
|
|
96
96
|
{
|
|
@@ -98,7 +98,7 @@ export const content: ToolLocaleContent<PowerReserveEstimatorUI> = {
|
|
|
98
98
|
'name': '佩戴手表充能和上链效果一样吗?',
|
|
99
99
|
'acceptedAnswer': {
|
|
100
100
|
'@type': 'Answer',
|
|
101
|
-
'text': '佩戴时充能较慢且不稳定。在办公桌前工作时,通过摆陀每小时可充能 4
|
|
101
|
+
'text': '佩戴时充能较慢且不稳定。在办公桌前工作时,通过摆陀每小时可充能 4-6%。在活动状态下每小时可达 8-10%。手动上链更快、更可预测。',
|
|
102
102
|
},
|
|
103
103
|
},
|
|
104
104
|
{
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { quartzBatteryHealth } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'en' } = Astro.props as Props;
|
|
11
|
+
const loader = quartzBatteryHealth.i18n[locale] || quartzBatteryHealth.i18n.en;
|
|
12
|
+
const content = await loader?.();
|
|
13
|
+
if (!content) return null;
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
{content && <SharedBibliography links={content.bibliography} />}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { BibliographyEntry } from '../../types';
|
|
2
|
+
|
|
3
|
+
export const bibliography: BibliographyEntry[] = [
|
|
4
|
+
{
|
|
5
|
+
name: 'Quartz Watch Battery Life Guide - Batteries Plus',
|
|
6
|
+
url: 'https://www.batteriesplus.com/blog/power/watch-battery-installation',
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
name: 'The Definitive Guide to Watch Battery Sizes - Japan Watch Parts',
|
|
10
|
+
url: 'https://www.japanwatchparts.co.uk/blogs/news/the-definitive-guide-to-watch-battery-sizes-discovering-genuine-parts-for-seiko-casio-and-more',
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
name: 'Battery Capacity vs. Caliber Consumption - ETA Technical Data',
|
|
14
|
+
url: 'https://calibercorner.com/eta-caliber-955-412/',
|
|
15
|
+
},
|
|
16
|
+
];
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
interface BatteryData {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
capacity: number;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
const batteries: BatteryData[] = [
|
|
8
|
+
{ id: 'sr621sw', name: 'SR621SW (364)', capacity: 18 },
|
|
9
|
+
{ id: 'sr626sw', name: 'SR626SW (377)', capacity: 27 },
|
|
10
|
+
{ id: 'sr716sw', name: 'SR716SW (315)', capacity: 25 },
|
|
11
|
+
{ id: 'sr721sw', name: 'SR721SW (361)', capacity: 32 },
|
|
12
|
+
{ id: 'sr920sw', name: 'SR920SW (371)', capacity: 40 },
|
|
13
|
+
{ id: 'sr936sw', name: 'SR936SW (394)', capacity: 55 },
|
|
14
|
+
{ id: 'sr1130sw', name: 'SR1130SW (389)', capacity: 80 },
|
|
15
|
+
{ id: 'sr44', name: 'SR44 (357)', capacity: 150 },
|
|
16
|
+
{ id: 'cr2025', name: 'CR2025', capacity: 165 },
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
const mainEl = document.querySelector('.tool-main-card') as HTMLElement;
|
|
20
|
+
const ui = mainEl ? JSON.parse(mainEl.dataset.ui || '{}') : {};
|
|
21
|
+
|
|
22
|
+
const batterySelect = document.getElementById('battery-select') as HTMLSelectElement;
|
|
23
|
+
const customFields = document.getElementById('custom-fields') as HTMLElement;
|
|
24
|
+
const customCapacity = document.getElementById('custom-capacity') as HTMLInputElement;
|
|
25
|
+
const consumptionInput = document.getElementById('consumption-input') as HTMLInputElement;
|
|
26
|
+
const installMonth = document.getElementById('install-month') as HTMLSelectElement;
|
|
27
|
+
const installYear = document.getElementById('install-year') as HTMLInputElement;
|
|
28
|
+
const calcBtn = document.getElementById('calc-btn') as HTMLButtonElement;
|
|
29
|
+
const resultCard = document.getElementById('result-card') as HTMLElement;
|
|
30
|
+
const lifeYears = document.getElementById('life-years') as HTMLElement;
|
|
31
|
+
const lifeMonths = document.getElementById('life-months') as HTMLElement;
|
|
32
|
+
const lifeDays = document.getElementById('life-days') as HTMLElement;
|
|
33
|
+
const gaugeFill = document.getElementById('gauge-fill') as HTMLElement;
|
|
34
|
+
const healthBadge = document.getElementById('health-badge') as HTMLElement;
|
|
35
|
+
const changeDateRow = document.getElementById('change-date-row') as HTMLElement;
|
|
36
|
+
const changeDateValue = document.getElementById('change-date-value') as HTMLElement;
|
|
37
|
+
const changeDateHint = document.getElementById('change-date-hint') as HTMLElement;
|
|
38
|
+
|
|
39
|
+
const STORAGE_KEY = 'quartz-battery-health-state';
|
|
40
|
+
|
|
41
|
+
interface SavedState {
|
|
42
|
+
battery: string;
|
|
43
|
+
customCapacity: string;
|
|
44
|
+
consumption: string;
|
|
45
|
+
month: string;
|
|
46
|
+
year: string;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function saveState() {
|
|
50
|
+
const state: SavedState = {
|
|
51
|
+
battery: batterySelect.value,
|
|
52
|
+
customCapacity: customCapacity.value,
|
|
53
|
+
consumption: consumptionInput.value,
|
|
54
|
+
month: installMonth.value,
|
|
55
|
+
year: installYear.value,
|
|
56
|
+
};
|
|
57
|
+
try { localStorage.setItem(STORAGE_KEY, JSON.stringify(state)); } catch {}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function setDateDefaults() {
|
|
61
|
+
installMonth.value = String(new Date().getMonth() + 1);
|
|
62
|
+
installYear.value = String(new Date().getFullYear());
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function restoreState() {
|
|
66
|
+
try {
|
|
67
|
+
const raw = localStorage.getItem(STORAGE_KEY);
|
|
68
|
+
if (!raw) { setDateDefaults(); return; }
|
|
69
|
+
const state: SavedState = JSON.parse(raw);
|
|
70
|
+
if (state.battery) batterySelect.value = state.battery;
|
|
71
|
+
if (state.customCapacity) customCapacity.value = state.customCapacity;
|
|
72
|
+
if (state.consumption) consumptionInput.value = state.consumption;
|
|
73
|
+
if (state.month) installMonth.value = state.month;
|
|
74
|
+
if (state.year) installYear.value = state.year;
|
|
75
|
+
} catch { setDateDefaults(); }
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function parseLocalizedFloat(value: string): number {
|
|
79
|
+
return parseFloat(value.replace(/,/g, '.')) || 0;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function getBattery(id: string): BatteryData | null {
|
|
83
|
+
return batteries.find((b) => b.id === id) || null;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function getCapacity(): number {
|
|
87
|
+
if (batterySelect.value === 'custom') {
|
|
88
|
+
return parseLocalizedFloat(customCapacity.value) || 40;
|
|
89
|
+
}
|
|
90
|
+
const b = getBattery(batterySelect.value);
|
|
91
|
+
return b ? b.capacity : 40;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function calcValue(input: HTMLInputElement, delta: number) {
|
|
95
|
+
const step = parseFloat(input.step) || 1;
|
|
96
|
+
const val = parseLocalizedFloat(input.value);
|
|
97
|
+
const min = parseFloat(input.min) || 0;
|
|
98
|
+
const max = parseFloat(input.max) || 100;
|
|
99
|
+
const next = Math.max(min, Math.min(max, Math.round((val + delta) * (1 / step)) / (1 / step)));
|
|
100
|
+
input.value = String(next);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function getHealthStatus(pct: number): { label: string; color: string } {
|
|
104
|
+
if (pct >= 50) return { label: ui.healthGood || 'Good', color: 'var(--color-success, #22c55e)' };
|
|
105
|
+
if (pct >= 20) return { label: ui.healthModerate || 'Moderate', color: 'var(--color-warning, #f59e0b)' };
|
|
106
|
+
return { label: ui.healthCritical || 'Critical', color: 'var(--color-danger, #ef4444)' };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function formatDate(d: Date): string {
|
|
110
|
+
return d.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function updateHealth(totalDays: number) {
|
|
114
|
+
const month = parseInt(installMonth.value, 10);
|
|
115
|
+
const year = parseInt(installYear.value, 10);
|
|
116
|
+
if (!month || !year) {
|
|
117
|
+
gaugeFill.style.width = '0%';
|
|
118
|
+
healthBadge.textContent = '--';
|
|
119
|
+
changeDateRow.style.display = 'none';
|
|
120
|
+
changeDateHint.style.display = 'block';
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const installed = new Date(year, month - 1, 1);
|
|
124
|
+
const elapsedDays = (Date.now() - installed.getTime()) / 86400000;
|
|
125
|
+
const remainingPct = Math.max(0, Math.min(100, (1 - elapsedDays / totalDays) * 100));
|
|
126
|
+
|
|
127
|
+
gaugeFill.style.width = remainingPct + '%';
|
|
128
|
+
const health = getHealthStatus(remainingPct);
|
|
129
|
+
gaugeFill.style.background = `linear-gradient(90deg, ${health.color}, color-mix(in srgb, ${health.color} 70%, #fff 30%))`;
|
|
130
|
+
healthBadge.textContent = health.label;
|
|
131
|
+
healthBadge.style.background = health.color;
|
|
132
|
+
|
|
133
|
+
const replaceBy = new Date(installed.getTime() + totalDays * 86400000);
|
|
134
|
+
changeDateValue.textContent = formatDate(replaceBy);
|
|
135
|
+
changeDateRow.style.display = 'flex';
|
|
136
|
+
changeDateHint.style.display = 'none';
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function calculate() {
|
|
140
|
+
const capacity = getCapacity();
|
|
141
|
+
const consumption = parseLocalizedFloat(consumptionInput.value) || 1.5;
|
|
142
|
+
if (consumption <= 0) return;
|
|
143
|
+
|
|
144
|
+
const totalDays = ((capacity * 1000) / consumption) / 24;
|
|
145
|
+
const totalYears = totalDays / 365.25;
|
|
146
|
+
|
|
147
|
+
const years = Math.floor(totalYears);
|
|
148
|
+
const months = Math.floor((totalYears - years) * 12);
|
|
149
|
+
const days = Math.floor(totalDays - (years * 365.25 + months * 30.4375));
|
|
150
|
+
|
|
151
|
+
lifeYears.textContent = String(years);
|
|
152
|
+
lifeMonths.textContent = String(months);
|
|
153
|
+
lifeDays.textContent = String(days);
|
|
154
|
+
|
|
155
|
+
updateHealth(totalDays);
|
|
156
|
+
resultCard.style.display = 'flex';
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function toggleCustom() {
|
|
160
|
+
const show = batterySelect.value === 'custom';
|
|
161
|
+
customFields.style.display = show ? 'flex' : 'none';
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function commit() {
|
|
165
|
+
saveState();
|
|
166
|
+
calculate();
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
batterySelect.addEventListener('change', () => {
|
|
170
|
+
toggleCustom();
|
|
171
|
+
commit();
|
|
172
|
+
});
|
|
173
|
+
calcBtn.addEventListener('click', commit);
|
|
174
|
+
|
|
175
|
+
[customCapacity, consumptionInput, installMonth, installYear].forEach((el) => {
|
|
176
|
+
el.addEventListener('keydown', (e) => {
|
|
177
|
+
if ((e as KeyboardEvent).key === 'Enter') commit();
|
|
178
|
+
});
|
|
179
|
+
el.addEventListener('input', commit);
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
document.querySelectorAll('.stepper-btn').forEach((btn) => {
|
|
183
|
+
btn.addEventListener('click', () => {
|
|
184
|
+
const target = document.getElementById(btn.getAttribute('data-target') || '') as HTMLInputElement;
|
|
185
|
+
const dir = parseFloat(btn.getAttribute('data-dir') || '1');
|
|
186
|
+
if (target) {
|
|
187
|
+
calcValue(target, dir);
|
|
188
|
+
commit();
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
restoreState();
|
|
194
|
+
toggleCustom();
|
|
195
|
+
commit();
|
|
196
|
+
|
|
197
|
+
export {};
|
|
198
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
import BatteryHealthPanel from './components/BatteryHealthPanel.astro';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
ui: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const { ui } = Astro.props;
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
<div class="tool-main-card" data-ui={JSON.stringify(ui)}>
|
|
12
|
+
<BatteryHealthPanel labels={ui} />
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
<script src="./client.ts"></script>
|