@jjlmoya/utils-astronomy 1.16.0 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -1
  3. package/src/data.ts +2 -0
  4. package/src/entries.ts +4 -1
  5. package/src/pages/[locale]/[slug].astro +30 -14
  6. package/src/tests/locale_completeness.test.ts +1 -34
  7. package/src/tests/tool_structure.test.ts +71 -0
  8. package/src/tests/tool_validation.test.ts +4 -3
  9. package/src/tool/bortleVisualizer/bibliography.ts +8 -0
  10. package/src/tool/bortleVisualizer/entry.ts +2 -0
  11. package/src/tool/bortleVisualizer/i18n/de.ts +1 -9
  12. package/src/tool/bortleVisualizer/i18n/en.ts +1 -9
  13. package/src/tool/bortleVisualizer/i18n/es.ts +1 -9
  14. package/src/tool/bortleVisualizer/i18n/fr.ts +1 -9
  15. package/src/tool/bortleVisualizer/i18n/id.ts +1 -9
  16. package/src/tool/bortleVisualizer/i18n/it.ts +1 -9
  17. package/src/tool/bortleVisualizer/i18n/ja.ts +1 -9
  18. package/src/tool/bortleVisualizer/i18n/ko.ts +1 -9
  19. package/src/tool/bortleVisualizer/i18n/nl.ts +1 -9
  20. package/src/tool/bortleVisualizer/i18n/pl.ts +1 -9
  21. package/src/tool/bortleVisualizer/i18n/pt.ts +1 -9
  22. package/src/tool/bortleVisualizer/i18n/ru.ts +1 -9
  23. package/src/tool/bortleVisualizer/i18n/sv.ts +1 -9
  24. package/src/tool/bortleVisualizer/i18n/tr.ts +1 -9
  25. package/src/tool/bortleVisualizer/i18n/zh.ts +1 -9
  26. package/src/tool/bortleVisualizer/seo.astro +2 -48
  27. package/src/tool/deepSpaceScope/bibliography.ts +6 -0
  28. package/src/tool/deepSpaceScope/entry.ts +2 -0
  29. package/src/tool/deepSpaceScope/i18n/de.ts +1 -7
  30. package/src/tool/deepSpaceScope/i18n/en.ts +1 -7
  31. package/src/tool/deepSpaceScope/i18n/es.ts +1 -7
  32. package/src/tool/deepSpaceScope/i18n/fr.ts +1 -7
  33. package/src/tool/deepSpaceScope/i18n/id.ts +1 -7
  34. package/src/tool/deepSpaceScope/i18n/it.ts +1 -7
  35. package/src/tool/deepSpaceScope/i18n/ja.ts +1 -7
  36. package/src/tool/deepSpaceScope/i18n/ko.ts +1 -7
  37. package/src/tool/deepSpaceScope/i18n/nl.ts +1 -7
  38. package/src/tool/deepSpaceScope/i18n/pl.ts +1 -7
  39. package/src/tool/deepSpaceScope/i18n/pt.ts +1 -7
  40. package/src/tool/deepSpaceScope/i18n/ru.ts +1 -7
  41. package/src/tool/deepSpaceScope/i18n/sv.ts +1 -7
  42. package/src/tool/deepSpaceScope/i18n/tr.ts +1 -7
  43. package/src/tool/deepSpaceScope/i18n/zh.ts +1 -7
  44. package/src/tool/deepSpaceScope/seo.astro +2 -48
  45. package/src/tool/smartEyepieceCalculator/app.ts +327 -0
  46. package/src/tool/smartEyepieceCalculator/bibliography.astro +14 -0
  47. package/src/tool/smartEyepieceCalculator/bibliography.ts +6 -0
  48. package/src/tool/smartEyepieceCalculator/component.astro +125 -0
  49. package/src/tool/smartEyepieceCalculator/entry.ts +67 -0
  50. package/src/tool/smartEyepieceCalculator/i18n/de.ts +165 -0
  51. package/src/tool/smartEyepieceCalculator/i18n/en.ts +166 -0
  52. package/src/tool/smartEyepieceCalculator/i18n/es.ts +165 -0
  53. package/src/tool/smartEyepieceCalculator/i18n/fr.ts +165 -0
  54. package/src/tool/smartEyepieceCalculator/i18n/id.ts +165 -0
  55. package/src/tool/smartEyepieceCalculator/i18n/it.ts +165 -0
  56. package/src/tool/smartEyepieceCalculator/i18n/ja.ts +165 -0
  57. package/src/tool/smartEyepieceCalculator/i18n/ko.ts +165 -0
  58. package/src/tool/smartEyepieceCalculator/i18n/nl.ts +165 -0
  59. package/src/tool/smartEyepieceCalculator/i18n/pl.ts +165 -0
  60. package/src/tool/smartEyepieceCalculator/i18n/pt.ts +165 -0
  61. package/src/tool/smartEyepieceCalculator/i18n/ru.ts +165 -0
  62. package/src/tool/smartEyepieceCalculator/i18n/sv.ts +165 -0
  63. package/src/tool/smartEyepieceCalculator/i18n/tr.ts +165 -0
  64. package/src/tool/smartEyepieceCalculator/i18n/zh.ts +165 -0
  65. package/src/tool/smartEyepieceCalculator/index.ts +13 -0
  66. package/src/tool/smartEyepieceCalculator/logic.ts +67 -0
  67. package/src/tool/smartEyepieceCalculator/seo.astro +15 -0
  68. package/src/tool/smartEyepieceCalculator/smart-eyepiece-calculator.css +393 -0
  69. package/src/tool/starExposureCalculator/bibliography.ts +7 -0
  70. package/src/tool/starExposureCalculator/entry.ts +2 -0
  71. package/src/tool/starExposureCalculator/i18n/de.ts +1 -8
  72. package/src/tool/starExposureCalculator/i18n/en.ts +1 -8
  73. package/src/tool/starExposureCalculator/i18n/es.ts +1 -8
  74. package/src/tool/starExposureCalculator/i18n/fr.ts +1 -8
  75. package/src/tool/starExposureCalculator/i18n/id.ts +1 -8
  76. package/src/tool/starExposureCalculator/i18n/it.ts +1 -8
  77. package/src/tool/starExposureCalculator/i18n/ja.ts +1 -8
  78. package/src/tool/starExposureCalculator/i18n/ko.ts +1 -8
  79. package/src/tool/starExposureCalculator/i18n/nl.ts +1 -8
  80. package/src/tool/starExposureCalculator/i18n/pl.ts +1 -8
  81. package/src/tool/starExposureCalculator/i18n/pt.ts +1 -8
  82. package/src/tool/starExposureCalculator/i18n/ru.ts +1 -8
  83. package/src/tool/starExposureCalculator/i18n/sv.ts +1 -8
  84. package/src/tool/starExposureCalculator/i18n/tr.ts +1 -8
  85. package/src/tool/starExposureCalculator/i18n/zh.ts +1 -8
  86. package/src/tool/starExposureCalculator/seo.astro +2 -48
  87. package/src/tool/telescopeResolution/bibliography.ts +7 -0
  88. package/src/tool/telescopeResolution/entry.ts +2 -0
  89. package/src/tool/telescopeResolution/i18n/de.ts +1 -8
  90. package/src/tool/telescopeResolution/i18n/en.ts +1 -8
  91. package/src/tool/telescopeResolution/i18n/es.ts +1 -8
  92. package/src/tool/telescopeResolution/i18n/fr.ts +1 -8
  93. package/src/tool/telescopeResolution/i18n/id.ts +1 -8
  94. package/src/tool/telescopeResolution/i18n/it.ts +1 -8
  95. package/src/tool/telescopeResolution/i18n/ja.ts +1 -8
  96. package/src/tool/telescopeResolution/i18n/ko.ts +1 -8
  97. package/src/tool/telescopeResolution/i18n/nl.ts +1 -8
  98. package/src/tool/telescopeResolution/i18n/pl.ts +1 -8
  99. package/src/tool/telescopeResolution/i18n/pt.ts +1 -8
  100. package/src/tool/telescopeResolution/i18n/ru.ts +1 -8
  101. package/src/tool/telescopeResolution/i18n/sv.ts +1 -8
  102. package/src/tool/telescopeResolution/i18n/tr.ts +1 -8
  103. package/src/tool/telescopeResolution/i18n/zh.ts +1 -8
  104. package/src/tool/telescopeResolution/seo.astro +2 -48
  105. package/src/tools.ts +3 -0
  106. package/src/types.ts +1 -5
@@ -0,0 +1,165 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
+ import type { EyepieceCalculatorLocaleContent } from '../entry';
4
+
5
+ const title = 'Okularkalkylator & Visuell Simulator';
6
+ const description = 'Beräkna förstoring, verkligt synfält (TFOV) and utgångspupill för valfritt okular med ditt teleskop. Inkluderar en interaktiv visuell simulator.';
7
+
8
+ const ui = {
9
+ toolTitle: 'Smart Okularkalkylator',
10
+ telescopeTitle: 'Ditt Teleskop',
11
+ apertureLabel: 'Öppning (mm)',
12
+ focalLabel: 'Brännvidd (mm)',
13
+ presetsLabel: 'Populära Modeller',
14
+ presetsPlaceholder: 'Välj ett teleskop...',
15
+ addEyepieceBtn: '+ Lägg till Okular',
16
+ eyepiecesTitle: 'Dina Okular',
17
+ eyepieceFocal: 'Brännvidd (mm)',
18
+ eyepieceAfov: 'Skenbart Fält (°)',
19
+ removeEyepiece: 'Ta bort',
20
+ magLabel: 'Förstoring',
21
+ tfovLabel: 'Verkligt Fält',
22
+ pupilLabel: 'Utgångspupill',
23
+ simulatorTitle: 'Synfälts-simulator',
24
+ targetLabel: 'Vad vill du se?',
25
+ targetMoon: 'Månen',
26
+ targetSaturn: 'Saturnus',
27
+ targetPleiades: 'Plejader-hopen',
28
+ targetAndromeda: 'Andromedagalaxen',
29
+ targetM13: 'M13-hopen',
30
+ statusDangerHighMag: 'Slöseri med pengar: Du pressar teleskopet bortom dess fysiska gränser.',
31
+ statusDangerPupil: 'Slöseri med ljus: Utgångspupillen överstiger 7 mm. Ditt öga kan inte bearbeta så mycket ljus.',
32
+ statusWarningHighMag: 'Varning: För denna förstoring behöver du en exceptionellt stabil himmel (bra seeing).',
33
+ statusWarningLowMag: 'Låg förstoring: Du ligger under det rekommenderade minimumet. Du kan se skuggan av sekundärspegeln eller tappa kontrast.',
34
+ statusPerfectDeepSky: 'Perfekt kombination! Idealisk för utsträckta objekt och Deep Sky (stjärnhopar, nebulosor).',
35
+ statusPerfectPlanetary: 'Perfekt kombination! Idealisk för att se planetdetaljer (Saturnus ringar, Jupiters bälten).',
36
+ statusPerfectGeneral: 'Utmärkt allround-kombination! Idealisk för allmän observation av alla typer av objekt.',
37
+ ctaText: 'Baserat på din nuvarande utrustning rekommenderar vi att du använder okular som ger dig mellan {min}x och {max}x förstoring.',
38
+ compareText: 'Jämför Okular',
39
+ apertureHelp: 'Diametern på tuben, står oftast på originaletiketten eller kartongen.',
40
+ focalHelp: 'Teleskopets brännvidd.',
41
+ afovHelp: 'Okularets skenbara synfält. Plössl är oftast 52°, vidvinkel 68° eller mer.',
42
+ };
43
+
44
+ const faq: EyepieceCalculatorLocaleContent['faq'] = [
45
+ {
46
+ question: 'Hur beräknar man teleskopförstoring?',
47
+ answer: 'Formeln är enkel: dela teleskopets brännvidd med okularets brännvidd. Till exempel ger ett 1000mm teleskop med ett 10mm okular 100x förstoring.',
48
+ },
49
+ {
50
+ question: 'Vad är utgångspupill och varför är det viktigt?',
51
+ answer: 'Det är diametern på ljuskäglan som lämnar okularet och når ditt öga. Man räknar ut den genom att dela teleskopets öppning med förstoringen. Om den överstiger 7 mm kan ditt öga inte fånga upp allt ljus, vilket slösar bort teleskopets kraft.',
52
+ },
53
+ {
54
+ question: 'Hur vet jag mitt okulars verkliga synfält?',
55
+ answer: 'Verkligt synfält (TFOV) beräknas genom att dela okularets skenbara synfält (AFOV) med förstoringen. Detta talar om hur många grader av himlen du faktiskt ser.',
56
+ },
57
+ ];
58
+
59
+ const howTo: EyepieceCalculatorLocaleContent['howTo'] = [
60
+ { name: '1. Fyll i teleskopdata', text: 'Skriv in öppning och brännvidd för din tub eller välj en populär modell ur listan.' },
61
+ { name: '2. Lägg till dina okular', text: 'Skriv in brännvidd och skenbart fält för dina okular för att jämföra deras prestanda.' },
62
+ { name: '3. Simulera vyn', text: 'Välj ett objekt (Månen, Saturnus etc.) och klicka på dina okular för att se hur bilden ändras och om du är inom de optiska gränserna.' },
63
+ ];
64
+
65
+ const seo: EyepieceCalculatorLocaleContent['seo'] = [
66
+ {
67
+ type: 'summary',
68
+ title: 'Nyckelfaktorer när du väljer okular',
69
+ items: [
70
+ 'Verklig maxförstoring: 2x öppningen i mm (men begränsad av atmosfären till 200-250x).',
71
+ 'Minsta användbara förstoring: Öppningen delat med 7 (gränsen för den mänskliga pupillen).',
72
+ 'Optimalt område: Mellan 0,5 mm och 7 mm utgångspupill.',
73
+ ],
74
+ },
75
+ { type: 'title', text: 'Att välja okular till ditt teleskop: En Praktisk Guide', level: 2 },
76
+ {
77
+ type: 'paragraph',
78
+ html: 'Köp inte okular på intuition. Nyckeln till bra observationer ligger i balansen mellan teleskopets upplösning och ditt ögas biologiska kapacitet. Ett felvalt okular kan få även världens bästa teleskop att se suddigt eller för mörkt ut.',
79
+ },
80
+ { type: 'title', text: '1. Beräkning av förstoring (M)', level: 3 },
81
+ {
82
+ type: 'paragraph',
83
+ html: 'Formeln är enkel: dela teleskopets brännvidd med okularets brännvidd. <br/><strong>Formel:</strong> Teleskopets brännvidd / Okularets brännvidd = Förstoring. <br/>Exempel: Ett 1000mm teleskop med ett 10mm okular ger 100x förstoring.',
84
+ },
85
+ { type: 'title', text: '2. Myten om maximal förstoring', level: 3 },
86
+ {
87
+ type: 'paragraph',
88
+ html: 'Den verkliga gränsen sätts inte av okularet, utan av öppningen (diametern) på ditt teleskop. <br/>- <strong>Teoretisk gräns:</strong> 2 × Öppningen i mm. <br/>- <strong>Verklig gräns (Genomsnittlig Seeing):</strong> Du kommer sällan över 200x - 250x på grund av atmosfärisk turbulens, oavsett teleskop. Att pressa mer ger bara en förstorad suddig fläck.',
89
+ },
90
+ { type: 'title', text: '3. Utgångspupill: Ljusstyrkefaktorn', level: 3 },
91
+ {
92
+ type: 'paragraph',
93
+ html: 'Utgångspupillen är den ljuscylinder som kommer ur okularet mot ditt öga. <br/>- <strong>Om den är större än 7 mm:</strong> Ditt öga kan inte öppna sig så mycket; du tappar ljus och kastar bokstavligen bort pengar. <br/>- <strong>Om den är mindre än 0,5 mm:</strong> Bilden blir så mörk att du knappt ser detaljer och börjar se "floaters" i ditt eget öga.',
94
+ },
95
+ {
96
+ type: 'table',
97
+ headers: ['Objekt att observera', 'Rekommenderad förstoring', 'Ideal pupill', 'Visuell upplevelse'],
98
+ rows: [
99
+ ['Galaxer och Nebulosor', 'Låg (25x - 50x)', '5 mm - 7 mm', 'Ljus bild, maximalt synfält.'],
100
+ ['Stjärnhopar', 'Mellan (80x - 120x)', '2 mm', 'Punktformade stjärnor och mörk himmelsbakgrund.'],
101
+ ['Planeter och Månen', 'Hög (150x eller mer)', '0,7 mm - 1 mm', 'Maximal detaljrikedom, bilden blir mindre och ljussvagare.'],
102
+ ],
103
+ },
104
+ {
105
+ type: 'diagnostic',
106
+ variant: 'warning',
107
+ title: 'Visuell användning eller Astrofotografi?',
108
+ icon: 'mdi:camera-off',
109
+ badge: 'Teknisk notering',
110
+ html: 'Det är avgörande att klargöra att dessa beräkningar exklusivt gäller för <strong>visuell observation</strong>. Många nybörjare försöker applicera dessa förstoringar på astrokameror och blir frustrerade; inom fotografi beror beräkningen på pixelstorlek och upplösning per bågsekund, inte på okularet.',
111
+ },
112
+ {
113
+ type: 'diagnostic',
114
+ variant: 'info',
115
+ title: 'Atmosfärisk stabilitet (Seeing)',
116
+ icon: 'mdi:weather-windy',
117
+ badge: 'Observationstips',
118
+ html: 'Även med de bästa okularen är nätter då stjärnorna blinkar intensivt inte lämpliga för hög förstoring. Detta beror på atmosfärisk turbulens (seeing) som sprider ljuset. Vid planetobservation rekommenderas att börja med en låg förstoring och bevaka bildens stabilitet; om bilden ser ut att vara under vatten, minska förstoringen för att se fler detaljer. I de flesta stadsområden är 150x till 200x den praktiska övre gränsen.',
119
+ },
120
+ ];
121
+
122
+ const faqSchema: WithContext<FAQPage> = {
123
+ '@context': 'https://schema.org',
124
+ '@type': 'FAQPage',
125
+ mainEntity: faq.map((item) => ({
126
+ '@type': 'Question',
127
+ name: item.question,
128
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
129
+ })),
130
+ };
131
+
132
+ const howToSchema: WithContext<HowTo> = {
133
+ '@context': 'https://schema.org',
134
+ '@type': 'HowTo',
135
+ name: title,
136
+ description,
137
+ step: howTo.map((step) => ({
138
+ '@type': 'HowToStep',
139
+ name: step.name,
140
+ text: step.text,
141
+ })),
142
+ };
143
+
144
+ const appSchema: WithContext<SoftwareApplication> = {
145
+ '@context': 'https://schema.org',
146
+ '@type': 'SoftwareApplication',
147
+ name: title,
148
+ description,
149
+ applicationCategory: 'UtilitiesApplication',
150
+ operatingSystem: 'Web',
151
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
152
+ inLanguage: 'sv',
153
+ };
154
+
155
+ export const content: EyepieceCalculatorLocaleContent = {
156
+ slug: 'okularkalkylator',
157
+ title,
158
+ description,
159
+ ui,
160
+ faq,
161
+ howTo,
162
+ seo,
163
+ bibliography,
164
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
165
+ };
@@ -0,0 +1,165 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
+ import type { EyepieceCalculatorLocaleContent } from '../entry';
4
+
5
+ const title = 'Oküler Hesaplayıcı ve Görsel Simülatör';
6
+ const description = 'Teleskobunuz için herhangi bir okülerle büyütme, gerçek görüş alanı (TFOV) ve çıkış açıklığını hesaplayın. Etkileşimli görsel simülatör içerir.';
7
+
8
+ const ui = {
9
+ toolTitle: 'Akıllı Oküler Hesaplayıcı',
10
+ telescopeTitle: 'Teleskobunuz',
11
+ apertureLabel: 'Açıklık (mm)',
12
+ focalLabel: 'Odak Uzaklığı (mm)',
13
+ presetsLabel: 'Popüler Modeller',
14
+ presetsPlaceholder: 'Bir teleskop seçin...',
15
+ addEyepieceBtn: '+ Oküler Ekle',
16
+ eyepiecesTitle: 'Okülerleriniz',
17
+ eyepieceFocal: 'Odak G. (mm)',
18
+ eyepieceAfov: 'Görünür Alan (°)',
19
+ removeEyepiece: 'Kaldır',
20
+ magLabel: 'Büyütme',
21
+ tfovLabel: 'Gerçek Alan',
22
+ pupilLabel: 'Çıkış Açıklığı',
23
+ simulatorTitle: 'Görüş Alanı Simülatörü',
24
+ targetLabel: 'Ne görmek istersiniz?',
25
+ targetMoon: 'Ay',
26
+ targetSaturn: 'Satürn',
27
+ targetPleiades: 'Ülker (Pleiades) Kümesi',
28
+ targetAndromeda: 'Andromeda Galaksisi',
29
+ targetM13: 'M13 Kümesi',
30
+ statusDangerHighMag: 'Boşa harcanan para: Teleskobunuzu fiziksel sınırlarının ötesine zorluyorsunuz.',
31
+ statusDangerPupil: 'Boşa harcanan ışık: Çıkış açıklığı 7 mm\'yi aşıyor. Gözünüz bu kadar çok ışığı işleyemez.',
32
+ statusWarningHighMag: 'Dikkat: Bu büyütme için olağanüstü kararlı bir gökyüzüne (iyi seeing) ihtiyacınız olacak.',
33
+ statusWarningLowMag: 'Düşük büyütme: Önerilen minimumun altındasınız. İkincil ayna gölgesini görebilir veya kontrast kaybedebilirsiniz.',
34
+ statusPerfectDeepSky: 'Mükemmel kombinasyon! Geniş nesneler ve Derin Uzay (kümeler, nebulalar) için ideal.',
35
+ statusPerfectPlanetary: 'Mükemmel kombinasyon! Gezegen detaylarını (Satürn halkaları, Jüpiter bantları) görmek için ideal.',
36
+ statusPerfectGeneral: 'Harika çok yönlü kombinasyon! Her tür nesnenin genel gözlemi için ideal.',
37
+ ctaText: 'Mevcut ekipmanınıza bağlı olarak, size {min}x ile {max}x arasında büyütme sağlayan okülerler kullanmanızı öneririz.',
38
+ compareText: 'Okülerleri Karşılaştır',
39
+ apertureHelp: 'Tüpün çapı, genellikle orijinal çıkartmada veya kutuda yazar.',
40
+ focalHelp: 'Teleskobun odak uzaklığı.',
41
+ afovHelp: 'Okülerin görünür görüş alanı. Plössl genellikle 52°, geniş açı 68° veya daha fazladır.',
42
+ };
43
+
44
+ const faq: EyepieceCalculatorLocaleContent['faq'] = [
45
+ {
46
+ question: 'Teleskop büyütmesi nasıl hesaplanır?',
47
+ answer: 'Formül basittir: Teleskop odak uzaklığını oküler odak uzaklığına bölün. Örneğin, 10mm okülerli 1000mm bir teleskop size 100 kat büyütme (100x) sağlar.',
48
+ },
49
+ {
50
+ question: 'Çıkış açıklığı nedir ve neden önemlidir?',
51
+ answer: 'Okülerden çıkıp gözünüze giren ışık huzmesinin çapıdır. Teleskop açıklığının büyütmeye bölünmesiyle hesaplanır. 7 mm\'yi aşarsa, gözünüz tüm ışığı yakalayamaz ve teleskobunuzun gücünü boşa harcamış olursunuz.',
52
+ },
53
+ {
54
+ question: 'Okülerimin gerçek görüş alanını nasıl anlarım?',
55
+ answer: 'Gerçek Görüş Alanı (TFOV), okülerin görünür görüş alanının (AFOV) büyütmeye bölünmesiyle hesaplanır. Bu size gökyüzünün kaç derecesini gerçekten gördüğünüzü söyler.',
56
+ },
57
+ ];
58
+
59
+ const howTo: EyepieceCalculatorLocaleContent['howTo'] = [
60
+ { name: '1. Teleskop verilerini girin', text: 'Tüpünüzün açıklığını ve odak uzaklığını yazın veya listeden popüler bir model seçin.' },
61
+ { name: '2. Okülerlerinizi ekleyin', text: 'Performanslarını karşılaştırmak için okülerlerinizin odak uzaklığını ve görünür alanını girin.' },
62
+ { name: '3. Görünümü simüle edin', text: 'Bir nesne (Ay, Satürn vb.) seçin ve görüntünün nasıl değiştiğini ve optik sınırlar içinde olup olmadığınızı görmek için okülerlerinize tıklayın.' },
63
+ ];
64
+
65
+ const seo: EyepieceCalculatorLocaleContent['seo'] = [
66
+ {
67
+ type: 'summary',
68
+ title: 'İdeal okülerinizi seçmek için temel faktörler',
69
+ items: [
70
+ 'Gerçek Maksimum Büyütme: mm cinsinden açıklığın 2 katı (ancak gökyüzü koşulları nedeniyle 200-250 kat ile sınırlıdır).',
71
+ 'Minimum Yararlı Büyütme: Açıklığın 7\'ye bölünmesi (insan göz bebeği sınırı).',
72
+ 'Optimal Aralık: 0,5 mm ile 7 mm çıkış açıklığı arası.',
73
+ ],
74
+ },
75
+ { type: 'title', text: 'Teleskobunuz İçin Oküler Nasıl Seçilir: Pratik Rehber', level: 2 },
76
+ {
77
+ type: 'paragraph',
78
+ html: 'Okülerleri sezgisel olarak satın almayın. İyi bir gözlemin anahtarı, teleskobunuzun çözünürlüğü ile gözünüzün biyolojik kapasitesini dengelemekte yatar. Yanlış seçilmiş bir oküler, dünyanın en iyi teleskobunun bile görüntüsünü bulanık veya çok karanlık yapabilir.',
79
+ },
80
+ { type: 'title', text: '1. Büyütme Hesabı (M)', level: 3 },
81
+ {
82
+ type: 'paragraph',
83
+ html: 'Formül basittir: Teleskop odak uzaklığını oküler odak uzaklığına bölün. <br/><strong>Formül:</strong> Teleskop Odak / Oküler Odak = Büyütme. <br/>Örnek: 10mm okülerli 1000mm bir teleskop size 100 kat büyütme (100x) sağlar.',
84
+ },
85
+ { type: 'title', text: '2. Maksimum Büyütme Efsanesi', level: 3 },
86
+ {
87
+ type: 'paragraph',
88
+ html: 'Gerçek sınır oküler tarafından değil, tüpünüzün açıklığı (çapı) tarafından belirlenir. <br/>- <strong>Teorik sınır:</strong> mm cinsinden Açıklık × 2. <br/>- <strong>Gerçek sınır (Ortalama Seeing):</strong> Teleskobunuz ne olursa olsun, atmosferik türbülans nedeniyle nadiren 200x - 250x\'i aşarsınız. Daha fazlasını zorlamak sadece büyütülmüş bulanık bir leke verecektir.',
89
+ },
90
+ { type: 'title', text: '3. Çıkış Açıklığı: Parlaklık Faktörü', level: 3 },
91
+ {
92
+ type: 'paragraph',
93
+ html: 'Çıkış açıklığı, okülerden gözünüze doğru çıkan ışık silindiridir. <br/>- <strong>7 mm\'den büyükse:</strong> Gözünüz o kadar açılamaz; ışık kaybedersiniz ve kelimenin tam anlamıyla paranızı çöpe atarsınız. <br/>- <strong>0,5 mm\'den küçükse:</strong> Görüntü o kadar karanlık olur ki detayları zar zor görürsünüz ve kendi gözünüzdeki "uçuşan cisimleri" (floaters) görmeye başlarsınız.',
94
+ },
95
+ {
96
+ type: 'table',
97
+ headers: ['Gözlemlenecek Nesne', 'Önerilen Büyütme', 'İdeal Açıklık', 'Görsel Deneyim'],
98
+ rows: [
99
+ ['Galaksiler ve Nebulalar', 'Düşük (25x - 50x)', '5 mm - 7 mm', 'Parlak görüntü, maksimum görüş alanı.'],
100
+ ['Yıldız Kümeleri', 'Orta (80x - 120x)', '2 mm', 'Noktasal yıldızlar ve koyu gökyüzü arka planı.'],
101
+ ['Gezegenler ve Ay', 'Yüksek (150x veya daha fazla)', '0,7 mm - 1 mm', 'Maksimum detay, daha küçük ve sönük görüntü.'],
102
+ ],
103
+ },
104
+ {
105
+ type: 'diagnostic',
106
+ variant: 'warning',
107
+ title: 'Görsel Gözlem mi Astrofotografi mi?',
108
+ icon: 'mdi:camera-off',
109
+ badge: 'Teknik Not',
110
+ html: 'Bu hesaplamaların özel olarak <strong>görsel gözlem</strong> için olduğunu netleştirmek hayati önem taşır. Birçok yeni başlayan bu büyütmeleri astro-kameralara uygulamaya çalışır ve hüsrana uğrar; fotoğrafçılıkta hesaplama okülere değil, piksel boyutuna ve yay-saniyesi başına çözünürlüğe bağlıdır.',
111
+ },
112
+ {
113
+ type: 'diagnostic',
114
+ variant: 'info',
115
+ title: 'Atmosferik Kararlılığın (Seeing) Etkisi',
116
+ icon: 'mdi:weather-windy',
117
+ badge: 'Gözlem İpucu',
118
+ html: 'En iyi okülerlere sahip olsanız bile, yıldızların şiddetle göz kırptığı geceler yüksek büyütme için uygun değildir. Bunun nedeni, ışığı dağıtan atmosferik türbülanstır (seeing). Gezegenleri gözlemlerken, düşük bir büyütme ile başlamanız ve görüntünün kararlılığını izlemeniz önerilir; eğer görüntü su altındaymış gibi görünüyorsa, daha fazla detay görmek için büyütmeyi azaltın. Çoğu kentsel alanda, 150x veya 200x pratik üst sınırdır.',
119
+ },
120
+ ];
121
+
122
+ const faqSchema: WithContext<FAQPage> = {
123
+ '@context': 'https://schema.org',
124
+ '@type': 'FAQPage',
125
+ mainEntity: faq.map((item) => ({
126
+ '@type': 'Question',
127
+ name: item.question,
128
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
129
+ })),
130
+ };
131
+
132
+ const howToSchema: WithContext<HowTo> = {
133
+ '@context': 'https://schema.org',
134
+ '@type': 'HowTo',
135
+ name: title,
136
+ description,
137
+ step: howTo.map((step) => ({
138
+ '@type': 'HowToStep',
139
+ name: step.name,
140
+ text: step.text,
141
+ })),
142
+ };
143
+
144
+ const appSchema: WithContext<SoftwareApplication> = {
145
+ '@context': 'https://schema.org',
146
+ '@type': 'SoftwareApplication',
147
+ name: title,
148
+ description,
149
+ applicationCategory: 'UtilitiesApplication',
150
+ operatingSystem: 'Web',
151
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'TRY' },
152
+ inLanguage: 'tr',
153
+ };
154
+
155
+ export const content: EyepieceCalculatorLocaleContent = {
156
+ slug: 'okuler-hesaplayici',
157
+ title,
158
+ description,
159
+ ui,
160
+ faq,
161
+ howTo,
162
+ seo,
163
+ bibliography,
164
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
165
+ };
@@ -0,0 +1,165 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
+ import type { EyepieceCalculatorLocaleContent } from '../entry';
4
+
5
+ const title = '目镜计算器与视觉模拟器';
6
+ const description = '为您的望远镜计算任何目镜的放大倍数、实际视野 (TFOV) 和出瞳直径。包含交互式视觉模拟器。';
7
+
8
+ const ui = {
9
+ toolTitle: '智能目镜计算器',
10
+ telescopeTitle: '您的望远镜',
11
+ apertureLabel: '口径 (mm)',
12
+ focalLabel: '焦距 (mm)',
13
+ presetsLabel: '常见型号',
14
+ presetsPlaceholder: '选择望远镜...',
15
+ addEyepieceBtn: '+ 添加目镜',
16
+ eyepiecesTitle: '您的目镜',
17
+ eyepieceFocal: '焦距 (mm)',
18
+ eyepieceAfov: '表观视野 (°)',
19
+ removeEyepiece: '删除',
20
+ magLabel: '放大倍数',
21
+ tfovLabel: '实际视野',
22
+ pupilLabel: '出瞳直径',
23
+ simulatorTitle: '视野模拟器',
24
+ targetLabel: '您想看什么?',
25
+ targetMoon: '月球',
26
+ targetSaturn: '土星',
27
+ targetPleiades: '昴星团',
28
+ targetAndromeda: '仙女座星系',
29
+ targetM13: 'M13 球状星团',
30
+ statusDangerHighMag: '浪费钱:您正在强行让望远镜超出其物理极限。',
31
+ statusDangerPupil: '光线浪费:出瞳直径超过 7mm。您的眼睛无法处理这么多光线。',
32
+ statusWarningHighMag: '注意:此放大倍数需要极其稳定的天气(良好的视宁度)。',
33
+ statusWarningLowMag: '放大倍数过低:低于推荐的最小值。您可能会看到副镜的影子或失去对比度。',
34
+ statusPerfectDeepSky: '完美结合!非常适合观测弥散天体和深空(星团、星云)。',
35
+ statusPerfectPlanetary: '完美结合!非常适合观测行星细节(土星环、木星条纹)。',
36
+ statusPerfectGeneral: '出色的全能组合!适合各种天体的常规观测。',
37
+ ctaText: '根据您目前的设备,我们建议使用放大倍数在 {min}x 到 {max}x 之间的目镜。',
38
+ compareText: '比较目镜',
39
+ apertureHelp: '镜筒的直径,通常可以在原厂标签或包装盒上找到。',
40
+ focalHelp: '望远镜的焦距。',
41
+ afovHelp: '目镜的表观视野。普罗索 (Plössl) 目镜通常为 52°,广角目镜为 68° 或更高。',
42
+ };
43
+
44
+ const faq: EyepieceCalculatorLocaleContent['faq'] = [
45
+ {
46
+ question: '望远镜的放大倍数是如何计算的?',
47
+ answer: '公式很简单:将望远镜的焦距除以目镜的焦距。例如,焦距为 1000mm 的望远镜搭配 10mm 的目镜,其放大倍数为 100x。',
48
+ },
49
+ {
50
+ question: '什么是出瞳直径,为什么它很重要?',
51
+ answer: '它是从目镜射出并进入你眼睛的光束直径。计算方法是将望远镜口径除以放大倍数。如果它超过 7mm,你的眼睛将无法捕获所有光线,从而浪费望远镜的性能。',
52
+ },
53
+ {
54
+ question: '我如何知道目镜的实际视野?',
55
+ answer: '实际视野 (TFOV) 的计算方法是将目镜的表观视野 (AFOV) 除以放大倍数。这会告诉你在望远镜中实际能看到多少度的天空。',
56
+ },
57
+ ];
58
+
59
+ const howTo: EyepieceCalculatorLocaleContent['howTo'] = [
60
+ { name: '1. 输入望远镜数据', text: '输入镜筒的口径和焦距,或从列表中选择一个常见型号。' },
61
+ { name: '2. 添加您的目镜', text: '输入目镜的焦距和表观视野以比较它们的性能。' },
62
+ { name: '3. 模拟视野', text: '选择一个天体(月球、土星等)并点击目镜,查看图像如何变化以及是否在光学极限之内。' },
63
+ ];
64
+
65
+ const seo: EyepieceCalculatorLocaleContent['seo'] = [
66
+ {
67
+ type: 'summary',
68
+ title: '选择理想目镜的关键因素',
69
+ items: [
70
+ '实际最大放大倍数:口径(毫米)的 2 倍(但受视宁度限制,通常为 200-250x)。',
71
+ '最小有效放大倍数:口径除以 7(人类瞳孔的极限)。',
72
+ '最佳范围:出瞳直径在 0.5mm 到 7mm 之间。',
73
+ ],
74
+ },
75
+ { type: 'title', text: '如何为您的望远镜选择目镜:实用指南', level: 2 },
76
+ {
77
+ type: 'paragraph',
78
+ html: '不要凭直觉购买目镜。良好观测的关键在于平衡望远镜的分辨率与人眼的生理极限。选择不当的目镜即使让世界上最好的望远镜也可能看起来模糊或太暗。',
79
+ },
80
+ { type: 'title', text: '1. 放大倍数的计算 (M)', level: 3 },
81
+ {
82
+ type: 'paragraph',
83
+ html: '公式很简单:将望远镜焦距除以目镜焦距。 <br/><strong>公式:</strong> 望远镜焦距 / 目镜焦距 = 放大倍数。 <br/>例子:一个 1000mm 焦距的望远镜搭配 10mm 目镜,放大倍数为 100x。',
84
+ },
85
+ { type: 'title', text: '2. 最大放大倍数的迷思', level: 3 },
86
+ {
87
+ type: 'paragraph',
88
+ html: '实际极限不是由目镜决定的,而是由望远镜的口径(直径)决定的。 <br/>- <strong>理论极限:</strong> 口径(毫米)的 2 倍。 <br/>- <strong>实际极限(平均视宁度):</strong> 无论使用何种望远镜,由于大气湍流的影响,放大倍数很少能超过 200x - 250x。强行提高放大倍数只会得到一个放大的模糊光斑。',
89
+ },
90
+ { type: 'title', text: '3. 出瞳直径:亮度因素', level: 3 },
91
+ {
92
+ type: 'paragraph',
93
+ html: '出瞳直径是从目镜射向你眼睛的光束。 <br/>- <strong>如果大于 7mm:</strong> 你的眼睛无法张开那么大;你会损失光线,字面上就是在浪费钱。 <br/>- <strong>如果小于 0.5mm:</strong> 图像会变得非常暗,以至于你几乎看不到细节,并会开始看到自己眼中的“浮游物”。',
94
+ },
95
+ {
96
+ type: 'table',
97
+ headers: ['观测对象', '推荐放大倍数', '理想出瞳', '视觉体验'],
98
+ rows: [
99
+ ['星系与星云', '低倍 (25x - 50x)', '5mm - 7mm', '图像明亮,视野最大化。'],
100
+ ['星团', '中倍 (80x - 120x)', '2mm', '恒星呈点状,背景天空黑暗。'],
101
+ ['行星与月球', '高倍 (150x 或更高)', '0.7mm - 1mm', '细节最清晰,图像更小且更暗。'],
102
+ ],
103
+ },
104
+ {
105
+ type: 'diagnostic',
106
+ variant: 'warning',
107
+ title: '目视观测还是天体摄影?',
108
+ icon: 'mdi:camera-off',
109
+ badge: '技术提示',
110
+ html: '至关重要的是要明确这些计算仅适用于 <strong>目视观测</strong>。许多初学者试图将这些放大倍数应用于天文相机,结果感到沮丧;在摄影中,计算取决于像素大小和角秒分辨率,而不是目镜。',
111
+ },
112
+ {
113
+ type: 'diagnostic',
114
+ variant: 'info',
115
+ title: '大气视宁度的影响',
116
+ icon: 'mdi:weather-windy',
117
+ badge: '观测技巧',
118
+ html: '即使拥有顶级的目镜,如果大气层不稳定(星光闪烁剧烈),高倍观测的效果也会大打折扣。这种现象被称为“视宁度”。在观测行星时,建议先从低倍率开始,观察图像的垂直稳定性。如果图像像是在水底一样晃动,那么降低倍率反而能看到更多细节。在大多数城市环境下,150x 到 200x 是最实用的上限。',
119
+ },
120
+ ];
121
+
122
+ const faqSchema: WithContext<FAQPage> = {
123
+ '@context': 'https://schema.org',
124
+ '@type': 'FAQPage',
125
+ mainEntity: faq.map((item) => ({
126
+ '@type': 'Question',
127
+ name: item.question,
128
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
129
+ })),
130
+ };
131
+
132
+ const howToSchema: WithContext<HowTo> = {
133
+ '@context': 'https://schema.org',
134
+ '@type': 'HowTo',
135
+ name: title,
136
+ description,
137
+ step: howTo.map((step) => ({
138
+ '@type': 'HowToStep',
139
+ name: step.name,
140
+ text: step.text,
141
+ })),
142
+ };
143
+
144
+ const appSchema: WithContext<SoftwareApplication> = {
145
+ '@context': 'https://schema.org',
146
+ '@type': 'SoftwareApplication',
147
+ name: title,
148
+ description,
149
+ applicationCategory: 'UtilitiesApplication',
150
+ operatingSystem: 'Web',
151
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'CNY' },
152
+ inLanguage: 'zh',
153
+ };
154
+
155
+ export const content: EyepieceCalculatorLocaleContent = {
156
+ slug: 'smart-eyepiece-calculator',
157
+ title,
158
+ description,
159
+ ui,
160
+ faq,
161
+ howTo,
162
+ seo,
163
+ bibliography,
164
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
165
+ };
@@ -0,0 +1,13 @@
1
+ import type { ToolDefinition } from '../../types';
2
+ import { eyepieceCalculator } from './entry';
3
+
4
+ export * from './entry';
5
+
6
+ export const EYEPIECE_CALCULATOR_TOOL: ToolDefinition = {
7
+ entry: eyepieceCalculator,
8
+ Component: () => import('./component.astro'),
9
+ SEOComponent: () => import('./seo.astro'),
10
+ BibliographyComponent: () => import('./bibliography.astro'),
11
+ };
12
+
13
+ export { EYEPIECE_CALCULATOR_TOOL as smartEyepieceCalculator };
@@ -0,0 +1,67 @@
1
+ export interface EyepieceStats {
2
+ magnification: number;
3
+ trueFieldOfView: number;
4
+ exitPupil: number;
5
+ }
6
+
7
+ export interface TelescopeLimits {
8
+ maxMagnification: number;
9
+ minMagnification: number;
10
+ }
11
+
12
+ export interface EyepieceStatus {
13
+ state: 'perfect' | 'warning' | 'danger';
14
+ reason?: 'lowMag' | 'highMag' | 'highPupil' | 'lowPupil';
15
+ }
16
+
17
+ export function calculateEyepieceStats(
18
+ telescopeFocal: number,
19
+ eyepieceFocal: number,
20
+ eyepieceAfov: number
21
+ ): EyepieceStats {
22
+ if (!telescopeFocal || !eyepieceFocal || eyepieceFocal <= 0) {
23
+ return { magnification: 0, trueFieldOfView: 0, exitPupil: 0 };
24
+ }
25
+
26
+ const magnification = telescopeFocal / eyepieceFocal;
27
+ const trueFieldOfView = eyepieceAfov / magnification;
28
+
29
+ return {
30
+ magnification,
31
+ trueFieldOfView,
32
+ exitPupil: 0,
33
+ };
34
+ }
35
+
36
+ export function calculateExitPupil(eyepieceFocal: number, focalRatio: number): number {
37
+ if (!focalRatio || focalRatio <= 0 || !eyepieceFocal) return 0;
38
+ return eyepieceFocal / focalRatio;
39
+ }
40
+
41
+ export function getTelescopeLimits(apertureMm: number): TelescopeLimits {
42
+ if (!apertureMm || apertureMm <= 0) {
43
+ return { maxMagnification: 0, minMagnification: 0 };
44
+ }
45
+ return {
46
+ maxMagnification: apertureMm * 2,
47
+ minMagnification: apertureMm / 7,
48
+ };
49
+ }
50
+
51
+ export function analyzeEyepiece(stats: EyepieceStats, limits: TelescopeLimits, exitPupil: number): EyepieceStatus {
52
+ if (exitPupil > 7.0) {
53
+ return { state: 'danger', reason: 'highPupil' };
54
+ }
55
+ if (stats.magnification > limits.maxMagnification * 1.2) {
56
+ return { state: 'danger', reason: 'highMag' };
57
+ }
58
+
59
+ if (stats.magnification > limits.maxMagnification * 0.8 || exitPupil < 0.5) {
60
+ return { state: 'warning', reason: 'highMag' };
61
+ }
62
+ if (stats.magnification < limits.minMagnification || exitPupil > 6.0) {
63
+ return { state: 'warning', reason: 'lowMag' };
64
+ }
65
+
66
+ return { state: 'perfect' };
67
+ }
@@ -0,0 +1,15 @@
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { smartEyepieceCalculator } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'es' } = Astro.props;
11
+ const content = await smartEyepieceCalculator.entry.i18n[locale]?.();
12
+ if (!content) return null;
13
+ ---
14
+
15
+ <SEORenderer content={{ locale, sections: content.seo }} />