@jjlmoya/utils-astronomy 1.16.0 → 1.17.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 (105) 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_validation.test.ts +4 -3
  8. package/src/tool/bortleVisualizer/bibliography.ts +8 -0
  9. package/src/tool/bortleVisualizer/entry.ts +2 -0
  10. package/src/tool/bortleVisualizer/i18n/de.ts +1 -9
  11. package/src/tool/bortleVisualizer/i18n/en.ts +1 -9
  12. package/src/tool/bortleVisualizer/i18n/es.ts +1 -9
  13. package/src/tool/bortleVisualizer/i18n/fr.ts +1 -9
  14. package/src/tool/bortleVisualizer/i18n/id.ts +1 -9
  15. package/src/tool/bortleVisualizer/i18n/it.ts +1 -9
  16. package/src/tool/bortleVisualizer/i18n/ja.ts +1 -9
  17. package/src/tool/bortleVisualizer/i18n/ko.ts +1 -9
  18. package/src/tool/bortleVisualizer/i18n/nl.ts +1 -9
  19. package/src/tool/bortleVisualizer/i18n/pl.ts +1 -9
  20. package/src/tool/bortleVisualizer/i18n/pt.ts +1 -9
  21. package/src/tool/bortleVisualizer/i18n/ru.ts +1 -9
  22. package/src/tool/bortleVisualizer/i18n/sv.ts +1 -9
  23. package/src/tool/bortleVisualizer/i18n/tr.ts +1 -9
  24. package/src/tool/bortleVisualizer/i18n/zh.ts +1 -9
  25. package/src/tool/bortleVisualizer/seo.astro +2 -48
  26. package/src/tool/deepSpaceScope/bibliography.ts +6 -0
  27. package/src/tool/deepSpaceScope/entry.ts +2 -0
  28. package/src/tool/deepSpaceScope/i18n/de.ts +1 -7
  29. package/src/tool/deepSpaceScope/i18n/en.ts +1 -7
  30. package/src/tool/deepSpaceScope/i18n/es.ts +1 -7
  31. package/src/tool/deepSpaceScope/i18n/fr.ts +1 -7
  32. package/src/tool/deepSpaceScope/i18n/id.ts +1 -7
  33. package/src/tool/deepSpaceScope/i18n/it.ts +1 -7
  34. package/src/tool/deepSpaceScope/i18n/ja.ts +1 -7
  35. package/src/tool/deepSpaceScope/i18n/ko.ts +1 -7
  36. package/src/tool/deepSpaceScope/i18n/nl.ts +1 -7
  37. package/src/tool/deepSpaceScope/i18n/pl.ts +1 -7
  38. package/src/tool/deepSpaceScope/i18n/pt.ts +1 -7
  39. package/src/tool/deepSpaceScope/i18n/ru.ts +1 -7
  40. package/src/tool/deepSpaceScope/i18n/sv.ts +1 -7
  41. package/src/tool/deepSpaceScope/i18n/tr.ts +1 -7
  42. package/src/tool/deepSpaceScope/i18n/zh.ts +1 -7
  43. package/src/tool/deepSpaceScope/seo.astro +2 -48
  44. package/src/tool/smartEyepieceCalculator/app.ts +327 -0
  45. package/src/tool/smartEyepieceCalculator/bibliography.astro +14 -0
  46. package/src/tool/smartEyepieceCalculator/bibliography.ts +6 -0
  47. package/src/tool/smartEyepieceCalculator/component.astro +125 -0
  48. package/src/tool/smartEyepieceCalculator/entry.ts +67 -0
  49. package/src/tool/smartEyepieceCalculator/i18n/de.ts +165 -0
  50. package/src/tool/smartEyepieceCalculator/i18n/en.ts +165 -0
  51. package/src/tool/smartEyepieceCalculator/i18n/es.ts +165 -0
  52. package/src/tool/smartEyepieceCalculator/i18n/fr.ts +165 -0
  53. package/src/tool/smartEyepieceCalculator/i18n/id.ts +165 -0
  54. package/src/tool/smartEyepieceCalculator/i18n/it.ts +165 -0
  55. package/src/tool/smartEyepieceCalculator/i18n/ja.ts +165 -0
  56. package/src/tool/smartEyepieceCalculator/i18n/ko.ts +165 -0
  57. package/src/tool/smartEyepieceCalculator/i18n/nl.ts +165 -0
  58. package/src/tool/smartEyepieceCalculator/i18n/pl.ts +165 -0
  59. package/src/tool/smartEyepieceCalculator/i18n/pt.ts +165 -0
  60. package/src/tool/smartEyepieceCalculator/i18n/ru.ts +165 -0
  61. package/src/tool/smartEyepieceCalculator/i18n/sv.ts +165 -0
  62. package/src/tool/smartEyepieceCalculator/i18n/tr.ts +165 -0
  63. package/src/tool/smartEyepieceCalculator/i18n/zh.ts +165 -0
  64. package/src/tool/smartEyepieceCalculator/index.ts +16 -0
  65. package/src/tool/smartEyepieceCalculator/logic.ts +67 -0
  66. package/src/tool/smartEyepieceCalculator/seo.astro +15 -0
  67. package/src/tool/smartEyepieceCalculator/smart-eyepiece-calculator.css +393 -0
  68. package/src/tool/starExposureCalculator/bibliography.ts +7 -0
  69. package/src/tool/starExposureCalculator/entry.ts +2 -0
  70. package/src/tool/starExposureCalculator/i18n/de.ts +1 -8
  71. package/src/tool/starExposureCalculator/i18n/en.ts +1 -8
  72. package/src/tool/starExposureCalculator/i18n/es.ts +1 -8
  73. package/src/tool/starExposureCalculator/i18n/fr.ts +1 -8
  74. package/src/tool/starExposureCalculator/i18n/id.ts +1 -8
  75. package/src/tool/starExposureCalculator/i18n/it.ts +1 -8
  76. package/src/tool/starExposureCalculator/i18n/ja.ts +1 -8
  77. package/src/tool/starExposureCalculator/i18n/ko.ts +1 -8
  78. package/src/tool/starExposureCalculator/i18n/nl.ts +1 -8
  79. package/src/tool/starExposureCalculator/i18n/pl.ts +1 -8
  80. package/src/tool/starExposureCalculator/i18n/pt.ts +1 -8
  81. package/src/tool/starExposureCalculator/i18n/ru.ts +1 -8
  82. package/src/tool/starExposureCalculator/i18n/sv.ts +1 -8
  83. package/src/tool/starExposureCalculator/i18n/tr.ts +1 -8
  84. package/src/tool/starExposureCalculator/i18n/zh.ts +1 -8
  85. package/src/tool/starExposureCalculator/seo.astro +2 -48
  86. package/src/tool/telescopeResolution/bibliography.ts +7 -0
  87. package/src/tool/telescopeResolution/entry.ts +2 -0
  88. package/src/tool/telescopeResolution/i18n/de.ts +1 -8
  89. package/src/tool/telescopeResolution/i18n/en.ts +1 -8
  90. package/src/tool/telescopeResolution/i18n/es.ts +1 -8
  91. package/src/tool/telescopeResolution/i18n/fr.ts +1 -8
  92. package/src/tool/telescopeResolution/i18n/id.ts +1 -8
  93. package/src/tool/telescopeResolution/i18n/it.ts +1 -8
  94. package/src/tool/telescopeResolution/i18n/ja.ts +1 -8
  95. package/src/tool/telescopeResolution/i18n/ko.ts +1 -8
  96. package/src/tool/telescopeResolution/i18n/nl.ts +1 -8
  97. package/src/tool/telescopeResolution/i18n/pl.ts +1 -8
  98. package/src/tool/telescopeResolution/i18n/pt.ts +1 -8
  99. package/src/tool/telescopeResolution/i18n/ru.ts +1 -8
  100. package/src/tool/telescopeResolution/i18n/sv.ts +1 -8
  101. package/src/tool/telescopeResolution/i18n/tr.ts +1 -8
  102. package/src/tool/telescopeResolution/i18n/zh.ts +1 -8
  103. package/src/tool/telescopeResolution/seo.astro +2 -48
  104. package/src/tools.ts +3 -0
  105. package/src/types.ts +1 -5
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlmoya/utils-astronomy",
3
- "version": "1.16.0",
3
+ "version": "1.17.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -3,10 +3,11 @@ import { bortleVisualizer } from '../tool/bortleVisualizer/entry';
3
3
  import { deepSpaceScope } from '../tool/deepSpaceScope/entry';
4
4
  import { starExposureCalculator } from '../tool/starExposureCalculator/entry';
5
5
  import { telescopeResolution } from '../tool/telescopeResolution/entry';
6
+ import { eyepieceCalculator } from '../tool/smartEyepieceCalculator/entry';
6
7
 
7
8
  export const toolsCategory: AstronomyCategoryEntry = {
8
9
  icon: 'mdi:telescope',
9
- tools: [bortleVisualizer, deepSpaceScope, starExposureCalculator, telescopeResolution],
10
+ tools: [bortleVisualizer, deepSpaceScope, starExposureCalculator, telescopeResolution, eyepieceCalculator],
10
11
  i18n: {
11
12
  de: () => import('./i18n/de').then((m) => m.content),
12
13
  en: () => import('./i18n/en').then((m) => m.content),
package/src/data.ts CHANGED
@@ -2,12 +2,14 @@ export { bortleVisualizer } from './tool/bortleVisualizer';
2
2
  export { deepSpaceScope } from './tool/deepSpaceScope';
3
3
  export { starExposureCalculator } from './tool/starExposureCalculator';
4
4
  export { telescopeResolution } from './tool/telescopeResolution';
5
+ export { EYEPIECE_CALCULATOR_TOOL as eyepieceCalculator } from './tool/smartEyepieceCalculator';
5
6
  export { toolsCategory as astronomyCategory } from './category';
6
7
 
7
8
  export type { BortleVisualizerUI, BortleVisualizerLocaleContent } from './tool/bortleVisualizer';
8
9
  export type { DeepSpaceScopeUI, DeepSpaceScopeLocaleContent } from './tool/deepSpaceScope';
9
10
  export type { StarExposureCalculatorUI, StarExposureCalculatorLocaleContent } from './tool/starExposureCalculator';
10
11
  export type { TelescopeResolutionUI, TelescopeResolutionLocaleContent } from './tool/telescopeResolution';
12
+ export type { EyepieceCalculatorUI, EyepieceCalculatorLocaleContent } from './tool/smartEyepieceCalculator/entry';
11
13
 
12
14
  export type {
13
15
  KnownLocale,
package/src/entries.ts CHANGED
@@ -6,9 +6,12 @@ export { starExposureCalculator } from './tool/starExposureCalculator/entry';
6
6
  export type { StarExposureCalculatorUI, StarExposureCalculatorLocaleContent } from './tool/starExposureCalculator/entry';
7
7
  export { telescopeResolution } from './tool/telescopeResolution/entry';
8
8
  export type { TelescopeResolutionUI, TelescopeResolutionLocaleContent } from './tool/telescopeResolution/entry';
9
+ export { eyepieceCalculator } from './tool/smartEyepieceCalculator/entry';
10
+ export type { EyepieceCalculatorUI, EyepieceCalculatorLocaleContent } from './tool/smartEyepieceCalculator/entry';
9
11
  export { toolsCategory, astronomyCategory } from './category';
10
12
  import { bortleVisualizer } from './tool/bortleVisualizer/entry';
11
13
  import { deepSpaceScope } from './tool/deepSpaceScope/entry';
12
14
  import { starExposureCalculator } from './tool/starExposureCalculator/entry';
13
15
  import { telescopeResolution } from './tool/telescopeResolution/entry';
14
- export const ALL_ENTRIES = [bortleVisualizer, deepSpaceScope, starExposureCalculator, telescopeResolution];
16
+ import { eyepieceCalculator } from './tool/smartEyepieceCalculator/entry';
17
+ export const ALL_ENTRIES = [bortleVisualizer, deepSpaceScope, starExposureCalculator, telescopeResolution, eyepieceCalculator];
@@ -34,18 +34,28 @@ export async function getStaticPaths() {
34
34
  ]),
35
35
  ) as Partial<Record<KnownLocale, string>>;
36
36
 
37
+ const firstLoader = entry.i18n.en ?? Object.values(entry.i18n)[0];
38
+ const englishSlug = firstLoader ? (await firstLoader()).slug : entry.id;
39
+
37
40
  for (const { locale, content } of localeContents) {
38
- const allToolsNav = await Promise.all(
39
- ALL_TOOLS.map(async ({ entry: navEntry }) => ({
40
- id: navEntry.id,
41
- title: (await navEntry.i18n[locale]!()).title,
42
- href: `/${locale}/${(await navEntry.i18n[locale]!()).slug}`,
43
- isActive: navEntry.id === entry.id,
44
- })),
45
- );
41
+ const allToolsNav = (
42
+ await Promise.all(
43
+ ALL_TOOLS.map(async ({ entry: navEntry }) => {
44
+ const loader = navEntry.i18n[locale] ?? navEntry.i18n.en;
45
+ if (!loader) return null;
46
+ const navContent = await loader();
47
+ return {
48
+ id: navEntry.id,
49
+ title: navContent.title,
50
+ href: `/${locale}/${navContent.slug}`,
51
+ isActive: navEntry.id === entry.id,
52
+ };
53
+ }),
54
+ )
55
+ ).filter(Boolean) as NavItem[];
46
56
  paths.push({
47
57
  params: { locale, slug: content.slug },
48
- props: { Component, locale, content, localeUrls, allToolsNav },
58
+ props: { Component, locale, content, localeUrls, allToolsNav, englishSlug },
49
59
  });
50
60
  }
51
61
  }
@@ -66,11 +76,16 @@ interface Props {
66
76
  content: ToolLocaleContent;
67
77
  localeUrls: Partial<Record<KnownLocale, string>>;
68
78
  allToolsNav: NavItem[];
79
+ englishSlug: string;
69
80
  }
70
81
 
71
- const { Component, locale, content, localeUrls, allToolsNav } = Astro.props;
82
+ const { Component, locale, content, localeUrls, allToolsNav, englishSlug } = Astro.props;
83
+
84
+ const cssFiles = import.meta.glob('../../tool/*/*.css', { query: '?raw', import: 'default' });
85
+ const cssKey = Object.keys(cssFiles).find((k) => k.endsWith(`/${englishSlug}.css`));
86
+ const toolCss = cssKey ? await cssFiles[cssKey]() as string : '';
72
87
 
73
- const seoContent: UtilitySEOContent = { locale, sections: content.seo };
88
+ const seoContent: UtilitySEOContent = { locale, sections: content.seo ?? [] };
74
89
 
75
90
  const words = content.title.split(" ");
76
91
  const titleHighlight = words[0] || "";
@@ -89,8 +104,9 @@ const titleBase = words.slice(1).join(" ") || "";
89
104
  tools={allToolsNav}
90
105
  />
91
106
  <Fragment slot="head">
107
+ <Fragment set:html={toolCss ? `<style>${toolCss}</style>` : ''} />
92
108
  {
93
- content.schemas.map((schema) => (
109
+ (content.schemas ?? []).map((schema) => (
94
110
  <script
95
111
  is:inline
96
112
  type="application/ld+json"
@@ -116,11 +132,11 @@ const titleBase = words.slice(1).join(" ") || "";
116
132
  </section>
117
133
 
118
134
  <section class="section-faq">
119
- <FAQSection items={content.faq} title={content.faqTitle} inLanguage={locale} />
135
+ <FAQSection items={content.faq} />
120
136
  </section>
121
137
 
122
138
  <section class="section-bibliography">
123
- <Bibliography links={content.bibliography} title={content.bibliographyTitle} />
139
+ <Bibliography links={content.bibliography} />
124
140
  </section>
125
141
  </div>
126
142
  </PreviewLayout>
@@ -1,42 +1,9 @@
1
1
  import { describe, it, expect } from 'vitest';
2
2
  import { ALL_TOOLS } from '../tools';
3
- import type { ToolLocaleContent } from '../types';
4
3
 
5
4
  describe('Locale Completeness Validation', () => {
6
- ALL_TOOLS.forEach((tool) => {
7
- describe(`Tool: ${tool.entry.id}`, () => {
8
- Object.keys(tool.entry.i18n).forEach((locale) => {
9
- describe(`Locale: ${locale}`, () => {
10
- it('faqTitle should be defined when faq items exist', async () => {
11
- const loader = tool.entry.i18n[locale as keyof typeof tool.entry.i18n];
12
- const content = (await loader?.()) as ToolLocaleContent;
13
-
14
- if (content.faq.length > 0) {
15
- expect(
16
- content.faqTitle,
17
- `Tool "${tool.entry.id}" locale "${locale}" has ${content.faq.length} FAQ items but is missing faqTitle`,
18
- ).toBeTruthy();
19
- }
20
- });
21
-
22
- it('bibliographyTitle should be defined when bibliography items exist', async () => {
23
- const loader = tool.entry.i18n[locale as keyof typeof tool.entry.i18n];
24
- const content = (await loader?.()) as ToolLocaleContent;
25
-
26
- if (content.bibliography.length > 0) {
27
- expect(
28
- content.bibliographyTitle,
29
- `Tool "${tool.entry.id}" locale "${locale}" has ${content.bibliography.length} bibliography items but is missing bibliographyTitle`,
30
- ).toBeTruthy();
31
- }
32
- });
33
- });
34
- });
35
- });
36
- });
37
-
38
5
  it('all 4 tools registered', () => {
39
- expect(ALL_TOOLS.length).toBe(4);
6
+ expect(ALL_TOOLS.length).toBe(5);
40
7
  });
41
8
  });
42
9
 
@@ -76,6 +76,7 @@ describe('Tool Validation Suite', () => {
76
76
  'alcance-telescopio',
77
77
  'calculadora-regla-500',
78
78
  'calculadora-resolucion-telescopio',
79
+ 'calculadora-oculares',
79
80
  ];
80
81
  expect(validSlugs).toContain(content.slug);
81
82
  }
@@ -101,12 +102,12 @@ describe('Tool Validation Suite', () => {
101
102
  });
102
103
 
103
104
  describe('Library Registration', () => {
104
- it('should have 4 tools in ALL_TOOLS', () => {
105
- expect(ALL_TOOLS.length).toBe(4);
105
+ it('should have 5 tools in ALL_TOOLS', () => {
106
+ expect(ALL_TOOLS.length).toBe(5);
106
107
  });
107
108
 
108
109
  it('should have all tools in astronomyCategory', () => {
109
- expect(astronomyCategory.tools.length).toBe(4);
110
+ expect(astronomyCategory.tools.length).toBe(5);
110
111
  ALL_TOOLS.forEach(({ entry }) => {
111
112
  const exists = astronomyCategory.tools.some((t: any) => t.id === entry.id);
112
113
  expect(exists).toBe(true);
@@ -0,0 +1,8 @@
1
+ import type { BibliographyEntry } from '../../types';
2
+
3
+ export const bibliography: BibliographyEntry[] = [
4
+ { name: 'Gauging Light Pollution: The Bortle Dark-Sky Scale', url: 'https://skyandtelescope.org/astronomy-resources/light-pollution-and-astronomy-the-bortle-dark-sky-scale/' },
5
+ { name: 'Light pollution map', url: 'https://www.lightpollutionmap.info/' },
6
+ { name: 'International Dark-Sky Association', url: 'https://www.darksky.org/' },
7
+ { name: 'Globe at Night', url: 'https://www.globeatnight.org/' },
8
+ ];
@@ -51,3 +51,5 @@ export const bortleVisualizer: AstronomyToolEntry<BortleVisualizerUI> = {
51
51
  zh: () => import('./i18n/zh').then((m) => m.content),
52
52
  },
53
53
  };
54
+
55
+ export { bibliography } from './bibliography';
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { BortleVisualizerUI, BortleVisualizerLocaleContent } from '../index';
3
4
 
@@ -50,13 +51,6 @@ const howTo: BortleVisualizerLocaleContent['howTo'] = [
50
51
  { name: '3. Die eigene Stufe bestimmen', text: 'Vergleichen Sie den Anblick von Ihrem gewöhnlichen Beobachtungsort mit den Simulationen, um Ihre lokale Bortle-Stufe zu identifizieren.' },
51
52
  ];
52
53
 
53
- const bibliography: BortleVisualizerLocaleContent['bibliography'] = [
54
- { name: 'Originaler Bortle-Artikel (Sky & Telescope, 2001)', url: 'https://skyandtelescope.org/astronomy-resources/light-pollution-and-astronomy-the-bortle-dark-sky-scale/' },
55
- { name: 'Lichtverschmutzungskarte - Weltkarte', url: 'https://www.lightpollutionmap.info/' },
56
- { name: 'International Dark-Sky Association', url: 'https://www.darksky.org/' },
57
- { name: 'Globe at Night - Bürgerwissenschaft', url: 'https://www.globeatnight.org/' },
58
- ];
59
-
60
54
  const seo: BortleVisualizerLocaleContent['seo'] = [
61
55
  {
62
56
  type: 'summary',
@@ -158,9 +152,7 @@ export const content: BortleVisualizerLocaleContent = {
158
152
  ui,
159
153
  seo,
160
154
  faq,
161
- faqTitle: 'Häufig gestellte Fragen (FAQ)',
162
155
  bibliography,
163
- bibliographyTitle: 'Bibliographische Referenzen',
164
156
  howTo,
165
157
  bortleData: ui.bortleData,
166
158
  schemas: [faqSchema as any, howToSchema as any, appSchema],
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { BortleVisualizerUI, BortleVisualizerLocaleContent } from '../index';
3
4
 
@@ -50,13 +51,6 @@ const howTo: BortleVisualizerLocaleContent['howTo'] = [
50
51
  { name: '3. Identify your current level', text: 'Compare what you see from your usual observing spot with the simulations to identify your local Bortle level.' },
51
52
  ];
52
53
 
53
- const bibliography: BortleVisualizerLocaleContent['bibliography'] = [
54
- { name: 'Original Bortle Article (Sky & Telescope, 2001)', url: 'https://skyandtelescope.org/astronomy-resources/light-pollution-and-astronomy-the-bortle-dark-sky-scale/' },
55
- { name: 'Light Pollution Map - World Map', url: 'https://www.lightpollutionmap.info/' },
56
- { name: 'International Dark-Sky Association', url: 'https://www.darksky.org/' },
57
- { name: 'Globe at Night - Citizen Science', url: 'https://www.globeatnight.org/' },
58
- ];
59
-
60
54
  const seo: BortleVisualizerLocaleContent['seo'] = [
61
55
  {
62
56
  type: 'summary',
@@ -158,9 +152,7 @@ export const content: BortleVisualizerLocaleContent = {
158
152
  ui,
159
153
  seo,
160
154
  faq,
161
- faqTitle: 'Frequently Asked Questions',
162
155
  bibliography,
163
- bibliographyTitle: 'Bibliographic References',
164
156
  howTo,
165
157
  bortleData: ui.bortleData,
166
158
  schemas: [faqSchema as any, howToSchema as any, appSchema],
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { BortleVisualizerUI, BortleVisualizerLocaleContent } from '../index';
3
4
 
@@ -50,13 +51,6 @@ const howTo: BortleVisualizerLocaleContent['howTo'] = [
50
51
  { name: '3. Identifica tu nivel actual', text: 'Compara lo que ves desde tu lugar habitual de observación con las simulaciones para identificar tu Bortle local.' },
51
52
  ];
52
53
 
53
- const bibliography: BortleVisualizerLocaleContent['bibliography'] = [
54
- { name: 'Artículo Original de John E. Bortle (Sky & Telescope, 2001)', url: 'https://skyandtelescope.org/astronomy-resources/light-pollution-and-astronomy-the-bortle-dark-sky-scale/' },
55
- { name: 'Light Pollution Map - Mapa Mundial', url: 'https://www.lightpollutionmap.info/' },
56
- { name: 'Fundación Starlight - Reservas de Cielo Oscuro', url: 'https://fundacionstarlight.org/' },
57
- { name: 'International Dark-Sky Association', url: 'https://www.darksky.org/' },
58
- ];
59
-
60
54
  const seo: BortleVisualizerLocaleContent['seo'] = [
61
55
  {
62
56
  type: 'summary',
@@ -166,9 +160,7 @@ export const content: BortleVisualizerLocaleContent = {
166
160
  ui,
167
161
  seo,
168
162
  faq,
169
- faqTitle: 'Preguntas Frecuentes',
170
163
  bibliography,
171
- bibliographyTitle: 'Referencias Bibliográficas',
172
164
  howTo,
173
165
  bortleData: ui.bortleData,
174
166
  schemas: [faqSchema as any, howToSchema as any, appSchema],
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { BortleVisualizerUI, BortleVisualizerLocaleContent } from '../index';
3
4
 
@@ -50,13 +51,6 @@ const howTo: BortleVisualizerLocaleContent['howTo'] = [
50
51
  { name: '3. Identifiez votre niveau actuel', text: 'Comparez ce que vous voyez depuis votre lieu d\'observation habituel avec les simulations pour identifier votre niveau de Bortle local.' },
51
52
  ];
52
53
 
53
- const bibliography: BortleVisualizerLocaleContent['bibliography'] = [
54
- { name: 'Article Original de John E. Bortle (Sky & Telescope, 2001)', url: 'https://skyandtelescope.org/astronomy-resources/light-pollution-and-astronomy-the-bortle-dark-sky-scale/' },
55
- { name: 'Carte de Pollution Lumineuse Mondiale', url: 'https://www.lightpollutionmap.info/' },
56
- { name: 'Association Internationale Ciel Sombre (IDA)', url: 'https://www.darksky.org/' },
57
- { name: 'Globe at Night - Science Citoyenne', url: 'https://www.globeatnight.org/' },
58
- ];
59
-
60
54
  const seo: BortleVisualizerLocaleContent['seo'] = [
61
55
  {
62
56
  type: 'summary',
@@ -157,9 +151,7 @@ export const content: BortleVisualizerLocaleContent = {
157
151
  ui,
158
152
  seo,
159
153
  faq,
160
- faqTitle: 'Questions Fréquentes',
161
154
  bibliography,
162
- bibliographyTitle: 'Références Bibliographiques',
163
155
  howTo,
164
156
  bortleData: ui.bortleData,
165
157
  schemas: [faqSchema as any, howToSchema as any, appSchema],
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { BortleVisualizerUI, BortleVisualizerLocaleContent } from '../index';
3
4
 
@@ -50,13 +51,6 @@ const howTo: BortleVisualizerLocaleContent['howTo'] = [
50
51
  { name: '3. Identifikasi level Anda saat ini', text: 'Bandingkan apa yang Anda lihat dari tempat pengamatan biasa dengan simulasi kami untuk menentukan level Bortle lokal Anda.' },
51
52
  ];
52
53
 
53
- const bibliography: BortleVisualizerLocaleContent['bibliography'] = [
54
- { name: 'Artikel Asli Bortle (Sky & Telescope, 2001)', url: 'https://skyandtelescope.org/astronomy-resources/light-pollution-and-astronomy-the-bortle-dark-sky-scale/' },
55
- { name: 'Peta Polusi Cahaya Dunia', url: 'https://www.lightpollutionmap.info/' },
56
- { name: 'International Dark-Sky Association', url: 'https://www.darksky.org/' },
57
- { name: 'Globe at Night - Sains Warga', url: 'https://www.globeatnight.org/' },
58
- ];
59
-
60
54
  const seo: BortleVisualizerLocaleContent['seo'] = [
61
55
  {
62
56
  type: 'summary',
@@ -158,9 +152,7 @@ export const content: BortleVisualizerLocaleContent = {
158
152
  ui,
159
153
  seo,
160
154
  faq,
161
- faqTitle: 'Pertanyaan yang Sering Diajukan',
162
155
  bibliography,
163
- bibliographyTitle: 'Referensi Bibliografi',
164
156
  howTo,
165
157
  bortleData: ui.bortleData,
166
158
  schemas: [faqSchema as any, howToSchema as any, appSchema],
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { BortleVisualizerUI, BortleVisualizerLocaleContent } from '../index';
3
4
 
@@ -50,13 +51,6 @@ const howTo: BortleVisualizerLocaleContent['howTo'] = [
50
51
  { name: '3. Identifica il tuo livello attuale', text: 'Confronta ciò che vedi dal tuo solito punto di osservazione con le simulazioni per identificare il tuo livello Bortle locale.' },
51
52
  ];
52
53
 
53
- const bibliography: BortleVisualizerLocaleContent['bibliography'] = [
54
- { name: 'Articolo originale di Bortle (Sky & Telescope, 2001)', url: 'https://skyandtelescope.org/astronomy-resources/light-pollution-and-astronomy-the-bortle-dark-sky-scale/' },
55
- { name: 'Mappa dell\'inquinamento luminoso - Mappa mondiale', url: 'https://www.lightpollutionmap.info/' },
56
- { name: 'International Dark-Sky Association', url: 'https://www.darksky.org/' },
57
- { name: 'Globe at Night - Scienza dei cittadini', url: 'https://www.globeatnight.org/' },
58
- ];
59
-
60
54
  const seo: BortleVisualizerLocaleContent['seo'] = [
61
55
  {
62
56
  type: 'summary',
@@ -158,9 +152,7 @@ export const content: BortleVisualizerLocaleContent = {
158
152
  ui,
159
153
  seo,
160
154
  faq,
161
- faqTitle: 'Domande Frequenti',
162
155
  bibliography,
163
- bibliographyTitle: 'Riferimenti Bibliografici',
164
156
  howTo,
165
157
  bortleData: ui.bortleData,
166
158
  schemas: [faqSchema as any, howToSchema as any, appSchema],
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { BortleVisualizerUI, BortleVisualizerLocaleContent } from '../index';
3
4
 
@@ -50,13 +51,6 @@ const howTo: BortleVisualizerLocaleContent['howTo'] = [
50
51
  { name: '3. 現在のレベルを確認する', text: '普段の観測場所から見える景色とシミュレーションを比較して、現地のボートル・レベルを特定します。' },
51
52
  ];
52
53
 
53
- const bibliography: BortleVisualizerLocaleContent['bibliography'] = [
54
- { name: 'ボートル氏によるオリジナル記事(Sky & Telescope, 2001)', url: 'https://skyandtelescope.org/astronomy-resources/light-pollution-and-astronomy-the-bortle-dark-sky-scale/' },
55
- { name: '光害マップ - 世界地図', url: 'https://www.lightpollutionmap.info/' },
56
- { name: '国際ダークスカイ協会(IDA)', url: 'https://www.darksky.org/' },
57
- { name: 'Globe at Night - シチズンサイエンス', url: 'https://www.globeatnight.org/' },
58
- ];
59
-
60
54
  const seo: BortleVisualizerLocaleContent['seo'] = [
61
55
  {
62
56
  type: 'summary',
@@ -158,9 +152,7 @@ export const content: BortleVisualizerLocaleContent = {
158
152
  ui,
159
153
  seo,
160
154
  faq,
161
- faqTitle: 'よくある質問 (FAQ)',
162
155
  bibliography,
163
- bibliographyTitle: '参考文献',
164
156
  howTo,
165
157
  bortleData: ui.bortleData,
166
158
  schemas: [faqSchema as any, howToSchema as any, appSchema],
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { BortleVisualizerUI, BortleVisualizerLocaleContent } from '../index';
3
4
 
@@ -50,13 +51,6 @@ const howTo: BortleVisualizerLocaleContent['howTo'] = [
50
51
  { name: '3. 현재 등급 확인하기', text: '평소 관측 장소에서 보이는 모습과 시뮬레이션을 비교하여 현지의 보틀 등급을 파악해보세요.' },
51
52
  ];
52
53
 
53
- const bibliography: BortleVisualizerLocaleContent['bibliography'] = [
54
- { name: '보틀의 원본 기사 (Sky & Telescope, 2001)', url: 'https://skyandtelescope.org/astronomy-resources/light-pollution-and-astronomy-the-bortle-dark-sky-scale/' },
55
- { name: '빛 공해 지도 - 세계 지도', url: 'https://www.lightpollutionmap.info/' },
56
- { name: '국제 밤하늘 협회 (IDA)', url: 'https://www.darksky.org/' },
57
- { name: 'Globe at Night - 시민 과학 프로젝트', url: 'https://www.globeatnight.org/' },
58
- ];
59
-
60
54
  const seo: BortleVisualizerLocaleContent['seo'] = [
61
55
  {
62
56
  type: 'summary',
@@ -158,9 +152,7 @@ export const content: BortleVisualizerLocaleContent = {
158
152
  ui,
159
153
  seo,
160
154
  faq,
161
- faqTitle: '자주 묻는 질문 (FAQ)',
162
155
  bibliography,
163
- bibliographyTitle: '참고 문헌',
164
156
  howTo,
165
157
  bortleData: ui.bortleData,
166
158
  schemas: [faqSchema as any, howToSchema as any, appSchema],
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { BortleVisualizerUI, BortleVisualizerLocaleContent } from '../index';
3
4
 
@@ -50,13 +51,6 @@ const howTo: BortleVisualizerLocaleContent['howTo'] = [
50
51
  { name: '3. Bepaal je huidige niveau', text: 'Vergelijk wat je ziet vanaf je gebruikelijke observatieplek met de simulaties om je lokale Bortle-niveau te bepalen.' },
51
52
  ];
52
53
 
53
- const bibliography: BortleVisualizerLocaleContent['bibliography'] = [
54
- { name: 'Origineel Bortle Artikel (Sky & Telescope, 2001)', url: 'https://skyandtelescope.org/astronomy-resources/light-pollution-and-astronomy-the-bortle-dark-sky-scale/' },
55
- { name: 'Lichtvervuilingskaart - Wereldkaart', url: 'https://www.lightpollutionmap.info/' },
56
- { name: 'International Dark-Sky Association', url: 'https://www.darksky.org/' },
57
- { name: 'Globe at Night - Burgerwetenschap', url: 'https://www.globeatnight.org/' },
58
- ];
59
-
60
54
  const seo: BortleVisualizerLocaleContent['seo'] = [
61
55
  {
62
56
  type: 'summary',
@@ -158,9 +152,7 @@ export const content: BortleVisualizerLocaleContent = {
158
152
  ui,
159
153
  seo,
160
154
  faq,
161
- faqTitle: 'Veelgestelde Vragen',
162
155
  bibliography,
163
- bibliographyTitle: 'Bibliografische Referenties',
164
156
  howTo,
165
157
  bortleData: ui.bortleData,
166
158
  schemas: [faqSchema as any, howToSchema as any, appSchema],
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { BortleVisualizerUI, BortleVisualizerLocaleContent } from '../index';
3
4
 
@@ -50,13 +51,6 @@ const howTo: BortleVisualizerLocaleContent['howTo'] = [
50
51
  { name: '3. Określ swój obecny poziom', text: 'Porównaj to, co widzisz ze swojego zwykłego miejsca obserwacji, z symulacjami, aby zidentyfikować lokalny poziom skali Bortle’a.' },
51
52
  ];
52
53
 
53
- const bibliography: BortleVisualizerLocaleContent['bibliography'] = [
54
- { name: 'Oryginalny artykuł Bortle’a (Sky & Telescope, 2001)', url: 'https://skyandtelescope.org/astronomy-resources/light-pollution-and-astronomy-the-bortle-dark-sky-scale/' },
55
- { name: 'Light Pollution Map - Mapa świata', url: 'https://www.lightpollutionmap.info/' },
56
- { name: 'International Dark-Sky Association', url: 'https://www.darksky.org/' },
57
- { name: 'Globe at Night - Nauka obywatelska', url: 'https://www.globeatnight.org/' },
58
- ];
59
-
60
54
  const seo: BortleVisualizerLocaleContent['seo'] = [
61
55
  {
62
56
  type: 'summary',
@@ -158,9 +152,7 @@ export const content: BortleVisualizerLocaleContent = {
158
152
  ui,
159
153
  seo,
160
154
  faq,
161
- faqTitle: 'Często zadawane pytania',
162
155
  bibliography,
163
- bibliographyTitle: 'Bibliografia',
164
156
  howTo,
165
157
  bortleData: ui.bortleData,
166
158
  schemas: [faqSchema as any, howToSchema as any, appSchema],
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { BortleVisualizerUI, BortleVisualizerLocaleContent } from '../index';
3
4
 
@@ -50,13 +51,6 @@ const howTo: BortleVisualizerLocaleContent['howTo'] = [
50
51
  { name: '3. Identifique o seu nível atual', text: 'Compare o que vê do seu local de observação habitual com as simulações para identificar o seu nível de Bortle local.' },
51
52
  ];
52
53
 
53
- const bibliography: BortleVisualizerLocaleContent['bibliography'] = [
54
- { name: 'Artigo Original de Bortle (Sky & Telescope, 2001)', url: 'https://skyandtelescope.org/astronomy-resources/light-pollution-and-astronomy-the-bortle-dark-sky-scale/' },
55
- { name: 'Mapa de Poluição Luminosa - Mapa Mundial', url: 'https://www.lightpollutionmap.info/' },
56
- { name: 'International Dark-Sky Association', url: 'https://www.darksky.org/' },
57
- { name: 'Globe at Night - Ciência Cidadã', url: 'https://www.globeatnight.org/' },
58
- ];
59
-
60
54
  const seo: BortleVisualizerLocaleContent['seo'] = [
61
55
  {
62
56
  type: 'summary',
@@ -158,9 +152,7 @@ export const content: BortleVisualizerLocaleContent = {
158
152
  ui,
159
153
  seo,
160
154
  faq,
161
- faqTitle: 'Perguntas Frequentes',
162
155
  bibliography,
163
- bibliographyTitle: 'Referências Bibliográficas',
164
156
  howTo,
165
157
  bortleData: ui.bortleData,
166
158
  schemas: [faqSchema as any, howToSchema as any, appSchema],
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { BortleVisualizerUI, BortleVisualizerLocaleContent } from '../index';
3
4
 
@@ -50,13 +51,6 @@ const howTo: BortleVisualizerLocaleContent['howTo'] = [
50
51
  { name: '3. Определите свой уровень', text: 'Сравните вид неба в вашем обычном месте наблюдений с симуляцией, чтобы узнать ваш локальный уровень по шкале Бортля.' },
51
52
  ];
52
53
 
53
- const bibliography: BortleVisualizerLocaleContent['bibliography'] = [
54
- { name: 'Оригинальная статья Джона Бортля (Sky & Telescope, 2001)', url: 'https://skyandtelescope.org/astronomy-resources/light-pollution-and-astronomy-the-bortle-dark-sky-scale/' },
55
- { name: 'Карта светового загрязнения мира', url: 'https://www.lightpollutionmap.info/' },
56
- { name: 'Международная ассоциация темного неба (IDA)', url: 'https://www.darksky.org/' },
57
- { name: 'Проект Globe at Night - гражданская наука', url: 'https://www.globeatnight.org/' },
58
- ];
59
-
60
54
  const seo: BortleVisualizerLocaleContent['seo'] = [
61
55
  {
62
56
  type: 'summary',
@@ -158,9 +152,7 @@ export const content: BortleVisualizerLocaleContent = {
158
152
  ui,
159
153
  seo,
160
154
  faq,
161
- faqTitle: 'Часто задаваемые вопросы',
162
155
  bibliography,
163
- bibliographyTitle: 'Библиография',
164
156
  howTo,
165
157
  bortleData: ui.bortleData,
166
158
  schemas: [faqSchema as any, howToSchema as any, appSchema],
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { BortleVisualizerUI, BortleVisualizerLocaleContent } from '../index';
3
4
 
@@ -50,13 +51,6 @@ const howTo: BortleVisualizerLocaleContent['howTo'] = [
50
51
  { name: '3. Identifiera din nuvarande nivå', text: 'Jämför vad du ser från din vanliga observationsplats med simuleringarna för att identifiera din lokala Bortle-nivå.' },
51
52
  ];
52
53
 
53
- const bibliography: BortleVisualizerLocaleContent['bibliography'] = [
54
- { name: 'Originalartikel av Bortle (Sky & Telescope, 2001)', url: 'https://skyandtelescope.org/astronomy-resources/light-pollution-and-astronomy-the-bortle-dark-sky-scale/' },
55
- { name: 'Ljusföroreningskarta - Världskarta', url: 'https://www.lightpollutionmap.info/' },
56
- { name: 'International Dark-Sky Association', url: 'https://www.darksky.org/' },
57
- { name: 'Globe at Night - Medborgarforskning', url: 'https://www.globeatnight.org/' },
58
- ];
59
-
60
54
  const seo: BortleVisualizerLocaleContent['seo'] = [
61
55
  {
62
56
  type: 'summary',
@@ -158,9 +152,7 @@ export const content: BortleVisualizerLocaleContent = {
158
152
  ui,
159
153
  seo,
160
154
  faq,
161
- faqTitle: 'Vanliga frågor',
162
155
  bibliography,
163
- bibliographyTitle: 'Bibliografiska referenser',
164
156
  howTo,
165
157
  bortleData: ui.bortleData,
166
158
  schemas: [faqSchema as any, howToSchema as any, appSchema],
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { BortleVisualizerUI, BortleVisualizerLocaleContent } from '../index';
3
4
 
@@ -50,13 +51,6 @@ const howTo: BortleVisualizerLocaleContent['howTo'] = [
50
51
  { name: '3. Mevcut seviyenizi belirleyin', text: 'Yerel Bortle seviyenizi belirlemek için her zamanki gözlem noktanızdan gördüklerinizi simülasyonlarla karşılaştırın.' },
51
52
  ];
52
53
 
53
- const bibliography: BortleVisualizerLocaleContent['bibliography'] = [
54
- { name: 'Orijinal Bortle Makalesi (Sky & Telescope, 2001)', url: 'https://skyandtelescope.org/astronomy-resources/light-pollution-and-astronomy-the-bortle-dark-sky-scale/' },
55
- { name: 'Işık Kirliliği Haritası - Dünya Haritası', url: 'https://www.lightpollutionmap.info/' },
56
- { name: 'Uluslararası Karanlık Gökyüzü Birliği (IDA)', url: 'https://www.darksky.org/' },
57
- { name: 'Geceleyin Dünya (Globe at Night) - Vatandaş Bilimi', url: 'https://www.globeatnight.org/' },
58
- ];
59
-
60
54
  const seo: BortleVisualizerLocaleContent['seo'] = [
61
55
  {
62
56
  type: 'summary',
@@ -158,9 +152,7 @@ export const content: BortleVisualizerLocaleContent = {
158
152
  ui,
159
153
  seo,
160
154
  faq,
161
- faqTitle: 'Sıkça Sorulan Sorular',
162
155
  bibliography,
163
- bibliographyTitle: 'Bibliyografik Referanslar',
164
156
  howTo,
165
157
  bortleData: ui.bortleData,
166
158
  schemas: [faqSchema as any, howToSchema as any, appSchema],