@jjlmoya/utils-astronomy 1.35.1 → 1.37.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 (86) hide show
  1. package/package.json +18 -5
  2. package/scripts/postbuild.mjs +17 -0
  3. package/scripts/postinstall.mjs +2 -4
  4. package/src/category/index.ts +2 -1
  5. package/src/components/ProductionBreadcrumb.astro +134 -0
  6. package/src/components/ProductionStructuredData.astro +46 -0
  7. package/src/components/ProductionWidget.astro +182 -0
  8. package/src/entries.ts +4 -2
  9. package/src/i18n/header-ui.ts +15 -0
  10. package/src/i18n/language-ui.ts +9 -0
  11. package/src/i18n/languages.ts +24 -0
  12. package/src/identity/brands.ts +5 -0
  13. package/src/index.ts +2 -1
  14. package/src/layouts/ProductionCategoryPage.astro +184 -0
  15. package/src/layouts/ProductionPage.astro +218 -0
  16. package/src/layouts/ProductionUtilityPage.astro +283 -0
  17. package/src/mfe/assets.ts +39 -0
  18. package/src/mfe/category-ui.ts +34 -0
  19. package/src/mfe/manifest.ts +45 -0
  20. package/src/mfe/routes.ts +50 -0
  21. package/src/pages/[locale]/[utilities]/[categories]/[category]/[slug]/manifest.json.ts +49 -0
  22. package/src/pages/[locale]/[utilities]/[categories]/[category]/[slug].astro +100 -0
  23. package/src/pages/[locale]/[utilities]/[categories]/[category].astro +44 -0
  24. package/src/pages/index.astro +4 -4
  25. package/src/pages/mfe-sitemaps/[locale]/[vertical]/sitemap.xml.ts +75 -0
  26. package/src/pages/utilidades/[slug]/manifest.json.ts +28 -0
  27. package/src/pages/utilidades/[slug].astro +90 -0
  28. package/src/pages/utilidades/categorias/[category].astro +38 -0
  29. package/src/tests/locale_completeness.test.ts +2 -2
  30. package/src/tests/mfe_cache_contract.test.ts +14 -0
  31. package/src/tests/mfe_manifest.test.ts +28 -0
  32. package/src/tests/registry_contract.test.ts +67 -0
  33. package/src/tests/tool_validation.test.ts +4 -3
  34. package/src/tool/astrophotographyExposureStackPlanner/astrophotography-exposure-stacking-planner.css +496 -0
  35. package/src/tool/astrophotographyExposureStackPlanner/bibliography.astro +14 -0
  36. package/src/tool/astrophotographyExposureStackPlanner/bibliography.ts +12 -0
  37. package/src/tool/astrophotographyExposureStackPlanner/component.astro +149 -0
  38. package/src/tool/astrophotographyExposureStackPlanner/controller.ts +125 -0
  39. package/src/tool/astrophotographyExposureStackPlanner/dom-views.ts +41 -0
  40. package/src/tool/astrophotographyExposureStackPlanner/entry.ts +29 -0
  41. package/src/tool/astrophotographyExposureStackPlanner/evaluator.ts +44 -0
  42. package/src/tool/astrophotographyExposureStackPlanner/i18n/de.ts +40 -0
  43. package/src/tool/astrophotographyExposureStackPlanner/i18n/en.ts +232 -0
  44. package/src/tool/astrophotographyExposureStackPlanner/i18n/es.ts +52 -0
  45. package/src/tool/astrophotographyExposureStackPlanner/i18n/fr.ts +40 -0
  46. package/src/tool/astrophotographyExposureStackPlanner/i18n/id.ts +40 -0
  47. package/src/tool/astrophotographyExposureStackPlanner/i18n/it.ts +40 -0
  48. package/src/tool/astrophotographyExposureStackPlanner/i18n/ja.ts +40 -0
  49. package/src/tool/astrophotographyExposureStackPlanner/i18n/ko.ts +40 -0
  50. package/src/tool/astrophotographyExposureStackPlanner/i18n/nl.ts +40 -0
  51. package/src/tool/astrophotographyExposureStackPlanner/i18n/pl.ts +40 -0
  52. package/src/tool/astrophotographyExposureStackPlanner/i18n/pt.ts +40 -0
  53. package/src/tool/astrophotographyExposureStackPlanner/i18n/ru.ts +40 -0
  54. package/src/tool/astrophotographyExposureStackPlanner/i18n/sv.ts +40 -0
  55. package/src/tool/astrophotographyExposureStackPlanner/i18n/tr.ts +40 -0
  56. package/src/tool/astrophotographyExposureStackPlanner/i18n/zh.ts +40 -0
  57. package/src/tool/astrophotographyExposureStackPlanner/index.ts +11 -0
  58. package/src/tool/astrophotographyExposureStackPlanner/localized.ts +59 -0
  59. package/src/tool/astrophotographyExposureStackPlanner/logic.test.ts +74 -0
  60. package/src/tool/astrophotographyExposureStackPlanner/logic.ts +95 -0
  61. package/src/tool/astrophotographyExposureStackPlanner/seo.astro +14 -0
  62. package/src/tool/astrophotographyExposureStackPlanner/storage.ts +22 -0
  63. package/src/tool/astrophotographyExposureStackPlanner/ui.ts +102 -0
  64. package/src/tool/meteorShowerObservingPlanner/dom-views.ts +38 -16
  65. package/src/tool/meteorShowerObservingPlanner/i18n/de.ts +219 -219
  66. package/src/tool/meteorShowerObservingPlanner/i18n/en.ts +219 -219
  67. package/src/tool/meteorShowerObservingPlanner/i18n/es.ts +219 -219
  68. package/src/tool/meteorShowerObservingPlanner/i18n/fr.ts +219 -219
  69. package/src/tool/meteorShowerObservingPlanner/i18n/id.ts +223 -223
  70. package/src/tool/meteorShowerObservingPlanner/i18n/it.ts +223 -223
  71. package/src/tool/meteorShowerObservingPlanner/i18n/ja.ts +219 -219
  72. package/src/tool/meteorShowerObservingPlanner/i18n/ko.ts +219 -219
  73. package/src/tool/meteorShowerObservingPlanner/i18n/nl.ts +223 -223
  74. package/src/tool/meteorShowerObservingPlanner/i18n/pl.ts +223 -223
  75. package/src/tool/meteorShowerObservingPlanner/i18n/pt.ts +223 -223
  76. package/src/tool/meteorShowerObservingPlanner/i18n/ru.ts +219 -219
  77. package/src/tool/meteorShowerObservingPlanner/i18n/sv.ts +223 -223
  78. package/src/tool/meteorShowerObservingPlanner/i18n/tr.ts +223 -223
  79. package/src/tool/meteorShowerObservingPlanner/i18n/zh.ts +219 -219
  80. package/src/tool/meteorShowerObservingPlanner/meteor-shower-observing-planner.css +16 -9
  81. package/src/tool/meteorShowerObservingPlanner/ui.ts +87 -87
  82. package/src/tools.ts +3 -1
  83. package/src/types.ts +2 -2
  84. package/src/worker.ts +27 -0
  85. package/src/pages/[locale]/[slug].astro +0 -161
  86. package/src/pages/[locale].astro +0 -251
@@ -0,0 +1,40 @@
1
+ import { createLocalizedContent } from '../localized';
2
+
3
+ export const content = createLocalizedContent({
4
+ slug: "planner-astrofotografie-belichtingsstapeling",
5
+ title: "Planner voor belichtingsstapeling in astrofotografie",
6
+ description: "Plan astrofotografiesessies met NPF en de 500 regel, het aantal frames, totale integratie en werkelijke tijd in het veld.",
7
+ ui: {
8
+ cameraLegend: "Camerageometrie", focalLabel: "Brandpuntsafstand", focalHelp: "Brandpuntsafstand van lens of telescoop in mm", apertureLabel: "Diafragma", apertureHelp: "Gebruik het f getal, bijvoorbeeld 2,8", pixelPitchLabel: "Pixelpitch", pixelPitchHelp: "Fysieke grootte van de fotosite in micrometer", declinationLabel: "Declinatie van doel", declinationHelp: "Absolute declinatie in graden", sensorLabel: "Sensorformaat", sensorOptions: { fullFrame: "Full frame", apsC: "APS C", microFourThirds: "Micro Four Thirds", phone: "Telefoonsensor" },
9
+ ruleLabel: "Belichtingslimiet", ruleNpf: "NPF formule", rule500: "500 regel", trackingLabel: "Status montering", untracked: "Zonder tracking", tracked: "Trackingmontering", trackingExposureLabel: "Belichting per gevolgd frame", trackingExposureHelp: "Alleen gebruikt met een trackingmontering. Begin met 30 tot 120 s en controleer testframes.", deadTimeLabel: "Dode tijd tussen frames", deadTimeHelp: "Begin met ongeveer 2 s en pas aan voor buffer, kaartschrijven en interval.", totalIntegrationLabel: "Gewenste totale integratie", totalIntegrationHelp: "De nuttige belichtingstijd die je wilt verzamelen", resultTitle: "Je opnameplan", resultKicker: "Een startpunt voor de nacht", secondsUnit: "per frame", framesLabel: "frames", totalTimeLabel: "Geplande integratie", sessionTimeLabel: "Geschatte veldtijd", gainLabel: "Ideale stackingwinst", sessionDetail: "Inclusief {dead} tussen frames: {deadTotal} intervaltijd.", workloadText: "{frames} sluiterbewegingen. De veldschatting bevat de dode tijd tussen frames.", highWorkloadText: "{frames} sluiterbewegingen. Overweeg elektronische sluiter, extra accu's en opslag. Geschatte veldtijd: {session}.", sensorPixelWarning: "Controleer de cameraspecificatie: {pixel} is groot voor APS C en kan de NPF limiet verkorten.", comparisonTitle: "Twee limieten, één keuze", npfLabel: "NPF limiet", rule500Label: "Limiet van de 500 regel", deltaLabel: "NPF verschil", timelineTitle: "De stack als lichtstrook", timelineStart: "eerste frame", timelineEnd: "laatste frame", trackingNote: "Tracking is actief. Het plan gebruikt {ceiling} per frame, dus {frames} frames en ongeveer {session} in het veld. Controleer deze duur met uitlijning, guiding en een testframe; NPF blijft de vergelijking zonder tracking.", untrackedNote: "Gebruik {ceiling} als startlimiet en bekijk een testframe op volledige resolutie voor stervorm en hemelgloed.", methodTitle: "Zo wordt de schatting gemaakt", methodText: "De NPF route gebruikt diafragma, brandpuntsafstand, pixelpitch en declinatie om zichtbare sterrenbeweging op pixelniveau te schatten. De 500 regel gebruikt alleen brandpuntsafstand en sensorcropfactor. Beide zijn geometrische heuristieken voor een camera zonder tracking. Met een trackingmontering gebruikt het plan je ingevoerde belichting en certificeert het de montering niet.", limitsTitle: "Limiet in het veld", limitsText: "Tracking, een heldere hemel, een uitsnede met hoge resolutie, wind of focusdrift kan de praktische belichting veranderen. Maak een testframe en beoordeel hoeken, histogram en montering.", startingStatus: "Invoer controleren", formulaLabel: "Referentieformules", formulaNpf: "NPF: (16,9 x diafragma + 0,10 x brandpuntsafstand + 13,7 x pixelpitch) / (brandpuntsafstand x cosinus declinatie).", formula500: "500 regel: 500 / (brandpuntsafstand x sensorcropfactor).", presetsLabel: "Snelle instellingen", presets: { milkyWay: "24 mm full frame", wideAngle: "14 mm groothoek", telephoto: "85 mm telelens" },
10
+ },
11
+ seo: [
12
+ { type: "title", text: "Waarom een belichtingsstack een limiet nodig heeft", level: 2 },
13
+ { type: "paragraph", html: "Een belichtingsstack bestaat uit losse frames die later worden uitgelijnd en gecombineerd. Zo verzamel je meer signaal terwijl elk frame bruikbaar blijft. Bij een vaste camera maken te lange belichtingen sterren langwerpig door de schijnbare beweging van de hemel. Te korte frames maken de sessie inefficiënt door leesruis en opslagtijd." },
14
+ { type: "paragraph", html: "Deze planner vergelijkt NPF met de 500 regel, deelt de gewenste integratie op in volledige frames en telt de dode tijd tussen bestanden op bij de veldtijd. Het laatste frame kan de gewenste duur iets overschrijden omdat een deel van een frame niet kan worden gemaakt." },
15
+ { type: "list", items: ["Gebruik NPF als diafragma en pixelpitch bekend zijn.", "Gebruik de 500 regel als snelle vergelijking met sensorcrop.", "Zie het aantal frames als echte belasting voor opslag en selectie.", "Maak een testframe voordat je de volledige stack start."] },
16
+ { type: "tip", title: "Een limiet is geen garantie", html: "Controleer heldere sterren en hoeken op volledige resolutie. Wind, coma, focusdrift en trillingen kunnen zwaarder wegen dan de formule." },
17
+ { type: "title", text: "NPF en de 500 regel beantwoorden verschillende vragen", level: 2 },
18
+ { type: "paragraph", html: "De 500 regel is snel en gebruikt de cropfactor van de sensor, maar niet pixelpitch, diafragma of declinatie. NPF voegt deze waarden toe en past beter bij een specifieke camera en lens, maar blijft een heuristiek voor een camera zonder tracking." },
19
+ { type: "title", text: "Zo maak je van het resultaat een nachtsessie", level: 2 },
20
+ { type: "paragraph", html: "Voer de echte waarden in van de apparatuur die je meeneemt. Gebruik geen equivalente brandpuntsafstand als de echte brandpuntsafstand en het sensorformaat al apart zijn ingevoerd. Gebruik voor pixelpitch de juiste modelspecificatie." },
21
+ { type: "list", items: ["Bekijk de hoeken van een testframe op honderd procent.", "Controleer histogram en uitgebeten hooglichten.", "Houd focus en instellingen constant.", "Plan tijd voor dark frames en kalibratie."] },
22
+ { type: "title", text: "Wat verandert er met een trackingmontering", level: 2 },
23
+ { type: "paragraph", html: "Met tracking gebruikt de tool de ingevoerde belichting per frame om het aantal frames te berekenen. NPF en de 500 regel blijven zichtbaar als vergelijking zonder tracking, maar bepalen niet langer de framecount. Pooluitlijning, periodieke fout, guiding, wind, hemelgloed en verzadiging kunnen de nieuwe limiet worden." },
24
+ { type: "tip", title: "Eerst testen, dan de volledige stack", html: "Maak een korte testserie, vergroot de hoeken en controleer de sterren. Pas de gevolgde belichting aan voordat je twee uur donkere hemel vastlegt." },
25
+ { type: 'paragraph', html: 'Een voorbeeld maakt het verschil duidelijk: bij 35 mm, APS C, 5,9 micrometer en 5 graden declinatie ligt de NPF grens rond 3,8 seconden. Zonder tracking zijn voor twee uur ongeveer 1.907 beelden nodig. Met een volgmontering en 120 seconden per beeld zijn 60 beelden genoeg; vijf seconden wachttijd per beeld voegen slechts vijf minuten veldtijd toe.' },
26
+ { type: 'paragraph', html: 'Houd integratietijd en werkelijke sessieduur apart. Schrijfpauzes, controle van de scherpstelling, dithering, batterijwissels en afgekeurde beelden horen in de nachtplanning, ook als ze geen signaal toevoegen. Bij veel korte beelden kan een elektronische sluiter mechanische slijtage verminderen, maar buffer en opslagruimte moeten nog steeds worden gecontroleerd.' },
27
+ { type: 'tip', title: 'Controleer pixelgrootte en sensor', html: 'APS C met 5,9 micrometer is ongebruikelijk voor moderne camera s met hoge resolutie. Als de echte pixel kleiner is, wordt de NPF grens korter. Controleer het exacte cameramodel en maak een testbeeld voordat je de volledige reeks start.' },
28
+ ],
29
+ faq: [
30
+ { question: "Moet ik NPF of de 500 regel gebruiken?", answer: "Gebruik NPF als camera specifieke startwaarde wanneer diafragma en pixelpitch bekend zijn. Gebruik de 500 regel als snelle vergelijking en test beide resultaten op volledige resolutie." },
31
+ { question: "Wat bevat het aantal frames?", answer: "Het telt volledige lichtframes die nodig zijn om de gewenste integratie te bereiken of iets te overschrijden. Darks, flats, bias, pauzes en afgekeurde beelden zijn niet inbegrepen." },
32
+ { question: "Berekent tracking de nauwkeurigheid van guiding?", answer: "Nee. De modus gebruikt de ingevoerde gevolgde belichting. Uitlijning, guiding en hemelgloed moeten met testframes worden gecontroleerd." },
33
+ ],
34
+ howTo: [
35
+ { name: "Voer camerageometrie in", text: "Vul brandpuntsafstand, diafragma, pixelpitch en declinatie in." },
36
+ { name: "Kies de modus", text: "Kies zonder tracking NPF of de 500 regel, of activeer tracking en stel de belichting per frame in." },
37
+ { name: "Stel integratie in", text: "Voer de nuttige totale tijd in en bekijk frames en veldtijd." },
38
+ { name: "Valideer in het veld", text: "Maak een testframe, controleer sterren en histogram en pas de reeks aan." },
39
+ ],
40
+ });
@@ -0,0 +1,40 @@
1
+ import { createLocalizedContent } from '../localized';
2
+
3
+ export const content = createLocalizedContent({
4
+ slug: 'planer-stosowania-ekspozycji-astrofotografii',
5
+ title: 'Planer stosowania ekspozycji w astrofotografii',
6
+ description: 'Planuj sesje astrofotograficzne z limitem NPF i regułą 500, liczbą klatek, całkowitą integracją oraz czasem w terenie.',
7
+ ui: {
8
+ cameraLegend: 'Geometria aparatu', focalLabel: 'Ogniskowa', focalHelp: 'Ogniskowa obiektywu lub teleskopu w mm', apertureLabel: 'Przysłona', apertureHelp: 'Użyj liczby f, na przykład 2,8', pixelPitchLabel: 'Rozmiar piksela', pixelPitchHelp: 'Fizyczny rozmiar fotopiksela w mikrometrach', declinationLabel: 'Deklinacja celu', declinationHelp: 'Wpisz bezwzględną deklinację w stopniach', sensorLabel: 'Format matrycy', sensorOptions: { fullFrame: 'Pełna klatka', apsC: 'APS C', microFourThirds: 'Micro Four Thirds', phone: 'Matryca telefonu' },
9
+ ruleLabel: 'Limit ekspozycji', ruleNpf: 'Wzór NPF', rule500: 'Reguła 500', trackingLabel: 'Stan montażu', untracked: 'Bez śledzenia', tracked: 'Montaż ze śledzeniem', trackingExposureLabel: 'Ekspozycja na klatkę ze śledzeniem', trackingExposureHelp: 'Używane tylko z montażem ze śledzeniem. Zacznij od 30 do 120 s i sprawdź klatki testowe.', deadTimeLabel: 'Przerwa między klatkami', deadTimeHelp: 'Zacznij od około 2 s i dopasuj do bufora, zapisu karty oraz interwału aparatu.', totalIntegrationLabel: 'Żądana całkowita integracja', totalIntegrationHelp: 'Użyteczny czas ekspozycji, który chcesz zebrać', resultTitle: 'Twój plan zdjęć', resultKicker: 'Punkt wyjścia na tę noc', secondsUnit: 'na klatkę', framesLabel: 'klatek', totalTimeLabel: 'Planowana integracja', sessionTimeLabel: 'Szacowany czas w terenie', gainLabel: 'Idealny zysk stosowania', sessionDetail: 'Uwzględnia {dead} między klatkami: {deadTotal} czasu przerw.', workloadText: '{frames} cykli migawki. Szacunek czasu w terenie zawiera przerwy między klatkami.', highWorkloadText: '{frames} cykli migawki. Rozważ migawkę elektroniczną, dodatkowe baterie i miejsce na dane. Szacowany czas: {session}.', sensorPixelWarning: 'Sprawdź specyfikację aparatu: {pixel} to duży rozmiar piksela dla APS C i może skrócić limit NPF.', comparisonTitle: 'Dwa limity, jedna decyzja', npfLabel: 'Limit NPF', rule500Label: 'Limit reguły 500', deltaLabel: 'Różnica NPF', timelineTitle: 'Stos jako pasmo światła', timelineStart: 'pierwsza klatka', timelineEnd: 'ostatnia klatka', trackingNote: 'Śledzenie jest aktywne. Plan używa {ceiling} na klatkę, czyli {frames} klatek i około {session} w terenie. Sprawdź ten czas za pomocą ustawienia polarnego, guidingu i klatki testowej; NPF pozostaje porównaniem bez śledzenia.', untrackedNote: 'Użyj {ceiling} jako limitu początkowego, a następnie sprawdź klatkę testową w pełnej rozdzielczości pod kątem kształtu gwiazd i jasności nieba.', methodTitle: 'Jak powstaje szacunek', methodText: 'Ścieżka NPF używa przysłony, ogniskowej, rozmiaru piksela i deklinacji, aby oszacować widoczny ruch gwiazd na poziomie piksela. Reguła 500 używa tylko ogniskowej i współczynnika przycięcia matrycy. Obie są geometrycznymi heurystykami dla aparatu bez śledzenia. Przy montażu ze śledzeniem plan używa wpisanej ekspozycji i nie certyfikuje montażu.', limitsTitle: 'Limit w terenie', limitsText: 'Śledzenie, jasne niebo, wycinek o wysokiej rozdzielczości, wiatr lub zmiana ostrości mogą zmienić praktyczną ekspozycję. Zrób klatkę testową i sprawdź narożniki, histogram oraz montaż.', startingStatus: 'Sprawdzanie danych', formulaLabel: 'Wzory referencyjne', formulaNpf: 'NPF: (16,9 x przysłona + 0,10 x ogniskowa + 13,7 x rozmiar piksela) / (ogniskowa x cosinus deklinacji).', formula500: 'Reguła 500: 500 / (ogniskowa x współczynnik przycięcia matrycy).', presetsLabel: 'Szybkie ustawienia', presets: { milkyWay: '24 mm pełna klatka', wideAngle: '14 mm szeroki kąt', telephoto: '85 mm teleobiektyw' },
10
+ },
11
+ seo: [
12
+ { type: 'title', text: 'Dlaczego stos ekspozycji potrzebuje limitu', level: 2 },
13
+ { type: 'paragraph', html: 'Stos ekspozycji to osobne klatki, które później są wyrównywane i łączone. Celem jest zebranie większej ilości sygnału przy zachowaniu użyteczności każdej klatki. Przy nieruchomym aparacie zbyt długa ekspozycja rozciąga gwiazdy przez pozorny ruch nieba. Zbyt krótkie klatki mogą powodować nieefektywność przez szum odczytu i przerwy zapisu.' },
14
+ { type: 'paragraph', html: 'Ten planer zamienia oba wybory w konkretny plan zdjęć. Porównuje limity NPF i reguły 500, dzieli żądaną integrację na pełne klatki oraz dodaje przerwy między plikami do czasu w terenie. Ostatnia klatka może lekko przekroczyć cel, ponieważ aparat nie wykonuje ułamkowej klatki.' },
15
+ { type: 'list', items: ['Użyj NPF, gdy znasz przysłonę i rozmiar piksela.', 'Użyj reguły 500 jako szybkiego porównania z przycięciem matrycy.', 'Traktuj liczbę klatek jako realny koszt pamięci i selekcji.', 'Zrób klatkę testową przed pełnym stosem.'] },
16
+ { type: 'tip', title: 'Limit nie jest gwarancją', html: 'Sprawdź jasne gwiazdy i narożniki w pełnej rozdzielczości. Wiatr, koma, zmiana ostrości i drgania mogą mieć większe znaczenie niż wzór.' },
17
+ { type: 'title', text: 'NPF i reguła 500 odpowiadają na różne pytania', level: 2 },
18
+ { type: 'paragraph', html: 'Reguła 500 jest szybka i uwzględnia współczynnik przycięcia, ale pomija rozmiar piksela, przysłonę i deklinację. NPF dodaje te zmienne i lepiej pasuje do konkretnego aparatu oraz obiektywu, nadal jednak pozostaje heurystyką dla aparatu bez śledzenia.' },
19
+ { type: 'title', text: 'Jak zmienić wynik w nocną sesję', level: 2 },
20
+ { type: 'paragraph', html: 'Wpisz rzeczywiste wartości sprzętu, którego użyjesz. Nie wpisuj ogniskowej ekwiwalentnej, jeśli rzeczywista ogniskowa i format matrycy są już rozdzielone. Rozmiar piksela odczytaj z wiarygodnej specyfikacji modelu.' },
21
+ { type: 'list', items: ['Sprawdź narożniki klatki testowej przy pełnej rozdzielczości.', 'Skontroluj histogram i przepalone światła.', 'Zachowaj stałą ostrość i ustawienia.', 'Zaplanuj czas na darki i kalibrację.'] },
22
+ { type: 'title', text: 'Co zmienia montaż ze śledzeniem', level: 2 },
23
+ { type: 'paragraph', html: 'Po włączeniu śledzenia narzędzie używa wpisanej ekspozycji na klatkę. NPF i reguła 500 pozostają widoczne jako porównanie bez śledzenia, ale nie wyznaczają już liczby plików. Ustawienie polarne, błąd okresowy, guiding, wiatr, jasność nieba i nasycenie mogą stać się nowym limitem.' },
24
+ { type: 'tip', title: 'Najpierw test, potem cały stos', html: 'Wykonaj krótką serię testową, powiększ narożniki i sprawdź gwiazdy. Dostosuj ekspozycję ze śledzeniem przed wykorzystaniem dwóch godzin ciemnego nieba.' },
25
+ { type: 'paragraph', html: 'Przykład pokazuje różnicę: przy 35 mm, APS C, pikselu 5,9 mikrometra i deklinacji 5 stopni limit NPF wynosi około 3,8 sekundy. Bez prowadzenia dwie godziny wymagają około 1 907 klatek. Z montażem śledzącym i czasem 120 sekund na klatkę wystarczy 60 plików; pięć sekund przerwy na klatkę dodaje tylko pięć minut do czasu w terenie.' },
26
+ { type: 'paragraph', html: 'Oddziel czas integracji od rzeczywistej długości sesji. Zapis na kartę, kontrola ostrości, dithering, wymiana akumulatora i odrzucone klatki należą do planu nocy, nawet jeśli nie zwiększają sygnału. Przy tysiącach krótkich klatek elektroniczna migawka może ograniczyć zużycie mechaniczne, ale trzeba sprawdzić bufor i wolne miejsce.' },
27
+ { type: 'tip', title: 'Sprawdź piksel i format sensora', html: 'APS C z pikselem 5,9 mikrometra to nietypowe połączenie w nowoczesnych aparatach o wysokiej rozdzielczości. Jeśli rzeczywisty piksel jest mniejszy, limit NPF będzie krótszy. Sprawdź dokładny model aparatu i wykonaj klatkę testową przed całą serią.' },
28
+ ],
29
+ faq: [
30
+ { question: 'Czy używać NPF czy reguły 500?', answer: 'Użyj NPF jako punktu wyjścia bliższego aparatowi, jeśli znasz przysłonę i rozmiar piksela. Reguła 500 jest szybkim porównaniem. Oba wyniki sprawdź w pełnej rozdzielczości.' },
31
+ { question: 'Co obejmuje liczba klatek?', answer: 'To liczba pełnych klatek światła potrzebnych do osiągnięcia lub lekkiego przekroczenia żądanej integracji. Darki, flaty, biasy, przerwy i odrzucone zdjęcia nie są wliczone.' },
32
+ { question: 'Czy tryb śledzenia oblicza dokładność guidingu?', answer: 'Nie. Używa wpisanej ekspozycji ze śledzeniem. Ustawienie, guiding i jasność nieba trzeba sprawdzić na prawdziwych klatkach testowych.' },
33
+ ],
34
+ howTo: [
35
+ { name: 'Wpisz geometrię aparatu', text: 'Wprowadź ogniskową, przysłonę, rozmiar piksela i deklinację celu.' },
36
+ { name: 'Wybierz tryb', text: 'Bez śledzenia wybierz NPF lub regułę 500, a ze śledzeniem ustaw ekspozycję na klatkę.' },
37
+ { name: 'Ustaw integrację', text: 'Wpisz użyteczny czas całkowity i sprawdź liczbę klatek oraz czas w terenie.' },
38
+ { name: 'Zweryfikuj w terenie', text: 'Zrób klatkę testową, sprawdź gwiazdy i histogram, a następnie dostosuj serię.' },
39
+ ],
40
+ });
@@ -0,0 +1,40 @@
1
+ import { createLocalizedContent } from '../localized';
2
+
3
+ export const content = createLocalizedContent({
4
+ slug: 'planeador-empilhamento-exposicoes-astrofotografia',
5
+ title: 'Planeador de empilhamento de exposições para astrofotografia',
6
+ description: 'Planeie sessões de astrofotografia com limites NPF e regra de 500, número de fotografias, integração total e tempo real no campo.',
7
+ ui: {
8
+ cameraLegend: 'Geometria da câmara', focalLabel: 'Distância focal', focalHelp: 'Distância focal da objetiva ou telescópio em mm', apertureLabel: 'Abertura', apertureHelp: 'Use o número f, por exemplo 2,8', pixelPitchLabel: 'Passo do pixel', pixelPitchHelp: 'Tamanho físico do fotosite em micrómetros', declinationLabel: 'Declinação do alvo', declinationHelp: 'Declinação absoluta em graus', sensorLabel: 'Formato do sensor', sensorOptions: { fullFrame: 'Full frame', apsC: 'APS C', microFourThirds: 'Micro Quatro Terços', phone: 'Sensor de telemóvel' },
9
+ ruleLabel: 'Limite de exposição', ruleNpf: 'Fórmula NPF', rule500: 'Regra de 500', trackingLabel: 'Estado da montagem', untracked: 'Sem seguimento', tracked: 'Montagem com seguimento', trackingExposureLabel: 'Exposição por fotografia com seguimento', trackingExposureHelp: 'Usada apenas com montagem com seguimento. Comece entre 30 e 120 s e verifique fotografias de teste.', deadTimeLabel: 'Tempo morto entre fotografias', deadTimeHelp: 'Comece com cerca de 2 s e ajuste ao buffer, gravação e intervalo da câmara.', totalIntegrationLabel: 'Integração total pretendida', totalIntegrationHelp: 'O tempo útil de exposição que pretende recolher', resultTitle: 'O seu plano de captura', resultKicker: 'Um ponto de partida para a noite', secondsUnit: 'por fotografia', framesLabel: 'fotografias', totalTimeLabel: 'Integração planeada', sessionTimeLabel: 'Estimativa de tempo no campo', gainLabel: 'Ganho ideal do empilhamento', sessionDetail: 'Inclui {dead} entre fotografias: {deadTotal} de tempo de intervalo.', workloadText: '{frames} ciclos do obturador. A estimativa no campo inclui o tempo morto entre fotografias.', highWorkloadText: '{frames} ciclos do obturador. Considere obturador eletrónico, baterias e armazenamento. Tempo estimado no campo: {session}.', sensorPixelWarning: 'Confirme as especificações: {pixel} é um passo de pixel grande para APS C e pode reduzir o limite NPF.', comparisonTitle: 'Dois limites, uma decisão', npfLabel: 'Limite NPF', rule500Label: 'Limite da regra de 500', deltaLabel: 'Diferença NPF', timelineTitle: 'O empilhamento como faixa de luz', timelineStart: 'primeira fotografia', timelineEnd: 'última fotografia', trackingNote: 'O seguimento está ativo. O plano usa {ceiling} por fotografia, com {frames} fotografias e cerca de {session} no campo. Valide esta duração com alinhamento, guiamento e uma fotografia de teste; NPF continua a ser a referência sem seguimento.', untrackedNote: 'Use {ceiling} como limite inicial e veja uma fotografia de teste em resolução total para confirmar a forma das estrelas e o brilho do céu.', methodTitle: 'Como a estimativa é construída', methodText: 'O caminho NPF usa abertura, distância focal, passo do pixel e declinação para estimar quando o movimento das estrelas se torna visível ao nível do pixel. A regra de 500 usa apenas distância focal e fator de corte do sensor. Ambas são heurísticas geométricas para uma câmara sem seguimento. Com uma montagem com seguimento, o plano usa a exposição introduzida e não certifica a montagem.', limitsTitle: 'Limite no campo', limitsText: 'Seguimento, céu brilhante, recorte de alta resolução, vento ou desvio de foco podem alterar a exposição prática. Faça uma fotografia de teste e observe os cantos, o histograma e o comportamento da montagem.', startingStatus: 'A verificar dados', formulaLabel: 'Fórmulas de referência', formulaNpf: 'NPF: (16,9 x abertura + 0,10 x distância focal + 13,7 x passo do pixel) / (distância focal x coseno da declinação).', formula500: 'Regra de 500: 500 / (distância focal x fator de corte do sensor).', presetsLabel: 'Configurações rápidas', presets: { milkyWay: '24 mm full frame', wideAngle: '14 mm grande angular', telephoto: '85 mm teleobjetiva' },
10
+ },
11
+ seo: [
12
+ { type: 'title', text: 'Porque é que um empilhamento precisa de um limite', level: 2 },
13
+ { type: 'paragraph', html: 'Um empilhamento reúne fotografias separadas que serão alinhadas e combinadas mais tarde. O objetivo é acumular sinal mantendo cada fotografia utilizável. Numa câmara fixa, uma exposição demasiado longa alonga as estrelas devido ao movimento aparente do céu. Fotografias demasiado curtas também tornam a sessão ineficiente por causa do ruído de leitura e das pausas de gravação.' },
14
+ { type: 'paragraph', html: 'Este planeador transforma essas decisões num plano concreto. Compara NPF com a regra de 500, divide a integração desejada em fotografias completas e acrescenta o tempo morto entre ficheiros ao tempo no campo. A última fotografia pode ultrapassar ligeiramente o objetivo porque não é possível fazer uma fração de fotografia.' },
15
+ { type: 'list', items: ['Use NPF quando conhecer a abertura e o passo do pixel.', 'Use a regra de 500 como comparação rápida com o corte do sensor.', 'Leia o número de fotografias como carga real de armazenamento e seleção.', 'Faça uma fotografia de teste antes de iniciar a sequência completa.'] },
16
+ { type: 'tip', title: 'Um limite não é uma promessa', html: 'Verifique estrelas brilhantes e cantos em resolução total. Vento, coma, alteração de foco e vibração podem ser mais importantes do que a fórmula.' },
17
+ { type: 'title', text: 'NPF e regra de 500 respondem a perguntas diferentes', level: 2 },
18
+ { type: 'paragraph', html: 'A regra de 500 é rápida e considera o fator de corte do sensor, mas não usa passo do pixel, abertura ou declinação. NPF acrescenta essas variáveis e aproxima-se melhor de uma câmara e objetiva específicas, embora continue a ser uma heurística para uma câmara sem seguimento.' },
19
+ { type: 'title', text: 'Como transformar o resultado numa sessão noturna', level: 2 },
20
+ { type: 'paragraph', html: 'Introduza os valores reais do equipamento que vai usar. Não introduza a distância focal equivalente se a distância focal real e o formato do sensor já foram separados. Para o passo do pixel, use a especificação exata do modelo.' },
21
+ { type: 'list', items: ['Veja os cantos de uma fotografia de teste a cem por cento.', 'Verifique o histograma e as altas luzes cortadas.', 'Mantenha foco e definições constantes.', 'Reserve tempo para dark frames e calibração.'] },
22
+ { type: 'title', text: 'O que muda com uma montagem com seguimento', level: 2 },
23
+ { type: 'paragraph', html: 'Com o seguimento ativo, a ferramenta usa a exposição por fotografia que introduzir. NPF e a regra de 500 continuam visíveis como referências sem seguimento, mas deixam de determinar o número de ficheiros. Alinhamento polar, erro periódico, guiamento, vento, brilho do céu e saturação podem tornar-se o novo limite.' },
24
+ { type: 'tip', title: 'Primeiro teste, depois a sequência completa', html: 'Faça uma série curta, amplie os cantos e confirme as estrelas. Ajuste a exposição com seguimento antes de reservar duas horas de céu escuro.' },
25
+ { type: 'paragraph', html: 'Um exemplo mostra a diferença: com 35 mm, APS C, 5,9 micrómetros e declinação de 5 graus, o limite NPF fica perto de 3,8 segundos. Sem acompanhamento, duas horas exigem cerca de 1.907 fotografias. Com uma montagem acompanhada e 120 segundos por fotografia, bastam 60 ficheiros; cinco segundos de intervalo por fotografia acrescentam apenas cinco minutos ao tempo no campo.' },
26
+ { type: 'paragraph', html: 'Separe o tempo de integração da duração real da sessão. Pausas de gravação, verificação do foco, dithering, troca de baterias e fotografias rejeitadas devem entrar no plano da noite, mesmo sem acrescentarem sinal. Com muitas exposições curtas, o obturador eletrónico pode reduzir o desgaste mecânico, mas é necessário verificar a memória intermédia e o armazenamento.' },
27
+ { type: 'tip', title: 'Confirme o pixel e o sensor', html: 'APS C com 5,9 micrómetros é uma combinação pouco comum em câmaras modernas de alta resolução. Se o pixel real for menor, o limite NPF será mais curto. Confirme o modelo exato da câmara e faça uma fotografia de teste antes de iniciar toda a sequência.' },
28
+ ],
29
+ faq: [
30
+ { question: 'Devo usar NPF ou a regra de 500?', answer: 'Use NPF como ponto de partida mais próximo da câmara quando conhecer abertura e passo do pixel. Use a regra de 500 para uma comparação rápida e teste o resultado em resolução total.' },
31
+ { question: 'O que inclui o número de fotografias?', answer: 'Conta fotografias de luz completas necessárias para atingir ou ultrapassar ligeiramente a integração desejada. Dark frames, flats, bias, pausas e fotografias rejeitadas não estão incluídos.' },
32
+ { question: 'O modo de seguimento calcula a precisão do guiamento?', answer: 'Não. Usa a exposição com seguimento introduzida. Alinhamento, guiamento e brilho do céu devem ser verificados com fotografias de teste.' },
33
+ ],
34
+ howTo: [
35
+ { name: 'Introduza a geometria', text: 'Escreva distância focal, abertura, passo do pixel e declinação do alvo.' },
36
+ { name: 'Escolha o modo', text: 'Selecione NPF ou regra de 500 sem seguimento, ou ative o seguimento e defina a exposição por fotografia.' },
37
+ { name: 'Defina a integração', text: 'Introduza o tempo útil total e consulte fotografias e duração no campo.' },
38
+ { name: 'Valide no campo', text: 'Faça uma fotografia de teste, verifique estrelas e histograma e ajuste a sequência.' },
39
+ ],
40
+ });
@@ -0,0 +1,40 @@
1
+ import { createLocalizedContent } from '../localized';
2
+
3
+ export const content = createLocalizedContent({
4
+ slug: 'planirovshchik-steka-ekspozitsiy-astrofotografii',
5
+ title: 'Планировщик стека экспозиций для астрофотографии',
6
+ description: 'Планируйте астрофотосъёмку с формулой NPF и правилом 500, числом кадров, общей интеграцией и реальным временем на площадке.',
7
+ ui: {
8
+ cameraLegend: 'Геометрия камеры', focalLabel: 'Фокусное расстояние', focalHelp: 'Фокусное расстояние объектива или телескопа в мм', apertureLabel: 'Диафрагма', apertureHelp: 'Введите число f, например 2,8', pixelPitchLabel: 'Размер пикселя', pixelPitchHelp: 'Физический размер фотосайта в микрометрах', declinationLabel: 'Склонение цели', declinationHelp: 'Абсолютное склонение в градусах', sensorLabel: 'Формат сенсора', sensorOptions: { fullFrame: 'Полный кадр', apsC: 'APS C', microFourThirds: 'Micro Four Thirds', phone: 'Сенсор телефона' },
9
+ ruleLabel: 'Предел экспозиции', ruleNpf: 'Формула NPF', rule500: 'Правило 500', trackingLabel: 'Состояние монтировки', untracked: 'Без ведения', tracked: 'Монтировка с ведением', trackingExposureLabel: 'Экспозиция одного кадра с ведением', trackingExposureHelp: 'Используется только с монтировкой с ведением. Начните с 30-120 с и проверьте тестовые кадры.', deadTimeLabel: 'Пауза между кадрами', deadTimeHelp: 'Начните примерно с 2 с и учтите буфер, запись карты и интервал камеры.', totalIntegrationLabel: 'Желаемая общая интеграция', totalIntegrationHelp: 'Полезное время экспозиции, которое вы хотите собрать', resultTitle: 'Ваш план съёмки', resultKicker: 'Отправная точка для ночи', secondsUnit: 'на кадр', framesLabel: 'кадров', totalTimeLabel: 'Плановая интеграция', sessionTimeLabel: 'Оценка времени на площадке', gainLabel: 'Идеальный выигрыш от стека', sessionDetail: 'Между кадрами учитывается {dead}: время пауз {deadTotal}.', workloadText: '{frames} срабатываний затвора. В оценку времени входят паузы между кадрами.', highWorkloadText: '{frames} срабатываний затвора. Подумайте об электронном затворе, батареях и памяти. Оценка времени на площадке: {session}.', sensorPixelWarning: 'Проверьте характеристики камеры: {pixel} это крупный пиксель для APS C, поэтому предел NPF может оказаться короче.', comparisonTitle: 'Два предела, один выбор', npfLabel: 'Предел NPF', rule500Label: 'Предел правила 500', deltaLabel: 'Разница NPF', timelineTitle: 'Стек как полоса света', timelineStart: 'первый кадр', timelineEnd: 'последний кадр', trackingNote: 'Ведение включено. План использует {ceiling} на кадр: нужно {frames} кадров и около {session} на площадке. Проверьте эту длительность полярной настройкой, гидированием и тестовым кадром; NPF остаётся сравнительной базой без ведения.', untrackedNote: 'Используйте {ceiling} как начальный предел и проверьте тестовый кадр в полном разрешении: форму звёзд и яркость неба.', methodTitle: 'Как построена оценка', methodText: 'Путь NPF использует диафрагму, фокусное расстояние, размер пикселя и склонение цели, чтобы оценить видимое движение звёзд на уровне пикселя. Правило 500 использует только фокусное расстояние и кроп-фактор сенсора. Оба метода являются геометрическими эвристиками для камеры без ведения. При выборе монтировки с ведением план использует введённую экспозицию и не сертифицирует монтировку.', limitsTitle: 'Предел на площадке', limitsText: 'Ведение, светлое небо, кадрирование с высоким разрешением, ветер или уход фокуса могут изменить практическую экспозицию. Сделайте тестовый кадр и проверьте углы, гистограмму и работу монтировки.', startingStatus: 'Проверка данных', formulaLabel: 'Справочные формулы', formulaNpf: 'NPF: (16,9 x диафрагма + 0,10 x фокусное расстояние + 13,7 x размер пикселя) / (фокусное расстояние x косинус склонения).', formula500: 'Правило 500: 500 / (фокусное расстояние x кроп-фактор сенсора).', presetsLabel: 'Быстрые настройки', presets: { milkyWay: '24 мм полный кадр', wideAngle: '14 мм широкий угол', telephoto: '85 мм телеобъектив' },
10
+ },
11
+ seo: [
12
+ { type: 'title', text: 'Почему стек экспозиций требует предела', level: 2 },
13
+ { type: 'paragraph', html: 'Стек экспозиций состоит из отдельных кадров, которые позже выравниваются и объединяются. Цель состоит в накоплении сигнала при сохранении пригодности каждого кадра. На неподвижной камере слишком длинная экспозиция растягивает звёзды из-за видимого движения неба. Слишком короткие кадры делают сессию неэффективной из-за шума считывания и пауз записи.' },
14
+ { type: 'paragraph', html: 'Этот планировщик превращает два решения в конкретный план съёмки. Он сравнивает пределы NPF и правила 500, делит нужную интеграцию на полные кадры и добавляет паузы между файлами к времени на площадке. Последний кадр может немного превысить цель, поскольку дробный кадр невозможен.' },
15
+ { type: 'list', items: ['Используйте NPF, если известны диафрагма и размер пикселя.', 'Используйте правило 500 для быстрого сравнения с кропом сенсора.', 'Считайте число кадров реальной нагрузкой на память и отбор.', 'Сделайте тестовый кадр до запуска всей серии.'] },
16
+ { type: 'tip', title: 'Предел не является гарантией', html: 'Проверьте яркие звёзды и углы в полном разрешении. Ветер, кома, уход фокуса и вибрации могут оказаться важнее формулы.' },
17
+ { type: 'title', text: 'NPF и правило 500 отвечают на разные вопросы', level: 2 },
18
+ { type: 'paragraph', html: 'Правило 500 быстро учитывает кроп-фактор сенсора, но не использует размер пикселя, диафрагму или склонение. NPF добавляет эти параметры и лучше подходит к конкретной камере и объективу, однако остаётся эвристикой для камеры без ведения.' },
19
+ { type: 'title', text: 'Как превратить результат в ночную сессию', level: 2 },
20
+ { type: 'paragraph', html: 'Введите реальные параметры оборудования. Не вводите эквивалентное фокусное расстояние, если настоящее фокусное расстояние и формат сенсора уже указаны отдельно. Размер пикселя берите из точной спецификации модели камеры.' },
21
+ { type: 'list', items: ['Проверьте углы тестового кадра в полном разрешении.', 'Проверьте гистограмму и выбитые света.', 'Сохраняйте фокус и настройки постоянными.', 'Оставьте время на тёмные кадры и калибровку.'] },
22
+ { type: 'title', text: 'Что меняется при ведении монтировки', level: 2 },
23
+ { type: 'paragraph', html: 'При включённом ведении инструмент использует введённую экспозицию одного кадра. NPF и правило 500 остаются видимыми как сравнение без ведения, но больше не определяют число файлов. Полярная настройка, периодическая ошибка, гидирование, ветер, яркость неба и насыщение могут стать новым пределом.' },
24
+ { type: 'tip', title: 'Сначала проверка, потом весь стек', html: 'Сделайте короткую тестовую серию, увеличьте углы и проверьте звёзды. Настройте экспозицию с ведением до двух часов съёмки тёмного неба.' },
25
+ { type: 'paragraph', html: 'Пример показывает разницу: при фокусном расстоянии 35 мм, сенсоре APS C, размере пикселя 5,9 микрометра и склонении 5 градусов предел NPF составляет около 3,8 секунды. Без ведения два часа потребуют примерно 1907 кадров. На монтировке с ведением и выдержкой 120 секунд достаточно 60 кадров; пауза пять секунд между кадрами добавит только пять минут полевого времени.' },
26
+ { type: 'paragraph', html: 'Отделяйте полезное интеграционное время от реальной длительности сессии. Запись на карту, проверка фокуса, дизеринг, замена аккумулятора и отбракованные кадры нужно учитывать в плане ночи, даже если они не увеличивают сигнал. При большом числе коротких кадров электронный затвор уменьшит механический износ, но буфер и свободное место всё равно следует проверить.' },
27
+ { type: 'tip', title: 'Проверьте размер пикселя и сенсор', html: 'Связка APS C и 5,9 микрометра необычна для современных камер с высоким разрешением. Если настоящий пиксель меньше, предел NPF будет короче. Проверьте точную модель камеры и сделайте тестовый кадр до запуска всей серии.' },
28
+ ],
29
+ faq: [
30
+ { question: 'Что выбрать: NPF или правило 500?', answer: 'Используйте NPF как более близкую к камере отправную точку, если известны диафрагма и размер пикселя. Правило 500 подходит для быстрого сравнения. Оба результата проверьте тестовым кадром.' },
31
+ { question: 'Что входит в число кадров?', answer: 'Это число полных световых кадров для достижения или небольшого превышения желаемой интеграции. Тёмные кадры, флэты, bias, паузы и брак не учитываются.' },
32
+ { question: 'Рассчитывает ли режим ведения точность гидирования?', answer: 'Нет. Он использует введённую экспозицию с ведением. Настройку, гидирование и яркость неба нужно проверить реальными тестовыми кадрами.' },
33
+ ],
34
+ howTo: [
35
+ { name: 'Введите геометрию камеры', text: 'Введите фокусное расстояние, диафрагму, размер пикселя и склонение цели.' },
36
+ { name: 'Выберите режим', text: 'Без ведения выберите NPF или правило 500, а с ведением задайте экспозицию одного кадра.' },
37
+ { name: 'Задайте интеграцию', text: 'Введите полезное общее время и проверьте число кадров и время на площадке.' },
38
+ { name: 'Проверьте на площадке', text: 'Сделайте тестовый кадр, проверьте звёзды и гистограмму и измените серию при необходимости.' },
39
+ ],
40
+ });
@@ -0,0 +1,40 @@
1
+ import { createLocalizedContent } from '../localized';
2
+
3
+ export const content = createLocalizedContent({
4
+ slug: 'planerare-astrofotografi-exponeringsstack',
5
+ title: 'Planerare för exponeringsstapling inom astrofotografi',
6
+ description: 'Planera astrofotografiska sessioner med NPF och 500 regeln, antal bilder, total integration och verklig tid i fält.',
7
+ ui: {
8
+ cameraLegend: 'Kamerageometri', focalLabel: 'Brännvidd', focalHelp: 'Brännvidd för objektiv eller teleskop i mm', apertureLabel: 'Bländare', apertureHelp: 'Använd f talet, till exempel 2,8', pixelPitchLabel: 'Pixelstorlek', pixelPitchHelp: 'Fotositens fysiska storlek i mikrometer', declinationLabel: 'Målets deklination', declinationHelp: 'Absolut deklination i grader', sensorLabel: 'Sensorformat', sensorOptions: { fullFrame: 'Fullformat', apsC: 'APS C', microFourThirds: 'Micro Four Thirds', phone: 'Telefonsensor' },
9
+ ruleLabel: 'Exponeringsgräns', ruleNpf: 'NPF formel', rule500: '500 regeln', trackingLabel: 'Monteringsläge', untracked: 'Utan följning', tracked: 'Följande montering', trackingExposureLabel: 'Exponering per följande bild', trackingExposureHelp: 'Används bara med följande montering. Börja med 30 till 120 s och kontrollera testbilder.', deadTimeLabel: 'Dödtid mellan bilder', deadTimeHelp: 'Börja med ungefär 2 s och anpassa efter buffert, kortskrivning och intervall.', totalIntegrationLabel: 'Önskad total integration', totalIntegrationHelp: 'Den användbara exponeringstid du vill samla in', resultTitle: 'Din fotograferingsplan', resultKicker: 'En startpunkt för natten', secondsUnit: 'per bild', framesLabel: 'bilder', totalTimeLabel: 'Planerad integration', sessionTimeLabel: 'Beräknad tid i fält', gainLabel: 'Idealisk stackingvinst', sessionDetail: 'Inkluderar {dead} mellan bilder: {deadTotal} intervalltid.', workloadText: '{frames} slutarcykler. Fälttiden inkluderar dödtiden mellan bilder.', highWorkloadText: '{frames} slutarcykler. Överväg elektronisk slutare, extra batterier och lagring. Beräknad fälttid: {session}.', sensorPixelWarning: 'Kontrollera kamerans specifikation: {pixel} är en stor pixelstorlek för APS C och kan göra NPF gränsen kortare.', comparisonTitle: 'Två gränser, ett val', npfLabel: 'NPF gräns', rule500Label: '500 regelns gräns', deltaLabel: 'NPF skillnad', timelineTitle: 'Stacken som ett ljusband', timelineStart: 'första bilden', timelineEnd: 'sista bilden', trackingNote: 'Följning är aktiv. Planen använder {ceiling} per bild, alltså {frames} bilder och ungefär {session} i fält. Kontrollera tiden med polinställning, guidning och en testbild; NPF är fortfarande jämförelsen utan följning.', untrackedNote: 'Använd {ceiling} som startgräns och granska en testbild i full upplösning för stjärnform och himmelsljus.', methodTitle: 'Så byggs uppskattningen', methodText: 'NPF vägen använder bländare, brännvidd, pixelstorlek och deklination för att uppskatta när stjärnrörelse syns på pixelnivå. 500 regeln använder bara brännvidd och sensorns cropfaktor. Båda är geometriska tumregler för en kamera utan följning. Med följande montering använder planen den angivna exponeringen och intygar inte monteringens kapacitet.', limitsTitle: 'Gräns i fält', limitsText: 'Följning, ljus himmel, högupplöst beskärning, vind eller fokusdrift kan ändra den praktiska exponeringen. Ta en testbild och kontrollera hörn, histogram och montering.', startingStatus: 'Kontrollerar indata', formulaLabel: 'Referensformler', formulaNpf: 'NPF: (16,9 x bländare + 0,10 x brännvidd + 13,7 x pixelstorlek) / (brännvidd x cosinus för deklination).', formula500: '500 regeln: 500 / (brännvidd x sensorns cropfaktor).', presetsLabel: 'Snabba inställningar', presets: { milkyWay: '24 mm fullformat', wideAngle: '14 mm vidvinkel', telephoto: '85 mm teleobjektiv' },
10
+ },
11
+ seo: [
12
+ { type: 'title', text: 'Varför en exponeringsstack behöver en gräns', level: 2 },
13
+ { type: 'paragraph', html: 'En exponeringsstack består av separata bilder som senare riktas in och kombineras. Målet är att samla mer signal och samtidigt behålla användbara bilder. Med en fast kamera gör en för lång exponering stjärnorna utdragna när himlen rör sig till synes. För korta bilder gör sessionen ineffektiv genom läsbrus och skrivpauser.' },
14
+ { type: 'paragraph', html: 'Den här planeraren gör valen till en konkret fotograferingsplan. Den jämför NPF med 500 regeln, delar den önskade integrationen i hela bilder och lägger till pausen mellan filer i fälttiden. Den sista bilden kan gå något över målet eftersom en kamera inte kan ta en del av en bild.' },
15
+ { type: 'list', items: ['Använd NPF när bländare och pixelstorlek är kända.', 'Använd 500 regeln som snabb jämförelse med sensorbeskärning.', 'Se bildantalet som verklig belastning på lagring och urval.', 'Ta en testbild innan hela stacken startas.'] },
16
+ { type: 'tip', title: 'En gräns är ingen garanti', html: 'Kontrollera ljusa stjärnor och hörn i full upplösning. Vind, koma, fokusdrift och vibrationer kan vara viktigare än formeln.' },
17
+ { type: 'title', text: 'NPF och 500 regeln svarar på olika frågor', level: 2 },
18
+ { type: 'paragraph', html: '500 regeln är snabb och tar hänsyn till sensorns cropfaktor, men inte pixelstorlek, bländare eller deklination. NPF lägger till dessa variabler och passar bättre för en viss kamera och ett visst objektiv, men är fortfarande en tumregel för en kamera utan följning.' },
19
+ { type: 'title', text: 'Så blir resultatet en nattsession', level: 2 },
20
+ { type: 'paragraph', html: 'Skriv in de verkliga värdena för utrustningen du använder. Ange inte motsvarande brännvidd om verklig brännvidd och sensorformat redan är separerade. Använd rätt modelluppgift för pixelstorleken.' },
21
+ { type: 'list', items: ['Granska hörnen i en testbild vid full upplösning.', 'Kontrollera histogram och utfrätta högdagrar.', 'Håll fokus och inställningar konstanta.', 'Planera tid för dark frames och kalibrering.'] },
22
+ { type: 'title', text: 'Vad som ändras med en följande montering', level: 2 },
23
+ { type: 'paragraph', html: 'När följning är vald använder verktyget den angivna exponeringen per bild. NPF och 500 regeln visas som jämförelse utan följning, men bestämmer inte längre antalet filer. Polinställning, periodiskt fel, guidning, vind, himmelsljus och mättnad kan bli den nya gränsen.' },
24
+ { type: 'tip', title: 'Testa först, ta sedan hela stacken', html: 'Ta en kort testserie, förstora hörnen och kontrollera stjärnorna. Justera följande exponering innan du använder två timmar mörk himmel.' },
25
+ { type: 'paragraph', html: 'Ett exempel visar skillnaden: vid 35 mm, APS C, 5,9 mikrometer och 5 graders deklination ligger NPF gränsen nära 3,8 sekunder. Utan följning krävs ungefär 1 907 bilder för två timmar. Med en följande montering och 120 sekunder per bild räcker 60 bilder; fem sekunders paus per bild lägger bara till fem minuter i fältet.' },
26
+ { type: 'paragraph', html: 'Håll integrationstiden åtskild från den verkliga sessionstiden. Skrivpauser, fokuskontroll, dithering, batteribyten och bortsorterade bilder hör till nattens plan även om de inte ökar signalen. Vid många korta exponeringar kan elektronisk slutare minska mekaniskt slitage, men buffert och lagringsutrymme måste fortfarande kontrolleras.' },
27
+ { type: 'tip', title: 'Kontrollera pixel och sensor', html: 'APS C med 5,9 mikrometer är en ovanlig kombination i moderna kameror med hög upplösning. Om den verkliga pixeln är mindre blir NPF gränsen kortare. Kontrollera exakt kameramodell och ta en testbild innan hela serien startas.' },
28
+ ],
29
+ faq: [
30
+ { question: 'Ska jag använda NPF eller 500 regeln?', answer: 'Använd NPF som kameranär startpunkt när bländare och pixelstorlek är kända. Använd 500 regeln för en snabb jämförelse och testa resultatet i full upplösning.' },
31
+ { question: 'Vad ingår i bildantalet?', answer: 'Det räknar hela ljusbilder som behövs för att nå eller lite överskrida önskad integration. Dark, flats, bias, pauser och kasserade bilder ingår inte.' },
32
+ { question: 'Beräknar följningsläget guidningens precision?', answer: 'Nej. Det använder den angivna följande exponeringen. Inställning, guidning och himmelsljus måste kontrolleras med testbilder.' },
33
+ ],
34
+ howTo: [
35
+ { name: 'Skriv in kamerageometri', text: 'Ange brännvidd, bländare, pixelstorlek och målets deklination.' },
36
+ { name: 'Välj läge', text: 'Välj NPF eller 500 regeln utan följning, eller aktivera följning och ange exponeringen per bild.' },
37
+ { name: 'Ange integration', text: 'Skriv in den användbara totaltiden och läs av bilder och fälttid.' },
38
+ { name: 'Validera i fält', text: 'Ta en testbild, kontrollera stjärnor och histogram och ändra serien.' },
39
+ ],
40
+ });
@@ -0,0 +1,40 @@
1
+ import { createLocalizedContent } from '../localized';
2
+
3
+ export const content = createLocalizedContent({
4
+ slug: 'astrofotografi-pozlama-yigin-planlayici',
5
+ title: 'Astrofotoğraf Pozlama Yığını Planlayıcısı',
6
+ description: 'NPF ve 500 kuralı, kare sayısı, toplam entegrasyon ve sahadaki gerçek süreyle astrofotoğraf çekimini planlayın.',
7
+ ui: {
8
+ cameraLegend: 'Kamera geometrisi', focalLabel: 'Odak uzaklığı', focalHelp: 'Lens veya teleskobun mm cinsinden odak uzaklığı', apertureLabel: 'Diyafram', apertureHelp: '2,8 gibi f sayısını kullanın', pixelPitchLabel: 'Piksel aralığı', pixelPitchHelp: 'Fotositin mikrometre cinsinden fiziksel boyutu', declinationLabel: 'Hedef deklinasyonu', declinationHelp: 'Mutlak deklinasyonu derece olarak girin', sensorLabel: 'Sensör biçimi', sensorOptions: { fullFrame: 'Tam kare', apsC: 'APS C', microFourThirds: 'Micro Four Thirds', phone: 'Telefon sensörü' },
9
+ ruleLabel: 'Pozlama sınırı', ruleNpf: 'NPF formülü', rule500: '500 kuralı', trackingLabel: 'Montaj durumu', untracked: 'Takipsiz', tracked: 'Takipli montaj', trackingExposureLabel: 'Takipli kare pozlaması', trackingExposureHelp: 'Yalnızca takipli montaj ile kullanılır. 30 ile 120 saniye arasında başlayın ve test kareleriyle doğrulayın.', deadTimeLabel: 'Kareler arasındaki ölü süre', deadTimeHelp: 'Yaklaşık 2 saniye ile başlayın, sonra tampon, kart yazımı ve aralığa göre ayarlayın.', totalIntegrationLabel: 'İstenen toplam entegrasyon', totalIntegrationHelp: 'Toplamak istediğiniz faydalı pozlama süresi', resultTitle: 'Çekim planınız', resultKicker: 'Gece için bir başlangıç noktası', secondsUnit: 'kare başına', framesLabel: 'kare', totalTimeLabel: 'Planlanan entegrasyon', sessionTimeLabel: 'Sahada tahmini süre', gainLabel: 'İdeal yığın kazancı', sessionDetail: 'Kareler arasında {dead} içerir: aralık süresi {deadTotal}.', workloadText: '{frames} deklanşör çevrimi. Saha tahmini kareler arasındaki ölü süreyi içerir.', highWorkloadText: '{frames} deklanşör çevrimi. Elektronik deklanşör, ek pil ve depolama düşünün. Tahmini saha süresi: {session}.', sensorPixelWarning: 'Kamera özelliklerini kontrol edin: {pixel}, APS C için büyük bir piksel aralığıdır ve NPF sınırını kısaltabilir.', comparisonTitle: 'İki sınır, tek karar', npfLabel: 'NPF sınırı', rule500Label: '500 kuralı sınırı', deltaLabel: 'NPF farkı', timelineTitle: 'Işık şeridi olarak yığın', timelineStart: 'ilk kare', timelineEnd: 'son kare', trackingNote: 'Takip etkin. Plan kare başına {ceiling} kullanıyor; {frames} kare ve sahada yaklaşık {session} gerekiyor. Bu süreyi kutup hizası, guiding ve test karesiyle doğrulayın; NPF takipsiz karşılaştırma olarak kalır.', untrackedNote: 'Başlangıç sınırı olarak {ceiling} kullanın ve yıldız şekli ile gökyüzü parlaklığı için tam çözünürlükte test karesini inceleyin.', methodTitle: 'Tahmin nasıl oluşturulur', methodText: 'NPF yolu, yıldız hareketinin piksel düzeyinde görünür hale geldiği zamanı tahmin etmek için diyafram, odak uzaklığı, piksel aralığı ve hedef deklinasyonunu kullanır. 500 kuralı yalnızca odak uzaklığı ve sensör kırpma katsayısını kullanır. İkisi de takipsiz kamera için geometrik sezgisel yöntemlerdir. Takipli montaj seçildiğinde plan girdiğiniz süreyi kullanır ve montajı onaylamaz.', limitsTitle: 'Sahadaki sınır', limitsText: 'Takip, parlak gökyüzü, yüksek çözünürlüklü kırpma, rüzgâr veya odak kayması pratik pozlamayı değiştirebilir. Test karesi çekin ve köşeleri, histogramı ve montaj davranışını kontrol edin.', startingStatus: 'Girdiler kontrol ediliyor', formulaLabel: 'Referans formüller', formulaNpf: 'NPF: (16,9 x diyafram + 0,10 x odak uzaklığı + 13,7 x piksel aralığı) / (odak uzaklığı x deklinasyon kosinüsü).', formula500: '500 kuralı: 500 / (odak uzaklığı x sensör kırpma katsayısı).', presetsLabel: 'Hızlı ayarlar', presets: { milkyWay: '24 mm tam kare', wideAngle: '14 mm geniş açı', telephoto: '85 mm telefoto' },
10
+ },
11
+ seo: [
12
+ { type: 'title', text: 'Pozlama yığınının neden bir sınıra ihtiyacı var', level: 2 },
13
+ { type: 'paragraph', html: 'Pozlama yığını daha sonra hizalanıp birleştirilen ayrı karelerden oluşur. Amaç, her kareyi kullanılabilir tutarken daha fazla sinyal toplamaktır. Sabit bir kamerada çok uzun pozlama, gökyüzünün görünür hareketi nedeniyle yıldızları uzatır. Çok kısa kareler ise okuma gürültüsü ve kayıt araları nedeniyle oturumu verimsizleştirir.' },
14
+ { type: 'paragraph', html: 'Bu planlayıcı kararları somut bir çekim planına dönüştürür. NPF ile 500 kuralını karşılaştırır, istenen entegrasyonu tam karelere böler ve dosyalar arasındaki ölü süreyi saha süresine ekler. Kamera kare parçası çekemediği için son kare hedefi biraz aşabilir.' },
15
+ { type: 'list', items: ['Diyaframı ve piksel aralığını biliyorsanız NPF kullanın.', 'Sensör kırpmasını içeren hızlı karşılaştırma için 500 kuralını kullanın.', 'Kare sayısını depolama ve eleme için gerçek bir yük olarak görün.', 'Tam yığından önce bir test karesi çekin.'] },
16
+ { type: 'tip', title: 'Sınır garanti değildir', html: 'Parlak yıldızları ve köşeleri tam çözünürlükte kontrol edin. Rüzgâr, koma, odak kayması ve titreşim formülden daha önemli olabilir.' },
17
+ { type: 'title', text: 'NPF ve 500 kuralı farklı soruları yanıtlar', level: 2 },
18
+ { type: 'paragraph', html: '500 kuralı hızlıdır ve sensör kırpma katsayısını dikkate alır, ancak piksel aralığını, diyaframı veya deklinasyonu kullanmaz. NPF bu değişkenleri ekler ve belirli bir kamera ile lense daha iyi uyar, fakat takipsiz kamera için yine de bir sezgisel yöntemdir.' },
19
+ { type: 'title', text: 'Sonucu gece oturumuna dönüştürme', level: 2 },
20
+ { type: 'paragraph', html: 'Sahada kullanacağınız ekipmanın gerçek değerlerini girin. Gerçek odak uzaklığı ve sensör biçimi ayrı girilmişse eşdeğer odak uzaklığını tekrar kullanmayın. Piksel aralığı için kamera modelinin doğru teknik bilgisini kullanın.' },
21
+ { type: 'list', items: ['Test karesinin köşelerini tam çözünürlükte inceleyin.', 'Histogramı ve kırpılmış parlak alanları kontrol edin.', 'Odak ve ayarları sabit tutun.', 'Karanlık kareler ve kalibrasyon için zaman ayırın.'] },
22
+ { type: 'title', text: 'Montaj takip ettiğinde ne değişir', level: 2 },
23
+ { type: 'paragraph', html: 'Takip seçildiğinde araç kare başına girdiğiniz takipli pozlamayı kullanır. NPF ve 500 kuralı takipsiz karşılaştırma olarak görünür, ancak kare sayısını belirlemez. Kutup hizası, periyodik hata, guiding, rüzgâr, gökyüzü parlaklığı ve doygunluk yeni sınır olabilir.' },
24
+ { type: 'tip', title: 'Önce test, sonra tam yığın', html: 'Kısa bir test serisi çekin, köşeleri büyütün ve yıldızları kontrol edin. İki saatlik karanlık gökyüzüne başlamadan önce takipli pozlamayı ayarlayın.' },
25
+ { type: 'paragraph', html: 'Bir örnek farkı gösterir: 35 mm, APS C, 5,9 mikrometre ve 5 derece deklinasyonda NPF sınırı yaklaşık 3,8 saniyedir. Takipsiz iki saat için yaklaşık 1.907 kare gerekir. Takipli montajda kare başına 120 saniye kullanılırsa 60 kare yeterlidir; kare başına beş saniyelik bekleme saha süresine yalnızca beş dakika ekler.' },
26
+ { type: 'paragraph', html: 'Entegrasyon süresini gerçek oturum süresinden ayrı değerlendirin. Karta yazma, odak kontrolü, dithering, pil değişimi ve reddedilen kareler sinyale katkı sağlamasa da gece planına dahildir. Çok sayıda kısa karede elektronik deklanşör mekanik yıpranmayı azaltabilir, ancak tampon ve depolama kapasitesi yine de kontrol edilmelidir.' },
27
+ { type: 'tip', title: 'Piksel aralığını ve sensörü kontrol edin', html: 'APS C ile 5,9 mikrometre, yüksek çözünürlüklü modern makinelerde alışılmadık bir birleşimdir. Gerçek piksel daha küçükse NPF sınırı kısalır. Kesin kamera modelini doğrulayın ve tüm seriden önce bir test karesi çekin.' },
28
+ ],
29
+ faq: [
30
+ { question: 'NPF mi yoksa 500 kuralı mı kullanılmalı?', answer: 'Diyaframı ve piksel aralığını biliyorsanız kameraya daha yakın başlangıç için NPF kullanın. 500 kuralı hızlı karşılaştırmadır; sonucu tam çözünürlükte test edin.' },
31
+ { question: 'Kare sayısı neyi içerir?', answer: 'İstenen entegrasyona ulaşmak veya biraz aşmak için gereken tam ışık karelerini sayar. Karanlık, düz, bias, aralık ve reddedilen kareler dahil değildir.' },
32
+ { question: 'Takip modu guiding doğruluğunu hesaplar mı?', answer: 'Hayır. Girdiğiniz takipli pozlama süresini kullanır. Hizalama, guiding ve gökyüzü parlaklığı gerçek test kareleriyle kontrol edilmelidir.' },
33
+ ],
34
+ howTo: [
35
+ { name: 'Kamera geometrisini girin', text: 'Odak uzaklığı, diyafram, piksel aralığı ve hedef deklinasyonunu girin.' },
36
+ { name: 'Modu seçin', text: 'Takipsiz NPF veya 500 kuralını seçin, ya da takibi etkinleştirip kare süresini belirleyin.' },
37
+ { name: 'Entegrasyonu ayarlayın', text: 'Faydalı toplam süreyi girin ve kare sayısı ile saha süresini okuyun.' },
38
+ { name: 'Sahada doğrulayın', text: 'Test karesi çekin, yıldızları ve histogramı kontrol edin, sonra seriyi ayarlayın.' },
39
+ ],
40
+ });
@@ -0,0 +1,40 @@
1
+ import { createLocalizedContent } from '../localized';
2
+
3
+ export const content = createLocalizedContent({
4
+ slug: 'astrophotography-exposure-stacking-planner',
5
+ title: '天文摄影曝光堆栈规划器',
6
+ description: '使用 NPF 公式、500 法则、帧数、总积分时间和现场实际时长规划天文摄影拍摄。',
7
+ ui: {
8
+ cameraLegend: '相机几何参数', focalLabel: '焦距', focalHelp: '镜头或望远镜的焦距,单位为 mm', apertureLabel: '光圈', apertureHelp: '输入 2.8 这样的 F 值', pixelPitchLabel: '像素间距', pixelPitchHelp: '光电感光元件的物理尺寸,单位为微米', declinationLabel: '目标赤纬', declinationHelp: '输入赤纬绝对值,单位为度', sensorLabel: '传感器格式', sensorOptions: { fullFrame: '全画幅', apsC: 'APS C', microFourThirds: 'Micro Four Thirds', phone: '手机传感器' },
9
+ ruleLabel: '曝光上限', ruleNpf: 'NPF 公式', rule500: '500 法则', trackingLabel: '赤道仪状态', untracked: '不跟踪', tracked: '跟踪赤道仪', trackingExposureLabel: '跟踪时每帧曝光', trackingExposureHelp: '仅在跟踪赤道仪模式下使用。建议从 30 到 120 秒开始,并用测试帧确认。', deadTimeLabel: '帧间空闲时间', deadTimeHelp: '先输入约 2 秒,再根据缓存、存储卡写入和相机间隔调整。', totalIntegrationLabel: '期望总积分时间', totalIntegrationHelp: '希望收集的有效曝光时间', resultTitle: '你的拍摄计划', resultKicker: '今晚计划的起点', secondsUnit: '每帧', framesLabel: '帧', totalTimeLabel: '计划积分时间', sessionTimeLabel: '现场预计时长', gainLabel: '理想堆栈增益', sessionDetail: '包含帧间 {dead}:间隔时间 {deadTotal}。', workloadText: '{frames} 次快门动作。现场预计时长包含帧间空闲时间。', highWorkloadText: '{frames} 次快门动作。建议考虑电子快门、备用电池和存储空间。现场预计时长:{session}。', sensorPixelWarning: '请核对相机规格:{pixel} 对 APS C 来说是较大的像素间距,可能使 NPF 上限更短。', comparisonTitle: '两个上限,一个选择', npfLabel: 'NPF 上限', rule500Label: '500 法则上限', deltaLabel: 'NPF 差异', timelineTitle: '作为光带的堆栈', timelineStart: '第一帧', timelineEnd: '最后一帧', trackingNote: '跟踪已开启。计划使用每帧 {ceiling},需要 {frames} 帧,现场约 {session}。请用极轴校准、导星和测试帧确认该时长;NPF 仍是无跟踪时的比较基准。', untrackedNote: '将 {ceiling} 作为起始上限,并在完整分辨率下检查测试帧的星点形状和天空亮度。', methodTitle: '估算方法', methodText: 'NPF 根据光圈、焦距、像素间距和目标赤纬估算像素级可见星点移动。500 法则只使用焦距和传感器裁切系数。两者都是针对不跟踪相机的几何经验公式。选择跟踪赤道仪后,计划使用你输入的曝光时间,不会替你验证赤道仪性能。', limitsTitle: '现场限制', limitsText: '跟踪、明亮天空、高分辨率裁切、风或焦点漂移都会改变实际曝光。请拍摄测试帧,并检查画面边角、直方图和赤道仪表现。', startingStatus: '正在检查输入', formulaLabel: '参考公式', formulaNpf: 'NPF:(16.9 x 光圈 + 0.10 x 焦距 + 13.7 x 像素间距)/(焦距 x 赤纬余弦)。', formula500: '500 法则:500 /(焦距 x 传感器裁切系数)。', presetsLabel: '快速设置', presets: { milkyWay: '24 mm 全画幅', wideAngle: '14 mm 广角', telephoto: '85 mm 长焦' },
10
+ },
11
+ seo: [
12
+ { type: 'title', text: '为什么曝光堆栈需要上限', level: 2 },
13
+ { type: 'paragraph', html: '曝光堆栈由多张独立照片组成,之后再进行对齐和合成。目标是在保持每帧可用的同时收集更多信号。固定相机曝光过久时,天空的表观运动会让星点变长。曝光过短则会受到读取噪声和存储间隔影响,使拍摄效率降低。' },
14
+ { type: 'paragraph', html: '这个规划器把这些决定转换成具体拍摄计划。它比较 NPF 和 500 法则,把目标积分时间分成完整帧,并把帧间空闲时间加入现场时长。由于相机不能拍摄半帧,最后一帧可能让总积分略微超过目标。' },
15
+ { type: 'list', items: ['知道光圈和像素间距时使用 NPF。', '需要包含传感器裁切的快速比较时使用 500 法则。', '把帧数理解为存储和筛选的实际工作量。', '开始完整堆栈前先拍一张测试帧。'] },
16
+ { type: 'tip', title: '上限不是保证', html: '请在完整分辨率下检查亮星和边角。风、镜头彗差、焦点漂移和震动可能比公式更重要。' },
17
+ { type: 'title', text: 'NPF 和 500 法则回答不同问题', level: 2 },
18
+ { type: 'paragraph', html: '500 法则速度快,并考虑传感器裁切系数,但不使用像素间距、光圈或赤纬。NPF 加入这些变量,因此更接近具体相机和镜头,但它仍然只是针对不跟踪相机的经验估算。' },
19
+ { type: 'title', text: '把结果转换为夜间拍摄计划', level: 2 },
20
+ { type: 'paragraph', html: '请输入实际使用的设备参数。如果已经分别输入真实焦距和传感器格式,就不要再次输入等效焦距。像素间距应来自相机型号的可靠规格。' },
21
+ { type: 'list', items: ['在完整分辨率下查看测试帧的边角。', '检查直方图和过曝高光。', '在整个堆栈中保持焦点和设置不变。', '为暗场和校准拍摄预留时间。'] },
22
+ { type: 'title', text: '使用跟踪赤道仪时有什么变化', level: 2 },
23
+ { type: 'paragraph', html: '开启跟踪后,工具使用你输入的每帧跟踪曝光来计算帧数。NPF 和 500 法则仍作为不跟踪时的比较值显示,但不再决定帧数。极轴校准、周期误差、导星、风、天空亮度和饱和度都可能成为新的限制。' },
24
+ { type: 'tip', title: '先测试,再拍完整堆栈', html: '先拍一组短测试,放大边角检查星点。投入两小时暗夜时间前,先调整跟踪曝光。' },
25
+ { type: 'paragraph', html: '下面的数值可以说明差异:35 mm、APS C、5.9 微米、赤纬 5 度时,NPF 上限约为 3.8 秒。没有跟踪时,拍摄两小时大约需要 1907 张照片。使用跟踪架、每张 120 秒时只需 60 张;每张之间等待 5 秒,现场时间只增加约 5 分钟。' },
26
+ { type: 'paragraph', html: '请把有效积分时间和实际拍摄时长分开规划。写入存储卡、检查对焦、抖动、换电池以及重拍失败画面都应计入夜间安排,即使它们不会增加信号。大量短曝光可以使用电子快门来减少机械磨损,但仍要确认缓存和存储空间。' },
27
+ { type: 'tip', title: '核对像素尺寸与传感器', html: 'APS C 配合 5.9 微米像素在现代高像素相机中并不常见。如果真实像素更小,NPF 上限也会缩短。请核对准确的相机型号,并在开始完整序列前拍摄测试画面。' },
28
+ ],
29
+ faq: [
30
+ { question: '应该使用 NPF 还是 500 法则?', answer: '如果知道光圈和像素间距,NPF 是更贴近相机的起点。500 法则适合快速比较,但两者都应该用完整分辨率测试帧确认。' },
31
+ { question: '帧数包含哪些内容?', answer: '它表示达到或略微超过目标积分时间所需的完整光帧数量。不包括暗场、平场、偏置、间隔和被淘汰的照片。' },
32
+ { question: '跟踪模式会计算导星精度吗?', answer: '不会。它只使用你输入的跟踪曝光时间。极轴校准、导星和天空亮度必须通过真实测试帧检查。' },
33
+ ],
34
+ howTo: [
35
+ { name: '输入相机参数', text: '输入焦距、光圈、像素间距和目标赤纬。' },
36
+ { name: '选择模式', text: '不跟踪时选择 NPF 或 500 法则,跟踪时设置每帧曝光时间。' },
37
+ { name: '设置积分时间', text: '输入有效总曝光时间,并查看帧数和现场时长。' },
38
+ { name: '在现场验证', text: '拍摄测试帧,检查星点和直方图,再调整拍摄序列。' },
39
+ ],
40
+ });
@@ -0,0 +1,11 @@
1
+ import { astrophotographyExposureStackPlanner } from './entry';
2
+ import type { ToolDefinition } from '../../types';
3
+
4
+ export * from './entry';
5
+
6
+ export const ASTROPHOTOGRAPHY_EXPOSURE_STACK_PLANNER_TOOL: ToolDefinition = {
7
+ entry: astrophotographyExposureStackPlanner as unknown as ToolDefinition['entry'],
8
+ Component: () => import('./component.astro'),
9
+ SEOComponent: () => import('./seo.astro'),
10
+ BibliographyComponent: () => import('./bibliography.astro'),
11
+ };
@@ -0,0 +1,59 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
2
+ import type { SEOSection } from '@jjlmoya/utils-shared';
3
+ import { ASTROPHOTOGRAPHY_EXPOSURE_BIBLIOGRAPHY } from './bibliography';
4
+ import type { ExposurePlannerLocaleContent, ExposurePlannerUI } from './ui';
5
+
6
+ interface LocaleCopy {
7
+ slug: string;
8
+ title: string;
9
+ description: string;
10
+ ui: ExposurePlannerUI;
11
+ seo: SEOSection[];
12
+ faq: ExposurePlannerLocaleContent['faq'];
13
+ howTo: ExposurePlannerLocaleContent['howTo'];
14
+ }
15
+
16
+ function createSoftwareSchema(copy: LocaleCopy): WithContext<SoftwareApplication> {
17
+ return {
18
+ '@context': 'https://schema.org',
19
+ '@type': 'SoftwareApplication',
20
+ name: copy.title,
21
+ applicationCategory: 'PhotographyApplication',
22
+ operatingSystem: 'Any',
23
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
24
+ };
25
+ }
26
+
27
+ function createFaqSchema(copy: LocaleCopy): WithContext<FAQPage> {
28
+ return {
29
+ '@context': 'https://schema.org',
30
+ '@type': 'FAQPage',
31
+ mainEntity: copy.faq.map((item) => ({
32
+ '@type': 'Question',
33
+ name: item.question,
34
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
35
+ })),
36
+ };
37
+ }
38
+
39
+ function createHowToSchema(copy: LocaleCopy): WithContext<HowTo> {
40
+ return {
41
+ '@context': 'https://schema.org',
42
+ '@type': 'HowTo',
43
+ name: copy.title,
44
+ description: copy.description,
45
+ step: copy.howTo.map((step) => ({
46
+ '@type': 'HowToStep',
47
+ name: step.name,
48
+ text: step.text,
49
+ })),
50
+ };
51
+ }
52
+
53
+ export function createLocalizedContent(copy: LocaleCopy): ExposurePlannerLocaleContent {
54
+ return {
55
+ ...copy,
56
+ bibliography: ASTROPHOTOGRAPHY_EXPOSURE_BIBLIOGRAPHY,
57
+ schemas: [createSoftwareSchema(copy), createFaqSchema(copy), createHowToSchema(copy)],
58
+ };
59
+ }
@@ -0,0 +1,74 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import {
3
+ calculateExposurePlan,
4
+ calculateNpfSeconds,
5
+ calculateRule500,
6
+ calculateTimeline,
7
+ DEFAULT_INPUT,
8
+ normalizeInput,
9
+ } from './logic';
10
+
11
+ describe('astrophotography exposure stack planner logic', () => {
12
+ it('calculates the sensor-aware rule of 500', () => {
13
+ expect(calculateRule500(20, 'fullFrame')).toBe(25);
14
+ expect(calculateRule500(20, 'apsC')).toBeCloseTo(16.6667, 3);
15
+ });
16
+
17
+ it('calculates the complete NPF ceiling with declination', () => {
18
+ expect(calculateNpfSeconds(20, 2, 4, 0)).toBeCloseTo(4.53, 2);
19
+ expect(calculateNpfSeconds(20, 2, 4, 60)).toBeGreaterThan(calculateNpfSeconds(20, 2, 4, 0));
20
+ });
21
+
22
+ it('normalizes non finite and out of range values', () => {
23
+ const result = normalizeInput({ ...DEFAULT_INPUT, focalLength: Number.NaN, aperture: 80, pixelPitch: -2, declination: 100, totalIntegrationMinutes: 0 });
24
+ expect(result.focalLength).toBe(DEFAULT_INPUT.focalLength);
25
+ expect(result.aperture).toBe(32);
26
+ expect(result.pixelPitch).toBe(0.5);
27
+ expect(result.declination).toBe(89);
28
+ expect(result.totalIntegrationMinutes).toBe(1);
29
+ });
30
+
31
+ it('turns total integration into a complete frame plan', () => {
32
+ const plan = calculateExposurePlan({ ...DEFAULT_INPUT, focalLength: 20, totalIntegrationMinutes: 10 });
33
+ expect(plan.frameCount).toBeGreaterThan(1);
34
+ expect(plan.plannedIntegrationMinutes).toBeGreaterThanOrEqual(10);
35
+ expect(plan.timeline.length).toBeLessThanOrEqual(12);
36
+ expect(plan.timeline.at(-1)?.isFinal).toBe(true);
37
+ });
38
+
39
+ it('supports the rule of 500 path', () => {
40
+ const plan = calculateExposurePlan({ ...DEFAULT_INPUT, exposureRule: 'rule500', sensor: 'apsC' });
41
+ expect(plan.selectedCeilingSeconds).toBe(plan.rule500Seconds);
42
+ expect(plan.stackingGainStops).toBeGreaterThan(0);
43
+ });
44
+
45
+ it('uses the chosen tracked exposure instead of NPF for a tracking plan', () => {
46
+ const plan = calculateExposurePlan({
47
+ ...DEFAULT_INPUT,
48
+ tracking: 'tracked',
49
+ trackingExposureSeconds: 120,
50
+ deadTimeSeconds: 2,
51
+ totalIntegrationMinutes: 120,
52
+ });
53
+ expect(plan.selectedCeilingSeconds).toBe(120);
54
+ expect(plan.frameCount).toBe(60);
55
+ expect(plan.plannedIntegrationMinutes).toBe(120);
56
+ expect(plan.deadTimeMinutes).toBe(2);
57
+ expect(plan.sessionDurationMinutes).toBe(122);
58
+ });
59
+
60
+ it('keeps dead time outside useful integration', () => {
61
+ const plan = calculateExposurePlan({
62
+ ...DEFAULT_INPUT,
63
+ tracking: 'untracked',
64
+ totalIntegrationMinutes: 30,
65
+ deadTimeSeconds: 5,
66
+ });
67
+ expect(plan.plannedIntegrationMinutes).toBeGreaterThanOrEqual(30);
68
+ expect(plan.sessionDurationMinutes).toBeGreaterThan(plan.plannedIntegrationMinutes);
69
+ });
70
+
71
+ it('keeps a visible single slice for a one frame plan', () => {
72
+ expect(calculateTimeline(0)).toEqual([{ index: 1, width: 100, isFinal: true }]);
73
+ });
74
+ });