@jjlmoya/utils-astronomy 1.18.0 → 1.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +5 -3
- package/src/category/i18n/de.ts +2 -2
- package/src/category/i18n/pl.ts +2 -2
- package/src/category/i18n/ru.ts +4 -4
- package/src/category/i18n/sv.ts +1 -1
- package/src/category/i18n/zh.ts +1 -1
- package/src/data.ts +0 -5
- package/src/layouts/PreviewLayout.astro +7 -2
- package/src/tests/diacritics_density.test.ts +118 -0
- package/src/tests/inverted_punctuation.test.ts +84 -0
- package/src/tests/no_en_dash.test.ts +70 -0
- package/src/tests/pagespeed_best_practices.test.ts +198 -0
- package/src/tests/script_density.test.ts +94 -0
- package/src/tests/seo_parity.test.ts +60 -0
- package/src/tests/shared-test-helpers.ts +56 -0
- package/src/tests/tool_exports.test.ts +34 -0
- package/src/tool/bortleVisualizer/i18n/es.ts +1 -5
- package/src/tool/bortleVisualizer/i18n/pl.ts +13 -13
- package/src/tool/bortleVisualizer/i18n/ru.ts +7 -7
- package/src/tool/deepSpaceScope/component.astro +7 -4
- package/src/tool/deepSpaceScope/i18n/de.ts +1 -1
- package/src/tool/deepSpaceScope/i18n/ko.ts +1 -1
- package/src/tool/deepSpaceScope/i18n/pl.ts +7 -7
- package/src/tool/deepSpaceScope/i18n/ru.ts +5 -5
- package/src/tool/deepSpaceScope/i18n/zh.ts +2 -2
- package/src/tool/smartEyepieceCalculator/component.astro +6 -6
- package/src/tool/smartEyepieceCalculator/i18n/fr.ts +11 -11
- package/src/tool/smartEyepieceCalculator/i18n/ru.ts +4 -4
- package/src/tool/smartEyepieceCalculator/i18n/zh.ts +2 -2
- package/src/tool/starExposureCalculator/component.astro +4 -4
- package/src/tool/starExposureCalculator/i18n/fr.ts +5 -0
- package/src/tool/starExposureCalculator/i18n/pl.ts +1 -1
- package/src/tool/starExposureCalculator/i18n/ru.ts +6 -6
- package/src/tool/telescopeResolution/component.astro +3 -3
- package/src/tool/telescopeResolution/i18n/de.ts +3 -3
- package/src/tool/telescopeResolution/i18n/en.ts +2 -2
- package/src/tool/telescopeResolution/i18n/es.ts +6 -1
- package/src/tool/telescopeResolution/i18n/fr.ts +2 -2
- package/src/tool/telescopeResolution/i18n/id.ts +1 -1
- package/src/tool/telescopeResolution/i18n/it.ts +1 -1
- package/src/tool/telescopeResolution/i18n/ja.ts +1 -1
- package/src/tool/telescopeResolution/i18n/ko.ts +1 -1
- package/src/tool/telescopeResolution/i18n/nl.ts +1 -1
- package/src/tool/telescopeResolution/i18n/pl.ts +2 -2
- package/src/tool/telescopeResolution/i18n/pt.ts +1 -1
- package/src/tool/telescopeResolution/i18n/ru.ts +10 -10
- package/src/tool/telescopeResolution/i18n/sv.ts +1 -1
- package/src/tool/telescopeResolution/i18n/tr.ts +1 -1
- package/src/tool/telescopeResolution/i18n/zh.ts +2 -2
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { ALL_TOOLS } from '../tools';
|
|
3
|
+
|
|
4
|
+
type ScriptLocale = keyof typeof SCRIPT_RULES;
|
|
5
|
+
|
|
6
|
+
const SCRIPT_RULES = {
|
|
7
|
+
ja: {
|
|
8
|
+
language: 'Japanese',
|
|
9
|
+
scriptName: 'kana/kanji',
|
|
10
|
+
scriptCharacters: /[\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Han}]/gu,
|
|
11
|
+
minScriptRatio: 0.45,
|
|
12
|
+
},
|
|
13
|
+
ko: {
|
|
14
|
+
language: 'Korean',
|
|
15
|
+
scriptName: 'hangul',
|
|
16
|
+
scriptCharacters: /\p{Script=Hangul}/gu,
|
|
17
|
+
minScriptRatio: 0.55,
|
|
18
|
+
},
|
|
19
|
+
ru: {
|
|
20
|
+
language: 'Russian',
|
|
21
|
+
scriptName: 'cyrillic',
|
|
22
|
+
scriptCharacters: /\p{Script=Cyrillic}/gu,
|
|
23
|
+
minScriptRatio: 0.65,
|
|
24
|
+
},
|
|
25
|
+
zh: {
|
|
26
|
+
language: 'Chinese',
|
|
27
|
+
scriptName: 'han',
|
|
28
|
+
scriptCharacters: /\p{Script=Han}/gu,
|
|
29
|
+
minScriptRatio: 0.45,
|
|
30
|
+
},
|
|
31
|
+
} as const;
|
|
32
|
+
|
|
33
|
+
const LETTERS = /\p{L}/gu;
|
|
34
|
+
const TRANSLATABLE_KEYS = ['title', 'description', 'ui', 'seo', 'faq', 'howTo'] as const;
|
|
35
|
+
|
|
36
|
+
function collectStrings(value: unknown): string[] {
|
|
37
|
+
if (typeof value === 'string') return [value];
|
|
38
|
+
if (!value || typeof value !== 'object') return [];
|
|
39
|
+
if (Array.isArray(value)) return value.flatMap(collectStrings);
|
|
40
|
+
return Object.values(value).flatMap(collectStrings);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function normalizeText(value: unknown): string {
|
|
44
|
+
return collectStrings(value).join(' ').normalize('NFC');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function translatableContent(content: Record<string, unknown>) {
|
|
48
|
+
return TRANSLATABLE_KEYS.map((key) => content[key]);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function letterCount(text: string): number {
|
|
52
|
+
return text.match(LETTERS)?.length ?? 0;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function scriptCount(text: string, locale: ScriptLocale): number {
|
|
56
|
+
return text.match(SCRIPT_RULES[locale].scriptCharacters)?.length ?? 0;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function scriptRatio(text: string, locale: ScriptLocale): number {
|
|
60
|
+
const letters = letterCount(text);
|
|
61
|
+
if (letters === 0) return 0;
|
|
62
|
+
return scriptCount(text, locale) / letters;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
describe('Native script density validation', () => {
|
|
66
|
+
ALL_TOOLS.forEach((tool) => {
|
|
67
|
+
describe(`Tool: ${tool.entry.id}`, () => {
|
|
68
|
+
Object.keys(SCRIPT_RULES).forEach((locale) => {
|
|
69
|
+
it(`${locale} keeps most translated text in its native script`, async () => {
|
|
70
|
+
const typedLocale = locale as ScriptLocale;
|
|
71
|
+
const loader = tool.entry.i18n[typedLocale];
|
|
72
|
+
if (!loader) return;
|
|
73
|
+
|
|
74
|
+
const content = await loader();
|
|
75
|
+
const rule = SCRIPT_RULES[typedLocale];
|
|
76
|
+
const text = normalizeText(translatableContent(content as Record<string, unknown>));
|
|
77
|
+
const letters = letterCount(text);
|
|
78
|
+
const matches = scriptCount(text, typedLocale);
|
|
79
|
+
const ratio = scriptRatio(text, typedLocale);
|
|
80
|
+
|
|
81
|
+
expect(
|
|
82
|
+
ratio,
|
|
83
|
+
[
|
|
84
|
+
`Possible broken translation detected in ${tool.entry.id}/${typedLocale} (${rule.language}).`,
|
|
85
|
+
`The text has ${matches} ${rule.scriptName} characters out of ${letters} analyzed letters (${(ratio * 100).toFixed(1)}%).`,
|
|
86
|
+
`Most translatable content should be written in ${rule.scriptName} script.`,
|
|
87
|
+
'Non-translatable fields such as slug, bibliography, and schemas are ignored to avoid false positives.',
|
|
88
|
+
].join(' '),
|
|
89
|
+
).toBeGreaterThanOrEqual(rule.minScriptRatio);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
});
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { ALL_ENTRIES } from '../entries';
|
|
3
|
+
import type { KnownLocale } from '../types';
|
|
4
|
+
|
|
5
|
+
interface ExpectedCounts {
|
|
6
|
+
seo: number;
|
|
7
|
+
faq: number;
|
|
8
|
+
howTo: number;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function countItems(arr: unknown[] | undefined): number {
|
|
12
|
+
return arr?.length ?? 0;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async function verifyLocaleParity(
|
|
16
|
+
entry: typeof ALL_ENTRIES[number],
|
|
17
|
+
loc: KnownLocale,
|
|
18
|
+
expected: ExpectedCounts,
|
|
19
|
+
): Promise<void> {
|
|
20
|
+
const locContent = await entry.i18n[loc]?.();
|
|
21
|
+
expect(locContent, `Locale ${loc} missing content`).toBeDefined();
|
|
22
|
+
|
|
23
|
+
const locSeoCount = countItems(locContent?.seo);
|
|
24
|
+
const locFaqCount = countItems(locContent?.faq);
|
|
25
|
+
const locHowToCount = countItems(locContent?.howTo);
|
|
26
|
+
|
|
27
|
+
expect(
|
|
28
|
+
locSeoCount,
|
|
29
|
+
`Locale ${loc} SEO sections count (${locSeoCount}) must match EN (${expected.seo})`,
|
|
30
|
+
).toBe(expected.seo);
|
|
31
|
+
expect(
|
|
32
|
+
locFaqCount,
|
|
33
|
+
`Locale ${loc} FAQ items count (${locFaqCount}) must match EN (${expected.faq})`,
|
|
34
|
+
).toBe(expected.faq);
|
|
35
|
+
expect(
|
|
36
|
+
locHowToCount,
|
|
37
|
+
`Locale ${loc} HowTo steps count (${locHowToCount}) must match EN (${expected.howTo})`,
|
|
38
|
+
).toBe(expected.howTo);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
describe('SEO & i18n Structural Parity Suite', () => {
|
|
42
|
+
ALL_ENTRIES.forEach((entry) => {
|
|
43
|
+
describe(`Tool: ${entry.id}`, () => {
|
|
44
|
+
it('all 15 locales should have identical SEO section counts and types as English', async () => {
|
|
45
|
+
const enContent = await entry.i18n.en?.();
|
|
46
|
+
expect(enContent).toBeDefined();
|
|
47
|
+
const expected: ExpectedCounts = {
|
|
48
|
+
seo: countItems(enContent?.seo),
|
|
49
|
+
faq: countItems(enContent?.faq),
|
|
50
|
+
howTo: countItems(enContent?.howTo),
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const locales = Object.keys(entry.i18n) as KnownLocale[];
|
|
54
|
+
for (const loc of locales) {
|
|
55
|
+
await verifyLocaleParity(entry, loc, expected);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
});
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { ToolDefinition } from '../types';
|
|
2
|
+
|
|
3
|
+
export interface ToolExportValidationResult {
|
|
4
|
+
passed: boolean;
|
|
5
|
+
failures: string[];
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
function validateComponentType(
|
|
9
|
+
toolId: string,
|
|
10
|
+
componentName: string,
|
|
11
|
+
component: unknown,
|
|
12
|
+
failures: string[],
|
|
13
|
+
): void {
|
|
14
|
+
if (typeof component !== 'function') {
|
|
15
|
+
failures.push(`${toolId}: ${componentName} is not a function (${typeof component})`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async function validateComponentExecution(
|
|
20
|
+
toolId: string,
|
|
21
|
+
componentName: string,
|
|
22
|
+
fn: () => Promise<unknown>,
|
|
23
|
+
failures: string[],
|
|
24
|
+
): Promise<void> {
|
|
25
|
+
try {
|
|
26
|
+
const result = await fn();
|
|
27
|
+
if (!result || typeof result !== 'object') {
|
|
28
|
+
failures.push(`${toolId}: ${componentName} import returned invalid result`);
|
|
29
|
+
}
|
|
30
|
+
} catch (error) {
|
|
31
|
+
failures.push(`${toolId}: ${componentName} execution error - ${error instanceof Error ? error.message : 'unknown'}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export async function validateToolExports(tools: ToolDefinition[]): Promise<ToolExportValidationResult> {
|
|
36
|
+
const failures: string[] = [];
|
|
37
|
+
|
|
38
|
+
for (const tool of tools) {
|
|
39
|
+
validateComponentType(tool.entry.id, 'Component', tool.Component, failures);
|
|
40
|
+
validateComponentType(tool.entry.id, 'SEOComponent', tool.SEOComponent, failures);
|
|
41
|
+
validateComponentType(tool.entry.id, 'BibliographyComponent', tool.BibliographyComponent, failures);
|
|
42
|
+
|
|
43
|
+
const componentFn = tool.Component as () => Promise<unknown>;
|
|
44
|
+
const seoFn = tool.SEOComponent as () => Promise<unknown>;
|
|
45
|
+
const bibFn = tool.BibliographyComponent as () => Promise<unknown>;
|
|
46
|
+
|
|
47
|
+
await validateComponentExecution(tool.entry.id, 'Component', componentFn, failures);
|
|
48
|
+
await validateComponentExecution(tool.entry.id, 'SEOComponent', seoFn, failures);
|
|
49
|
+
await validateComponentExecution(tool.entry.id, 'BibliographyComponent', bibFn, failures);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return {
|
|
53
|
+
passed: failures.length === 0,
|
|
54
|
+
failures,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { ALL_TOOLS } from '../tools';
|
|
3
|
+
import { validateToolExports } from './shared-test-helpers';
|
|
4
|
+
|
|
5
|
+
describe('Tool Exports Pattern Validation', () => {
|
|
6
|
+
describe('Component Exports Format', () => {
|
|
7
|
+
ALL_TOOLS.forEach((tool) => {
|
|
8
|
+
it(`${tool.entry.id}: Component should be a lazy-loaded function`, () => {
|
|
9
|
+
expect(typeof tool.Component).toBe('function');
|
|
10
|
+
expect(tool.Component).toBeInstanceOf(Function);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it(`${tool.entry.id}: SEOComponent should be a lazy-loaded function`, () => {
|
|
14
|
+
expect(typeof tool.SEOComponent).toBe('function');
|
|
15
|
+
expect(tool.SEOComponent).toBeInstanceOf(Function);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it(`${tool.entry.id}: BibliographyComponent should be a lazy-loaded function`, () => {
|
|
19
|
+
expect(typeof tool.BibliographyComponent).toBe('function');
|
|
20
|
+
expect(tool.BibliographyComponent).toBeInstanceOf(Function);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
describe('Dynamic Import Validation', () => {
|
|
26
|
+
it('all tools must have functional dynamic imports', async () => {
|
|
27
|
+
const result = await validateToolExports(ALL_TOOLS);
|
|
28
|
+
if (!result.passed) {
|
|
29
|
+
throw new Error(`Tool export validation failed:\n${result.failures.join('\n')}`);
|
|
30
|
+
}
|
|
31
|
+
expect(result.passed).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
});
|
|
@@ -74,11 +74,7 @@ const seo: BortleVisualizerLocaleContent['seo'] = [
|
|
|
74
74
|
{ type: 'title', text: 'Contaminación Lumínica: Una Crisis Global Silenciosa', level: 2 },
|
|
75
75
|
{
|
|
76
76
|
type: 'paragraph',
|
|
77
|
-
html: 'El crecimiento de la contaminación lumínica es uno de los problemas medioambientales menos discutidos pero más extendidos. Según estudios recientes, más del <strong>80% de la población mundial</strong> vive bajo cielos contaminados lumínicamente
|
|
78
|
-
},
|
|
79
|
-
{
|
|
80
|
-
type: 'paragraph',
|
|
81
|
-
html: 'Las consecuencias van más allá de la astronomía. La <strong>luz artificial nocturna</strong> altera los ritmos circadianos de humanos y animales, desorienta a aves migratorias, afecta a la reproducción de tortugas marinas y suprime la producción de melatonina en mamíferos. La IDA (International Dark-Sky Association) trabaja para designar Reservas de Cielo Oscuro en todo el mundo, y en España el programa Starlight ha certificado varias zonas de excelencia astronómica.',
|
|
77
|
+
html: 'El crecimiento de la contaminación lumínica es uno de los problemas medioambientales menos discutidos pero más extendidos. Según estudios recientes, más del <strong>80% de la población mundial</strong> vive bajo cielos contaminados lumínicamente. Las consecuencias van más allá de la astronomía: la luz artificial nocturna altera los ritmos circadianos y la biodiversidad.',
|
|
82
78
|
},
|
|
83
79
|
{
|
|
84
80
|
type: 'table',
|
|
@@ -3,13 +3,13 @@ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dt
|
|
|
3
3
|
import type { BortleVisualizerUI, BortleVisualizerLocaleContent } from '../index';
|
|
4
4
|
|
|
5
5
|
const slug = 'symulator-ciemnego-nieba';
|
|
6
|
-
const title = 'Symulator ciemnego nieba (Skala Bortle
|
|
7
|
-
const description = 'Interaktywna wizualizacja 9 poziomów skali Bortle
|
|
6
|
+
const title = 'Symulator ciemnego nieba (Skala Bortle\'a)';
|
|
7
|
+
const description = 'Interaktywna wizualizacja 9 poziomów skali Bortle\'a. Odkryj, jak zanieczyszczenie światłem wymazuje rozgwieżdżone nocne niebo.';
|
|
8
8
|
|
|
9
9
|
const ui: BortleVisualizerUI = {
|
|
10
10
|
toolTitle: 'Symulator ciemnego nieba',
|
|
11
11
|
sliderLabel: 'Przesuń, aby dostosować poziom zanieczyszczenia światłem',
|
|
12
|
-
classLabel: 'Klasa Bortle
|
|
12
|
+
classLabel: 'Klasa Bortle\'a',
|
|
13
13
|
nelmLabel: 'NELM',
|
|
14
14
|
sqmLabel: 'SQM',
|
|
15
15
|
classPrefix: 'KLASA',
|
|
@@ -28,11 +28,11 @@ const ui: BortleVisualizerUI = {
|
|
|
28
28
|
|
|
29
29
|
const faq: BortleVisualizerLocaleContent['faq'] = [
|
|
30
30
|
{
|
|
31
|
-
question: 'Czym jest skala Bortle
|
|
32
|
-
answer: 'To 9-punktowa skala numeryczna mierząca jasność nocnego nieba w danym miejscu. Została stworzona przez astronoma amatora Johna E. Bortle
|
|
31
|
+
question: 'Czym jest skala Bortle\'a?',
|
|
32
|
+
answer: 'To 9-punktowa skala numeryczna mierząca jasność nocnego nieba w danym miejscu. Została stworzona przez astronoma amatora Johna E. Bortle\'a w 2001 roku i opublikowana w Sky & Telescope. Poziom 1 reprezentuje najciemniejsze możliwe niebo (odległe pustynie), a poziom 9 - najbardziej zanieczyszczone światłem (centra miast).',
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
|
-
question: 'Przy jakim poziomie Bortle
|
|
35
|
+
question: 'Przy jakim poziomie Bortle\'a widać Drogę Mleczną?',
|
|
36
36
|
answer: 'Droga Mleczna zaczyna być wyraźnie widoczna od poziomu Bortle 4 (strefa wiejska/podmiejska). Na poziomach 1 i 2 jest spektakularna, z wyraźną strukturą zdolną nawet rzucać słabe cienie. Od poziomu Bortle 6 jest praktycznie niewidoczna gołym okiem.',
|
|
37
37
|
},
|
|
38
38
|
{
|
|
@@ -46,15 +46,15 @@ const faq: BortleVisualizerLocaleContent['faq'] = [
|
|
|
46
46
|
];
|
|
47
47
|
|
|
48
48
|
const howTo: BortleVisualizerLocaleContent['howTo'] = [
|
|
49
|
-
{ name: '1. Dostosuj poziom Bortle
|
|
49
|
+
{ name: '1. Dostosuj poziom Bortle\'a', text: 'Przesuń suwak, aby zasymulować wzrost zanieczyszczenia światłem od poziomu 1 (pustynia) do poziomu 9 (centrum miasta).' },
|
|
50
50
|
{ name: '2. Obserwuj efekty wizualne', text: 'Zwróć uwagę, jak na każdym poziomie znikają słabsze gwiazdy, Droga Mleczna blednie, a niebo przybiera pomarańczowy lub szary odcień.' },
|
|
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
|
|
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.' },
|
|
52
52
|
];
|
|
53
53
|
|
|
54
54
|
const seo: BortleVisualizerLocaleContent['seo'] = [
|
|
55
55
|
{
|
|
56
56
|
type: 'summary',
|
|
57
|
-
title: 'Kluczowe punkty skali Bortle
|
|
57
|
+
title: 'Kluczowe punkty skali Bortle\'a',
|
|
58
58
|
items: [
|
|
59
59
|
'Bortle 1-2: Referencyjne ciemne niebo, Droga Mleczna rzuca cienie, NELM > 7.5.',
|
|
60
60
|
'Bortle 3-4: Optymalne niebo wiejskie, Droga Mleczna widoczna szczegółowo, ale horyzont rozjaśniony.',
|
|
@@ -62,10 +62,10 @@ const seo: BortleVisualizerLocaleContent['seo'] = [
|
|
|
62
62
|
'Bortle 7-9: Niebo miejskie, gołym okiem widoczne tylko najjaśniejsze obiekty.',
|
|
63
63
|
],
|
|
64
64
|
},
|
|
65
|
-
{ type: 'title', text: 'Skala Bortle
|
|
65
|
+
{ type: 'title', text: 'Skala Bortle\'a: Pomiar ciemności nieba', level: 2 },
|
|
66
66
|
{
|
|
67
67
|
type: 'paragraph',
|
|
68
|
-
html: '<strong>Skala Bortle
|
|
68
|
+
html: '<strong>Skala Bortle\'a</strong> to międzynarodowy system standardowy używany przez astronomów amatorów na całym świecie do określania jakości nocnego nieba. Została stworzona przez Johna E. Bortle\'a, doświadczonego obserwatora komet i głębokiego nieba z Nowego Jorku, i opublikowana w 2001 roku w magazynie Sky & Telescope. Celem było zapewnienie obiektywnej i powtarzalnej skali do opisywania warunków obserwacyjnych.',
|
|
69
69
|
},
|
|
70
70
|
{
|
|
71
71
|
type: 'paragraph',
|
|
@@ -78,7 +78,7 @@ const seo: BortleVisualizerLocaleContent['seo'] = [
|
|
|
78
78
|
},
|
|
79
79
|
{
|
|
80
80
|
type: 'table',
|
|
81
|
-
headers: ['Klasa Bortle
|
|
81
|
+
headers: ['Klasa Bortle\'a', 'NELM', 'SQM (mag/arcsec²)', 'Droga Mleczna', 'Kluczowa cecha'],
|
|
82
82
|
rows: [
|
|
83
83
|
['1 - Doskonała', '8.0', '21.99 - 22.0', 'Rzuca cienie', 'M33 widoczna gołym okiem'],
|
|
84
84
|
['2 - Typowa ciemna', '7.5', '21.89 - 21.99', 'Bardzo wyraźna', 'Chmury = czarne dziury'],
|
|
@@ -99,7 +99,7 @@ const seo: BortleVisualizerLocaleContent['seo'] = [
|
|
|
99
99
|
{ type: 'title', text: 'Znajdowanie rezerwatów ciemnego nieba w Twojej okolicy', level: 2 },
|
|
100
100
|
{
|
|
101
101
|
type: 'paragraph',
|
|
102
|
-
html: 'Mimo powszechnego zanieczyszczenia światłem, wciąż istnieją oazy ciemności. Parki narodowe, wyznaczone rezerwaty ciemnego nieba i odległe tereny górskie oferują warunki Bortle 2-4, dostępne w ciągu kilku godzin jazdy od większości dużych miast. IDA (International Dark-Sky Association) prowadzi globalny rejestr certyfikowanych miejsc ciemnego nieba
|
|
102
|
+
html: 'Mimo powszechnego zanieczyszczenia światłem, wciąż istnieją oazy ciemności. Parki narodowe, wyznaczone rezerwaty ciemnego nieba i odległe tereny górskie oferują warunki Bortle 2-4, dostępne w ciągu kilku godzin jazdy od większości dużych miast. IDA (International Dark-Sky Association) prowadzi globalny rejestr certyfikowanych miejsc ciemnego nieba - od małych parków po całe rezerwaty wyspiarskie. Zaplanowanie nocnej wyprawy do ciemniejszego miejsca odmieni Twoje wrażenia astronomiczne bardziej niż jakakolwiek modernizacja sprzętu.',
|
|
103
103
|
},
|
|
104
104
|
{
|
|
105
105
|
type: 'diagnostic',
|
|
@@ -22,14 +22,14 @@ const ui: BortleVisualizerUI = {
|
|
|
22
22
|
6: { title: 'Яркое пригородное', description: 'Млечный Путь не виден. Небо светло-серое. Облака очень яркие. Галактика М31 едва различима.', nelm: 5.5, sqm: '18.94 - 19.50', starsVisible: true, milkyWayVisible: false, cloudsLit: true, skyBrightness: 0.65 },
|
|
23
23
|
7: { title: 'Пригородное/Городское', description: 'Небо серовато-белое. Сильные источники света со всех сторон. Видны только самые яркие звезды.', nelm: 5.0, sqm: '18.38 - 18.94', starsVisible: true, milkyWayVisible: false, cloudsLit: true, skyBrightness: 0.8 },
|
|
24
24
|
8: { title: 'Городское небо', description: 'Небо серовато-белое или оранжевое. Можно читать заголовки газет. Видны только основные созвездия.', nelm: 4.5, sqm: '< 18.38', starsVisible: true, milkyWayVisible: false, cloudsLit: true, skyBrightness: 0.9 },
|
|
25
|
-
9: { title: 'Центр города', description: 'Небо яркое, как в сумерках. Луна видна, но созвездия
|
|
25
|
+
9: { title: 'Центр города', description: 'Небо яркое, как в сумерках. Луна видна, но созвездия - нет. Видны только планеты и Луна.', nelm: 4.0, sqm: '< 18.00', starsVisible: false, milkyWayVisible: false, cloudsLit: true, skyBrightness: 1.0 },
|
|
26
26
|
},
|
|
27
27
|
};
|
|
28
28
|
|
|
29
29
|
const faq: BortleVisualizerLocaleContent['faq'] = [
|
|
30
30
|
{
|
|
31
31
|
question: 'Что такое шкала Бортля?',
|
|
32
|
-
answer: 'Это 9-балльная числовая шкала, измеряющая яркость ночного неба в конкретном месте. Она была создана астрономом-любителем Джоном Бортлем в 2001 году и опубликована в журнале Sky & Telescope. Уровень 1 соответствует самому темному небу (пустыни), а уровень 9
|
|
32
|
+
answer: 'Это 9-балльная числовая шкала, измеряющая яркость ночного неба в конкретном месте. Она была создана астрономом-любителем Джоном Бортлем в 2001 году и опубликована в журнале Sky & Telescope. Уровень 1 соответствует самому темному небу (пустыни), а уровень 9 - самому засвеченному (центры городов).',
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
35
|
question: 'При каком уровне Бортля виден Млечный Путь?',
|
|
@@ -37,7 +37,7 @@ const faq: BortleVisualizerLocaleContent['faq'] = [
|
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
39
|
question: 'Что означают аббревиатуры NELM и SQM?',
|
|
40
|
-
answer: 'NELM (Naked Eye Limiting Magnitude)
|
|
40
|
+
answer: 'NELM (Naked Eye Limiting Magnitude) - это звездная величина самой тусклой звезды, видимой невооруженным глазом. SQM (Sky Quality Meter) - показатель яркости неба в звездных величинах на квадратную угловую секунду, являющийся объективным научным стандартом.',
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
43
|
question: 'Как найти темное небо рядом со мной?',
|
|
@@ -65,7 +65,7 @@ const seo: BortleVisualizerLocaleContent['seo'] = [
|
|
|
65
65
|
{ type: 'title', text: 'Шкала Бортля: Как измерить темноту неба', level: 2 },
|
|
66
66
|
{
|
|
67
67
|
type: 'paragraph',
|
|
68
|
-
html: '<strong>Шкала Бортля</strong>
|
|
68
|
+
html: '<strong>Шкала Бортля</strong> - это международный стандарт, используемый астрономами-любителями по всему миру для количественной оценки качества ночного неба. Созданная Джоном Бортлем, опытным наблюдателем комет из Нью-Йорка, она была опубликована в 2001 году в журнале Sky & Telescope с целью предоставить объективный и воспроизводимый инструмент для обмена данными об условиях видимости.',
|
|
69
69
|
},
|
|
70
70
|
{
|
|
71
71
|
type: 'paragraph',
|
|
@@ -74,14 +74,14 @@ const seo: BortleVisualizerLocaleContent['seo'] = [
|
|
|
74
74
|
{ type: 'title', text: 'Световое загрязнение: Тихий глобальный кризис', level: 2 },
|
|
75
75
|
{
|
|
76
76
|
type: 'paragraph',
|
|
77
|
-
html: 'Рост светового загрязнения
|
|
77
|
+
html: 'Рост светового загрязнения - одна из наименее обсуждаемых, но крайне масштабных экологических проблем. Согласно исследованиям, более <strong>80% населения планеты</strong> живет под засвеченным небом. Последствия выходят за рамки астрономии: искусственный свет нарушает циркадные ритмы людей, дезориентирует перелетных птиц и влияет на размножение многих видов животных. Уменьшение естественной темноты подавляет выработку мелатонина у млекопитающих.',
|
|
78
78
|
},
|
|
79
79
|
{
|
|
80
80
|
type: 'table',
|
|
81
81
|
headers: ['Класс Бортля', 'NELM', 'SQM (вел/кв. сек)', 'Млечный Путь', 'Ключевой признак'],
|
|
82
82
|
rows: [
|
|
83
83
|
['1 - Идеальный', '8.0', '21.99 - 22.0', 'Отбрасывает тени', 'М33 видна глазом'],
|
|
84
|
-
['2 - Темный', '7.5', '21.89 - 21.99', 'Очень структурный', 'Облака
|
|
84
|
+
['2 - Темный', '7.5', '21.89 - 21.99', 'Очень структурный', 'Облака - черные дыры'],
|
|
85
85
|
['3 - Сельский', '7.0', '21.69 - 21.89', 'Сложный', 'Слабое свечение горизонта'],
|
|
86
86
|
['4 - Сельск/Приг', '6.5', '20.49 - 21.69', 'Заметен', 'Купола света у горизонта'],
|
|
87
87
|
['5 - Пригородный', '6.0', '19.50 - 20.49', 'Тусклый', 'Сероватое небо'],
|
|
@@ -94,7 +94,7 @@ const seo: BortleVisualizerLocaleContent['seo'] = [
|
|
|
94
94
|
{
|
|
95
95
|
type: 'tip',
|
|
96
96
|
title: 'Объективное измерение: Sky Quality Meter',
|
|
97
|
-
html: 'Для точных измерений астрономы используют <strong>Sky Quality Meter (SQM)</strong>
|
|
97
|
+
html: 'Для точных измерений астрономы используют <strong>Sky Quality Meter (SQM)</strong> - прибор, измеряющий яркость неба в звездных величинах на квадратную угловую секунду (mag/arcsec²). Значение 22.0 соответствует идеальному небу Бортля 1, а 18.0 указывает на условия Бортля 8-9. Вы можете найти данные измерений в реальном времени в сети Globe at Night.',
|
|
98
98
|
},
|
|
99
99
|
{ type: 'title', text: 'Где найти заповедники темного неба', level: 2 },
|
|
100
100
|
{
|
|
@@ -143,6 +143,9 @@ const { ui } = Astro.props;
|
|
|
143
143
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
144
144
|
const uiData = (window as any).__deepSpaceUI || {};
|
|
145
145
|
const canvas = document.getElementById("sky-canvas") as HTMLCanvasElement;
|
|
146
|
+
const getCanvasWidth = () => canvas ? canvas.offsetWidth : 0;
|
|
147
|
+
const getCanvasHeight = () => canvas ? canvas.offsetHeight : 0;
|
|
148
|
+
const getContainerWidth = () => container ? container.offsetWidth : 0;
|
|
146
149
|
const ctx = canvas?.getContext("2d");
|
|
147
150
|
const objectsLayer = document.getElementById("objects-layer");
|
|
148
151
|
const apertureInput = document.getElementById("aperture") as HTMLInputElement;
|
|
@@ -303,8 +306,8 @@ const { ui } = Astro.props;
|
|
|
303
306
|
|
|
304
307
|
function render() {
|
|
305
308
|
if (!ctx || !canvas) return;
|
|
306
|
-
const w = (canvas.width =
|
|
307
|
-
const h = (canvas.height =
|
|
309
|
+
const w = (canvas.width = getCanvasWidth());
|
|
310
|
+
const h = (canvas.height = getCanvasHeight());
|
|
308
311
|
ctx.clearRect(0, 0, w, h);
|
|
309
312
|
const sliderVal = parseInt(apertureInput.value);
|
|
310
313
|
const bortle = parseInt(bortleInput.value);
|
|
@@ -329,7 +332,7 @@ const { ui } = Astro.props;
|
|
|
329
332
|
if (!isDragging || !container) return;
|
|
330
333
|
const dx = e.clientX - startX;
|
|
331
334
|
dragDistance += Math.abs(e.movementX);
|
|
332
|
-
const degreesPerPixel = FOV /
|
|
335
|
+
const degreesPerPixel = FOV / getContainerWidth();
|
|
333
336
|
let newPan = startPan - dx * degreesPerPixel;
|
|
334
337
|
if (newPan < 0) newPan += 360;
|
|
335
338
|
if (newPan >= 360) newPan -= 360;
|
|
@@ -355,7 +358,7 @@ const { ui } = Astro.props;
|
|
|
355
358
|
if (!isDragging || !container) return;
|
|
356
359
|
const dx = e.touches[0].clientX - startX;
|
|
357
360
|
dragDistance += Math.abs(dx);
|
|
358
|
-
const degreesPerPixel = FOV /
|
|
361
|
+
const degreesPerPixel = FOV / getContainerWidth();
|
|
359
362
|
let newPan = startPan - dx * degreesPerPixel;
|
|
360
363
|
if (newPan < 0) newPan += 360;
|
|
361
364
|
if (newPan >= 360) newPan -= 360;
|
|
@@ -76,7 +76,7 @@ const seo: DeepSpaceScopeLocaleContent['seo'] = [
|
|
|
76
76
|
'Die Öffnung ist der entscheidende Faktor: Ein größerer Durchmesser bedeutet mehr Licht und eine höhere Grenzgröße.',
|
|
77
77
|
'Ein dunkler Himmel (niedriger Bortle-Wert) kann gegenüber einem städtischen Himmel 2-3 Magnituden Gewinn bringen.',
|
|
78
78
|
'Ein 200-mm-Teleskop erreicht bei Bortle 3 Magn. 13-14, bei Bortle 7 jedoch nur Magn. 11.',
|
|
79
|
-
'Helle Planeten und der Mond erfordern keinen dunklen Himmel
|
|
79
|
+
'Helle Planeten und der Mond erfordern keinen dunklen Himmel - sie sind auch aus der Stadt sichtbar.',
|
|
80
80
|
],
|
|
81
81
|
},
|
|
82
82
|
{ type: 'title', text: 'Die Physik der astronomischen Beobachtung: Öffnung und Magnitude', level: 2 },
|
|
@@ -91,7 +91,7 @@ const seo: DeepSpaceScopeLocaleContent['seo'] = [
|
|
|
91
91
|
{ type: 'title', text: '빛 공해가 관측 성능에 미치는 영향', level: 2 },
|
|
92
92
|
{
|
|
93
93
|
type: 'paragraph',
|
|
94
|
-
html: '세계에서 가장 큰 망원경을 가져와도 도심 한복판에서는 희미한 은하를 볼 수 없습니다. 밤하늘 배경의 밝기가 필요한 대비(콘트라스트)를
|
|
94
|
+
html: '세계에서 가장 큰 망원경을 가져와도 도심 한복판에서는 희미한 은하를 볼 수 없습니다. 밤하늘 배경의 밝기가 필요한 대비(콘트라스트)를 \"지워버리기\" 때문입니다. <strong>보틀 척도</strong>는 이 효과를 수치화한 것으로, 보틀 지수가 1단계씩 올라갈 때마다 망원경의 관측 한계가 약 0.5등급씩 줄어듭니다.',
|
|
95
95
|
},
|
|
96
96
|
{
|
|
97
97
|
type: 'table',
|
|
@@ -45,11 +45,11 @@ const ui: DeepSpaceScopeUI = {
|
|
|
45
45
|
const faq: DeepSpaceScopeLocaleContent['faq'] = [
|
|
46
46
|
{
|
|
47
47
|
question: 'Co to jest magnitudo graniczne teleskopu?',
|
|
48
|
-
answer: 'To jasność najsłabszego obiektu, jaki teleskop może wykryć w danych warunkach nieba. Zależy od średnicy apertury (większa apertura = więcej zebranego światła) oraz jakości nieba (skala Bortle
|
|
48
|
+
answer: 'To jasność najsłabszego obiektu, jaki teleskop może wykryć w danych warunkach nieba. Zależy od średnicy apertury (większa apertura = więcej zebranego światła) oraz jakości nieba (skala Bortle\'a). Ludzkie oko w optymalnych warunkach sięga 6,5 magnitudo; teleskop 200 mm może osiągnąć 13-14 magnitudo.',
|
|
49
49
|
},
|
|
50
50
|
{
|
|
51
|
-
question: 'Jak skala Bortle
|
|
52
|
-
answer: 'Każdy poziom skali Bortle
|
|
51
|
+
question: 'Jak skala Bortle\'a wpływa na to, co widzę?',
|
|
52
|
+
answer: 'Każdy poziom skali Bortle\'a zmniejsza zasięg o około 0,5 magnitudo. Teleskop 200 mm pod niebem klasy 2 może sięgnąć 14,5 magnitudo, ale pod niebem klasy 7 ta sama apertura pozwoli na dostrzeżenie obiektów tylko do 11-12 magnitudo. Ciemne niebo wielokrotnie zwiększa możliwości każdego instrumentu.',
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
55
|
question: 'Jakie obiekty są widoczne z miasta?',
|
|
@@ -63,7 +63,7 @@ const faq: DeepSpaceScopeLocaleContent['faq'] = [
|
|
|
63
63
|
|
|
64
64
|
const howTo: DeepSpaceScopeLocaleContent['howTo'] = [
|
|
65
65
|
{ name: '1. Ustaw aperturę', text: 'Przesuń suwak apertury, aby dopasować go do Twojego teleskopu. Zakres obejmuje od 50 mm (lornetka) do 400 mm (zaawansowany teleskop).' },
|
|
66
|
-
{ name: '2. Dostosuj jakość nieba', text: 'Ustaw poziom skali Bortle
|
|
66
|
+
{ name: '2. Dostosuj jakość nieba', text: 'Ustaw poziom skali Bortle\'a dla Twojego stałego miejsca obserwacji, aby zobaczyć rzeczywiste magnitudo graniczne.' },
|
|
67
67
|
{ name: '3. Eksploruj mapę gwiazd', text: 'Przeciągaj widok, aby przeszukać pełne 360° nieba i odkryć, jakie obiekty są widoczne przez Twój sprzęt.' },
|
|
68
68
|
{ name: '4. Klikaj w obiekty', text: 'Dotknij dowolnego obiektu na niebie, aby zobaczyć szczegółowe informacje: typ, jasność i opis.' },
|
|
69
69
|
];
|
|
@@ -74,9 +74,9 @@ const seo: DeepSpaceScopeLocaleContent['seo'] = [
|
|
|
74
74
|
title: 'Kluczowe punkty dotyczące zasięgu teleskopu',
|
|
75
75
|
items: [
|
|
76
76
|
'Apertura jest decydującym czynnikiem: większa średnica to więcej światła i wyższe magnitudo graniczne.',
|
|
77
|
-
'Ciemne niebo (niski poziom Bortle
|
|
77
|
+
'Ciemne niebo (niski poziom Bortle\'a) pozwala zyskać 2-3 magnitudo w porównaniu z niebem miejskim.',
|
|
78
78
|
'Teleskop 200 mm sięga 13-14 mag przy klasie Bortle 3, a tylko 11 mag przy klasie 7.',
|
|
79
|
-
'Jasne planety i Księżyc nie wymagają ciemnego nieba
|
|
79
|
+
'Jasne planety i Księżyc nie wymagają ciemnego nieba - są widoczne także z miasta.',
|
|
80
80
|
],
|
|
81
81
|
},
|
|
82
82
|
{ type: 'title', text: 'Fizyka obserwacji astronomicznych: apertura i magnitudo', level: 2 },
|
|
@@ -91,7 +91,7 @@ const seo: DeepSpaceScopeLocaleContent['seo'] = [
|
|
|
91
91
|
{ type: 'title', text: 'Wpływ zanieczyszczenia światłem na zasięg', level: 2 },
|
|
92
92
|
{
|
|
93
93
|
type: 'paragraph',
|
|
94
|
-
html: 'Nawet przy użyciu największego teleskopu świata nie dostrzeżesz słabych galaktyk z centrum miasta. Jasność tła nieba
|
|
94
|
+
html: 'Nawet przy użyciu największego teleskopu świata nie dostrzeżesz słabych galaktyk z centrum miasta. Jasność tła nieba \"wymazuje\" niezbędny kontrast. <strong>Skala Bortle\'a</strong> określa ten efekt ilościowo: każdy dodatkowy poziom klasy Bortle odejmuje około 0,5 magnitudo od zasięgu teleskopu.',
|
|
95
95
|
},
|
|
96
96
|
{
|
|
97
97
|
type: 'table',
|
|
@@ -45,7 +45,7 @@ const ui: DeepSpaceScopeUI = {
|
|
|
45
45
|
const faq: DeepSpaceScopeLocaleContent['faq'] = [
|
|
46
46
|
{
|
|
47
47
|
question: 'Что такое предельная звездная величина телескопа?',
|
|
48
|
-
answer: 'Это яркость самого тусклого объекта, который телескоп может обнаружить при данных условиях неба. Она зависит от диаметра апертуры (чем больше апертура
|
|
48
|
+
answer: 'Это яркость самого тусклого объекта, который телескоп может обнаружить при данных условиях неба. Она зависит от диаметра апертуры (чем больше апертура - тем больше света собрано) и качества неба (шкала Бортля). Человеческий глаз в идеальных условиях видит до 6.5 вел.; 200-мм телескоп может достичь 13-14 вел.',
|
|
49
49
|
},
|
|
50
50
|
{
|
|
51
51
|
question: 'Как шкала Бортля влияет на то, что я вижу?',
|
|
@@ -73,16 +73,16 @@ const seo: DeepSpaceScopeLocaleContent['seo'] = [
|
|
|
73
73
|
type: 'summary',
|
|
74
74
|
title: 'Ключевые факты оReach телескопа',
|
|
75
75
|
items: [
|
|
76
|
-
'Апертура
|
|
76
|
+
'Апертура - решающий фактор: больше диаметр - больше света и выше предельная величина.',
|
|
77
77
|
'Темное небо (низкий Бортль) дает выигрыш в 2-3 величины по сравнению с городским небом.',
|
|
78
78
|
'200-мм телескоп видит до 13-14 вел. при Бортле 3, и только до 11 вел. при Бортле 7.',
|
|
79
|
-
'Яркие планеты и Луна не требуют темного неба
|
|
79
|
+
'Яркие планеты и Луна не требуют темного неба - они отлично видны из города.',
|
|
80
80
|
],
|
|
81
81
|
},
|
|
82
82
|
{ type: 'title', text: 'Физика астронаблюдений: Апертура и звездная величина', level: 2 },
|
|
83
83
|
{
|
|
84
84
|
type: 'paragraph',
|
|
85
|
-
html: 'Главная задача телескопа
|
|
85
|
+
html: 'Главная задача телескопа - не увеличивать изображение, а <strong>собирать свет</strong>. Человеческий зрачок расширяется максимум до 6-7 мм в полной темноте. Телескоп 200 мм имеет собирающую поверхность 31 416 мм², что более чем в <strong>800 раз больше</strong> зрачка, позволяя видеть объекты в сотни раз слабее.',
|
|
86
86
|
},
|
|
87
87
|
{
|
|
88
88
|
type: 'paragraph',
|
|
@@ -112,7 +112,7 @@ const seo: DeepSpaceScopeLocaleContent['seo'] = [
|
|
|
112
112
|
{ type: 'title', text: 'Интересные объекты по типам и сложности', level: 2 },
|
|
113
113
|
{
|
|
114
114
|
type: 'paragraph',
|
|
115
|
-
html: 'Для новичков <strong>планеты</strong>
|
|
115
|
+
html: 'Для новичков <strong>планеты</strong> - лучшие цели: они не требуют темного неба и показывают детали даже в малые трубы (кольца Сатурна - 40х, полосы Юпитера - 80х, полярные шапки Марса). <strong>Туманности</strong> требуют апертуры и темного неба, но дарят виды невероятной красоты.',
|
|
116
116
|
},
|
|
117
117
|
{
|
|
118
118
|
type: 'stats',
|
|
@@ -76,7 +76,7 @@ const seo: DeepSpaceScopeLocaleContent['seo'] = [
|
|
|
76
76
|
'口径是决定性因素:直径越大意味着收集的光线越多,极限星等越高。',
|
|
77
77
|
'暗空(低波特尔值)相比城市天空可以获得 2-3 等的深度增益。',
|
|
78
78
|
'200mm 望远镜在波特尔 3 级可达 13-14 等,而在波特尔 7 级仅为 11 等。',
|
|
79
|
-
'明亮的行星和月亮不需要暗空
|
|
79
|
+
'明亮的行星和月亮不需要暗空 - 在城市中即可观测。',
|
|
80
80
|
],
|
|
81
81
|
},
|
|
82
82
|
{ type: 'title', text: '天文观测物理学:口径与星等', level: 2 },
|
|
@@ -91,7 +91,7 @@ const seo: DeepSpaceScopeLocaleContent['seo'] = [
|
|
|
91
91
|
{ type: 'title', text: '光污染对观测深度的影响', level: 2 },
|
|
92
92
|
{
|
|
93
93
|
type: 'paragraph',
|
|
94
|
-
html: '
|
|
94
|
+
html: '即使使用世界上最好的望远镜,您也无法在市中心看到暗淡的星系。天空背景的亮度会\"抹除\"必要的对比度。<strong>波特尔量表</strong>量化了这种影响:每增加一阶波特尔等级,望远镜的观测深度大约会减少 0.5 等。',
|
|
95
95
|
},
|
|
96
96
|
{
|
|
97
97
|
type: 'table',
|