@jjlmoya/utils-home 1.6.0 → 1.8.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 +61 -60
- package/src/tests/i18n_coverage.test.ts +36 -0
- package/src/tests/schemas_fulfillment.test.ts +23 -0
- package/src/tests/slug_language_code_format.test.ts +27 -0
- package/src/tests/slug_uniqueness.test.ts +81 -0
- package/src/tests/title_quality.test.ts +55 -0
- package/src/tool/dewPointCalculator/i18n/de.ts +178 -0
- package/src/tool/dewPointCalculator/i18n/en.ts +1 -1
- package/src/tool/dewPointCalculator/i18n/es.ts +1 -1
- package/src/tool/dewPointCalculator/i18n/fr.ts +1 -1
- package/src/tool/dewPointCalculator/i18n/id.ts +178 -0
- package/src/tool/dewPointCalculator/i18n/it.ts +178 -0
- package/src/tool/dewPointCalculator/i18n/ja.ts +178 -0
- package/src/tool/dewPointCalculator/i18n/ko.ts +178 -0
- package/src/tool/dewPointCalculator/i18n/nl.ts +178 -0
- package/src/tool/dewPointCalculator/i18n/pl.ts +178 -0
- package/src/tool/dewPointCalculator/i18n/pt.ts +178 -0
- package/src/tool/dewPointCalculator/i18n/ru.ts +178 -0
- package/src/tool/dewPointCalculator/i18n/sv.ts +178 -0
- package/src/tool/dewPointCalculator/i18n/tr.ts +178 -0
- package/src/tool/dewPointCalculator/i18n/zh.ts +178 -0
- package/src/tool/dewPointCalculator/index.ts +16 -6
- package/src/tool/heatingComparator/i18n/de.ts +340 -0
- package/src/tool/heatingComparator/i18n/id.ts +324 -0
- package/src/tool/heatingComparator/i18n/it.ts +336 -0
- package/src/tool/heatingComparator/i18n/ja.ts +311 -0
- package/src/tool/heatingComparator/i18n/ko.ts +307 -0
- package/src/tool/heatingComparator/i18n/nl.ts +336 -0
- package/src/tool/heatingComparator/i18n/pl.ts +311 -0
- package/src/tool/heatingComparator/i18n/pt.ts +336 -0
- package/src/tool/heatingComparator/i18n/ru.ts +307 -0
- package/src/tool/heatingComparator/i18n/sv.ts +311 -0
- package/src/tool/heatingComparator/i18n/tr.ts +324 -0
- package/src/tool/heatingComparator/i18n/zh.ts +307 -0
- package/src/tool/heatingComparator/index.ts +13 -1
- package/src/tool/ledSavingCalculator/i18n/de.ts +208 -0
- package/src/tool/ledSavingCalculator/i18n/fr.ts +1 -1
- package/src/tool/ledSavingCalculator/i18n/id.ts +208 -0
- package/src/tool/ledSavingCalculator/i18n/it.ts +208 -0
- package/src/tool/ledSavingCalculator/i18n/ja.ts +208 -0
- package/src/tool/ledSavingCalculator/i18n/ko.ts +208 -0
- package/src/tool/ledSavingCalculator/i18n/nl.ts +208 -0
- package/src/tool/ledSavingCalculator/i18n/pl.ts +208 -0
- package/src/tool/ledSavingCalculator/i18n/pt.ts +208 -0
- package/src/tool/ledSavingCalculator/i18n/ru.ts +208 -0
- package/src/tool/ledSavingCalculator/i18n/sv.ts +208 -0
- package/src/tool/ledSavingCalculator/i18n/tr.ts +208 -0
- package/src/tool/ledSavingCalculator/i18n/zh.ts +208 -0
- package/src/tool/ledSavingCalculator/index.ts +16 -7
- package/src/tool/projectorCalculator/i18n/de.ts +180 -0
- package/src/tool/projectorCalculator/i18n/fr.ts +1 -1
- package/src/tool/projectorCalculator/i18n/id.ts +181 -0
- package/src/tool/projectorCalculator/i18n/it.ts +180 -0
- package/src/tool/projectorCalculator/i18n/ja.ts +180 -0
- package/src/tool/projectorCalculator/i18n/ko.ts +180 -0
- package/src/tool/projectorCalculator/i18n/nl.ts +180 -0
- package/src/tool/projectorCalculator/i18n/pl.ts +180 -0
- package/src/tool/projectorCalculator/i18n/pt.ts +180 -0
- package/src/tool/projectorCalculator/i18n/ru.ts +180 -0
- package/src/tool/projectorCalculator/i18n/sv.ts +180 -0
- package/src/tool/projectorCalculator/i18n/tr.ts +180 -0
- package/src/tool/projectorCalculator/i18n/zh.ts +180 -0
- package/src/tool/projectorCalculator/index.ts +15 -6
- package/src/tool/qrGenerator/i18n/de.ts +203 -0
- package/src/tool/qrGenerator/i18n/id.ts +151 -0
- package/src/tool/qrGenerator/i18n/it.ts +174 -0
- package/src/tool/qrGenerator/i18n/ja.ts +151 -0
- package/src/tool/qrGenerator/i18n/ko.ts +151 -0
- package/src/tool/qrGenerator/i18n/nl.ts +151 -0
- package/src/tool/qrGenerator/i18n/pl.ts +151 -0
- package/src/tool/qrGenerator/i18n/pt.ts +151 -0
- package/src/tool/qrGenerator/i18n/ru.ts +151 -0
- package/src/tool/qrGenerator/i18n/sv.ts +151 -0
- package/src/tool/qrGenerator/i18n/tr.ts +151 -0
- package/src/tool/qrGenerator/i18n/zh.ts +151 -0
- package/src/tool/qrGenerator/index.ts +17 -9
- package/src/tool/solarCalculator/i18n/de.ts +146 -0
- package/src/tool/solarCalculator/i18n/id.ts +126 -0
- package/src/tool/solarCalculator/i18n/it.ts +126 -0
- package/src/tool/solarCalculator/i18n/ja.ts +126 -0
- package/src/tool/solarCalculator/i18n/ko.ts +121 -0
- package/src/tool/solarCalculator/i18n/nl.ts +120 -0
- package/src/tool/solarCalculator/i18n/pl.ts +121 -0
- package/src/tool/solarCalculator/i18n/pt.ts +126 -0
- package/src/tool/solarCalculator/i18n/ru.ts +110 -0
- package/src/tool/solarCalculator/i18n/sv.ts +110 -0
- package/src/tool/solarCalculator/i18n/tr.ts +120 -0
- package/src/tool/solarCalculator/i18n/zh.ts +121 -0
- package/src/tool/solarCalculator/index.ts +17 -9
- package/src/tool/tariffComparator/i18n/de.ts +133 -0
- package/src/tool/tariffComparator/i18n/id.ts +133 -0
- package/src/tool/tariffComparator/i18n/it.ts +133 -0
- package/src/tool/tariffComparator/i18n/ja.ts +133 -0
- package/src/tool/tariffComparator/i18n/ko.ts +133 -0
- package/src/tool/tariffComparator/i18n/nl.ts +133 -0
- package/src/tool/tariffComparator/i18n/pl.ts +133 -0
- package/src/tool/tariffComparator/i18n/pt.ts +133 -0
- package/src/tool/tariffComparator/i18n/ru.ts +106 -0
- package/src/tool/tariffComparator/i18n/sv.ts +111 -0
- package/src/tool/tariffComparator/i18n/tr.ts +133 -0
- package/src/tool/tariffComparator/i18n/zh.ts +133 -0
- package/src/tool/tariffComparator/index.ts +16 -7
- package/src/types.ts +1 -1
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { ProjectorCalculatorUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'projektor-avstands-kalkylator';
|
|
6
|
+
const title = 'Projektor Avståndskalkylator — Kastförhållande och Skärm';
|
|
7
|
+
const description =
|
|
8
|
+
'Beräkna exakt avstånd för att installera din projektor baserat på önskad skärmstorlek och kastförhållande (Throw Ratio).';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Vad är Throw Ratio (kastförhållande)?',
|
|
13
|
+
answer:
|
|
14
|
+
'Det är ett tal som definierar hur stor bilden blir på ett visst avstånd. Det beräknas genom att dela projektionsavståndet med bildbredden. Ett förhållande på 1.5 betyder att 1.5m avstånd ger 1m bildbredd.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Vilket avstånd behöver jag för 100 tum?',
|
|
18
|
+
answer:
|
|
19
|
+
'Det beror på projektorns kastförhållande. Med ett standardförhållande på 1.5:1 behövs ca 3.3m. Med en Short Throw-projektor kan det gå på under 1m.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Vad är skillnaden mellan 16:9 och 4:3?',
|
|
23
|
+
answer:
|
|
24
|
+
'16:9 är bredbild för moderna filmer. 4:3 är det klassiska formatet för presentationer. Genom att välja rätt format undviker man stora svarta kanter.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'Är höjden på projektorn viktig?',
|
|
28
|
+
answer:
|
|
29
|
+
'Ja. Projektorer har offset eller keystone-korrigering. Det är bäst att montera den centrerat mot skärmens övre eller nedre kant för att undvika förvrängning.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Kolla Throw Ratio',
|
|
36
|
+
text: 'Leta i manualen eller på lådan efter ett värde som 1.2:1 eller 1.5-1.8:1.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Ange skärmstorlek',
|
|
40
|
+
text: 'Fyll i tum på diagonalen eller den bredd du har tillgänglig på väggen.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Välj format',
|
|
44
|
+
text: 'Välj 16:9 för film, 4:3 för kontor eller 21:9 för biokänsla.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Få fram avståndet',
|
|
48
|
+
text: 'Kalkylatorn ger dig det exakta avståndet för ditt fäste.',
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
53
|
+
'@context': 'https://schema.org',
|
|
54
|
+
'@type': 'FAQPage',
|
|
55
|
+
mainEntity: faqData.map((item) => ({
|
|
56
|
+
'@type': 'Question',
|
|
57
|
+
name: item.question,
|
|
58
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
59
|
+
})),
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const howToSchema: WithContext<HowTo> = {
|
|
63
|
+
'@context': 'https://schema.org',
|
|
64
|
+
'@type': 'HowTo',
|
|
65
|
+
name: title,
|
|
66
|
+
description,
|
|
67
|
+
step: howToData.map((step) => ({
|
|
68
|
+
'@type': 'HowToStep',
|
|
69
|
+
name: step.name,
|
|
70
|
+
text: step.text,
|
|
71
|
+
})),
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
75
|
+
'@context': 'https://schema.org',
|
|
76
|
+
'@type': 'SoftwareApplication',
|
|
77
|
+
name: title,
|
|
78
|
+
description,
|
|
79
|
+
applicationCategory: 'UtilityApplication',
|
|
80
|
+
operatingSystem: 'All',
|
|
81
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'SEK' },
|
|
82
|
+
inLanguage: 'sv',
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export const content: ToolLocaleContent<ProjectorCalculatorUI> = {
|
|
86
|
+
slug,
|
|
87
|
+
title,
|
|
88
|
+
description,
|
|
89
|
+
faqTitle: 'Vanliga Frågor',
|
|
90
|
+
faq: faqData,
|
|
91
|
+
bibliographyTitle: 'Referenser',
|
|
92
|
+
bibliography: [
|
|
93
|
+
{ name: 'Projector Central — Throw Distance Calculator', url: 'https://www.projectorcentral.com/projection-calculator-pro.cfm' },
|
|
94
|
+
{ name: 'Epson — Guide för Projektionsavstånd', url: 'https://epson.com/' },
|
|
95
|
+
],
|
|
96
|
+
howTo: howToData,
|
|
97
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
98
|
+
seo: [
|
|
99
|
+
{
|
|
100
|
+
type: 'title',
|
|
101
|
+
text: 'Bemästra Projektionens Geometri',
|
|
102
|
+
level: 2,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
type: 'paragraph',
|
|
106
|
+
html: 'Att installera på känn kan förstöra upplevelsen. För nära ger liten bild; för långt bort ger sämre ljusstyrka. Nyckeln är <strong>Throw Ratio</strong>.',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
type: 'stats',
|
|
110
|
+
items: [
|
|
111
|
+
{ value: 'TR × W', label: 'Formel för avstånd', icon: 'mdi:projector' },
|
|
112
|
+
{ value: '< 0.4', label: 'Ultra Short Throw', icon: 'mdi:arrow-collapse-horizontal' },
|
|
113
|
+
{ value: '> 2.0', label: 'Long Throw', icon: 'mdi:arrow-expand-horizontal' },
|
|
114
|
+
],
|
|
115
|
+
columns: 3,
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
type: 'comparative',
|
|
119
|
+
items: [
|
|
120
|
+
{
|
|
121
|
+
title: 'Vad är Throw Ratio?',
|
|
122
|
+
description: 'Förhållandet mellan avstånd och bildbredd. TR 1.5 betyder 1.5m avstånd per meter skärmbredd.',
|
|
123
|
+
icon: 'mdi:ruler',
|
|
124
|
+
points: ['TR < 1: Short Throw, för små rum', 'TR 1–2: Standard för vardagsrum', 'TR > 2: Long Throw, för hörsalar'],
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
title: 'Format och Proproportioner',
|
|
128
|
+
description: 'Formatet styr bildens form. Fel val ger svarta sorgkanter och slösar ljusstyrka.',
|
|
129
|
+
icon: 'mdi:aspect-ratio',
|
|
130
|
+
points: ['16:9: standard HD/4K för hemmet', '21:9: biografformat', '4:3: för kontorsbruk'],
|
|
131
|
+
},
|
|
132
|
+
],
|
|
133
|
+
columns: 2,
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
type: 'title',
|
|
137
|
+
text: 'Professionell Installation',
|
|
138
|
+
level: 3,
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
type: 'paragraph',
|
|
142
|
+
html: '<strong>Lens Shift vs Keystone:</strong> Om din projektor har Lens Shift, använd den istället för digital Keystone. Keystone sänker upplösningen.',
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
type: 'diagnostic',
|
|
146
|
+
variant: 'warning',
|
|
147
|
+
title: 'Ljus i Rummet',
|
|
148
|
+
icon: 'mdi:lightbulb-on',
|
|
149
|
+
badge: 'Pro Tip',
|
|
150
|
+
html: '<p>I ljusa rum bör du ha en skärm med högre gain för att minska kontrastförlusten.</p>',
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
type: 'summary',
|
|
154
|
+
title: 'Checklista för Installation',
|
|
155
|
+
items: [
|
|
156
|
+
'Kolla Throw Ratio innan du borrar i väggen.',
|
|
157
|
+
'Mät upp ytan på väggen för att få plats.',
|
|
158
|
+
'Sätt projektorn centrerat mot skärmen.',
|
|
159
|
+
'Undvik digital Keystone: flytta enheten fysiskt.',
|
|
160
|
+
'Se till att ingen direkt belysning träffar skärmen.',
|
|
161
|
+
],
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
ui: {
|
|
165
|
+
configTitle: 'Konfiguration',
|
|
166
|
+
configSubtitle: 'Definiera skärm och projektor',
|
|
167
|
+
labelDiagonal: 'Skärmdiagonal',
|
|
168
|
+
labelDiagonalUnit: 'Tum (")',
|
|
169
|
+
labelFormat: 'Bildformat',
|
|
170
|
+
labelThrowRatio: 'Kastförhållande (Throw Ratio)',
|
|
171
|
+
throwRatioHint: 'Exempel: 1.50 betyder 1.5m avstånd per meter bredd.',
|
|
172
|
+
ratio169Sub: 'TV / HD',
|
|
173
|
+
ratio219Sub: 'Bio',
|
|
174
|
+
ratio43Sub: 'Dokument',
|
|
175
|
+
labelWidth: 'Skärmbredd',
|
|
176
|
+
labelHeight: 'Skärmhöjd',
|
|
177
|
+
labelDistance: 'Nödvändigt Avstånd',
|
|
178
|
+
simulationBadge: 'Realtidssimulering',
|
|
179
|
+
},
|
|
180
|
+
};
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { ProjectorCalculatorUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'projektsiyon-mesafe-hesaplama';
|
|
6
|
+
const title = 'Projeksiyon Mesafe Hesaplayıcı — Atım Oranı';
|
|
7
|
+
const description =
|
|
8
|
+
'İstediğiniz ekran boyutuna ve projeksiyon cihazınızın Atım Oranı\'na (Throw Ratio) göre tam kurulum mesafesini hesaplayın.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Atım Oranı (Throw Ratio) nedir?',
|
|
13
|
+
answer:
|
|
14
|
+
'Projeksiyon cihazının belirli bir mesafeden ne kadar büyük bir görüntü oluşturacağını tanımlayan bir sayıdır. Mesafe bölü görüntü genişliği olarak hesaplanır. 1.5 oranı, 1.5m mesafeden 1m genişliğinde görüntü alacağınız anlamına gelir.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: '100 inç görüntü için ne kadar mesafe gerekir?',
|
|
18
|
+
answer:
|
|
19
|
+
'Cihazınızın atım oranına bağlıdır. 1.5:1 gibi standart bir oranda yaklaşık 3.3m gerekir. Kısa atımlı (Short Throw) bir cihazla buna 1m\'den az mesafede ulaşabilirsiniz.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: '16:9 ve 4:3 arasındaki fark nedir?',
|
|
23
|
+
answer:
|
|
24
|
+
'16:9 modern film ve diziler için geniş ekran formatıdır. 4:3 ise sunumlar için klasik formattır. Doğru olanı seçmek siyah bantları önler.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'Kurulum yüksekliği önemli mi?',
|
|
28
|
+
answer:
|
|
29
|
+
'Evet. Cihazlarda dikey kaydırma (offset) veya keystone düzeltmesi bulunur. Deformasyonu önlemek için ekranın üst veya alt kenarına ortalı kurulmalıdır.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Atım Oranını Öğrenin',
|
|
36
|
+
text: 'Cihazın kılavuzunda veya kutusunda 1.2:1 veya 1.5-1.8:1 gibi bir değer arayın.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Ekran Boyutunu Girin',
|
|
40
|
+
text: 'İstediğiniz köşegen inç değerini veya duvardaki genişliği girin.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Format Seçin',
|
|
44
|
+
text: 'Filmler için 16:9, sunumlar için 4:3 veya sinema için 21:9 seçin.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Mesafeyi Alın',
|
|
48
|
+
text: 'Hesaplayıcı, kurulum için gereken tam mesafeyi size verecektir.',
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
53
|
+
'@context': 'https://schema.org',
|
|
54
|
+
'@type': 'FAQPage',
|
|
55
|
+
mainEntity: faqData.map((item) => ({
|
|
56
|
+
'@type': 'Question',
|
|
57
|
+
name: item.question,
|
|
58
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
59
|
+
})),
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const howToSchema: WithContext<HowTo> = {
|
|
63
|
+
'@context': 'https://schema.org',
|
|
64
|
+
'@type': 'HowTo',
|
|
65
|
+
name: title,
|
|
66
|
+
description,
|
|
67
|
+
step: howToData.map((step) => ({
|
|
68
|
+
'@type': 'HowToStep',
|
|
69
|
+
name: step.name,
|
|
70
|
+
text: step.text,
|
|
71
|
+
})),
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
75
|
+
'@context': 'https://schema.org',
|
|
76
|
+
'@type': 'SoftwareApplication',
|
|
77
|
+
name: title,
|
|
78
|
+
description,
|
|
79
|
+
applicationCategory: 'UtilityApplication',
|
|
80
|
+
operatingSystem: 'All',
|
|
81
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'TRY' },
|
|
82
|
+
inLanguage: 'tr',
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export const content: ToolLocaleContent<ProjectorCalculatorUI> = {
|
|
86
|
+
slug,
|
|
87
|
+
title,
|
|
88
|
+
description,
|
|
89
|
+
faqTitle: 'Sıkça Sorulan Sorular',
|
|
90
|
+
faq: faqData,
|
|
91
|
+
bibliographyTitle: 'Kaynakça',
|
|
92
|
+
bibliography: [
|
|
93
|
+
{ name: 'Projector Central — Throw Distance Calculator', url: 'https://www.projectorcentral.com/projection-calculator-pro.cfm' },
|
|
94
|
+
{ name: 'Epson Kurulum Rehberi', url: 'https://epson.com/' },
|
|
95
|
+
],
|
|
96
|
+
howTo: howToData,
|
|
97
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
98
|
+
seo: [
|
|
99
|
+
{
|
|
100
|
+
type: 'title',
|
|
101
|
+
text: 'Projeksiyon Geometrisine Hakim Olun',
|
|
102
|
+
level: 2,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
type: 'paragraph',
|
|
106
|
+
html: 'Bir projeksiyonu rastgele kurmak deneyimi mahvedebilir. Anahtar nokta, mesafe ve görüntü boyutu arasındaki ilişkiyi belirleyen <strong>Atım Oranı\'dır</strong>.',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
type: 'stats',
|
|
110
|
+
items: [
|
|
111
|
+
{ value: 'AO × G', label: 'Mesafe Formülü', icon: 'mdi:projector' },
|
|
112
|
+
{ value: '< 0.4', label: 'Ultra Kısa Atımlı', icon: 'mdi:arrow-collapse-horizontal' },
|
|
113
|
+
{ value: '> 2.0', label: 'Uzun Atımlı', icon: 'mdi:arrow-expand-horizontal' },
|
|
114
|
+
],
|
|
115
|
+
columns: 3,
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
type: 'comparative',
|
|
119
|
+
items: [
|
|
120
|
+
{
|
|
121
|
+
title: 'Atım Oranı (Throw Ratio) Nedir?',
|
|
122
|
+
description: 'Mesafe ile genişlik arasındaki orandır. 1.5 AO, her 1 metre genişlik için 1.5 metre mesafe gerektiği anlamına gelir.',
|
|
123
|
+
icon: 'mdi:ruler',
|
|
124
|
+
points: ['AO < 1: Kısa atımlı, dar alanlar için ideal', 'AO 1–2: Oturma odaları için standart', 'AO > 2: Büyük salonlar için uzun atımlı'],
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
title: 'Format ve En Boy Oranı',
|
|
128
|
+
description: 'Format, görüntünün oranlarını belirler. Yanlış format siyah bantlara ve parlaklık kaybına neden olur.',
|
|
129
|
+
icon: 'mdi:aspect-ratio',
|
|
130
|
+
points: ['16:9: Sinema ve dizi için HD/4K standardı', '21:9: Geniş sinema formatı', '4:3: Ofis sunumları için'],
|
|
131
|
+
},
|
|
132
|
+
],
|
|
133
|
+
columns: 2,
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
type: 'title',
|
|
137
|
+
text: 'Profesyonel Kurulum',
|
|
138
|
+
level: 3,
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
type: 'paragraph',
|
|
142
|
+
html: '<strong>Lens Shift vs Keystone:</strong> Eğer cihazınızda Lens Shift varsa, dijital Keystone yerine her zaman onu kullanın. Keystone çözünürlüğü düşürür.',
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
type: 'diagnostic',
|
|
146
|
+
variant: 'warning',
|
|
147
|
+
title: 'Ortam Işığı',
|
|
148
|
+
icon: 'mdi:lightbulb-on',
|
|
149
|
+
badge: 'Pro İpucu',
|
|
150
|
+
html: '<p>Aydınlık odalarda kontrast kaybını önlemek için yüksek kazançlı (>1.0) bir perde kullanın.</p>',
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
type: 'summary',
|
|
154
|
+
title: 'Kurulum Kontrol Listesi',
|
|
155
|
+
items: [
|
|
156
|
+
'Yer seçmeden önce cihazın Atım Oranı\'nı not edin.',
|
|
157
|
+
'Duvardaki boş alanı ölçün.',
|
|
158
|
+
'Cihazı ekrana göre dikeyde ortalayın.',
|
|
159
|
+
'Dijital keystone\'dan kaçının: fiziksel konumu düzeltin.',
|
|
160
|
+
'Ekrana doğrudan gelen ışık kaynaklarını engelleyin.',
|
|
161
|
+
],
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
ui: {
|
|
165
|
+
configTitle: 'Yapılandırma',
|
|
166
|
+
configSubtitle: 'Ekran ve cihazı tanımlayın',
|
|
167
|
+
labelDiagonal: 'Ekran Köşegeni',
|
|
168
|
+
labelDiagonalUnit: 'İnç (")',
|
|
169
|
+
labelFormat: 'Format',
|
|
170
|
+
labelThrowRatio: 'Atım Oranı (Throw Ratio)',
|
|
171
|
+
throwRatioHint: 'Örnek: 1.50 değeri, 1m genişlik için 1.5m mesafe gerektiğini ifade eder.',
|
|
172
|
+
ratio169Sub: 'TV / HD',
|
|
173
|
+
ratio219Sub: 'Sinema',
|
|
174
|
+
ratio43Sub: 'Retro',
|
|
175
|
+
labelWidth: 'Ekran Genişliği',
|
|
176
|
+
labelHeight: 'Ekran Yüksekliği',
|
|
177
|
+
labelDistance: 'Gereken Mesafe',
|
|
178
|
+
simulationBadge: 'Gerçek Zamanlı Simülasyon',
|
|
179
|
+
},
|
|
180
|
+
};
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { ProjectorCalculatorUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'projector-throw-calculator';
|
|
6
|
+
const title = '投影机距离计算器 — 投射比与屏幕';
|
|
7
|
+
const description =
|
|
8
|
+
'根据所需的屏幕尺寸和投影机投射比(Throw Ratio)计算精确的安装距离。支持实时模拟的视觉化工具。';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: '什么是投射比(Throw Ratio)?',
|
|
13
|
+
answer:
|
|
14
|
+
'投射比定义了投影机在特定距离下能投射出多大的画面。计算公式为“投射距离 ÷ 画面宽度”。例如,投射比为 1.5 意味着从 1.5 米外投影,可以获得 1 米宽的画面。',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: '100 英寸的屏幕需要多远的距离?',
|
|
18
|
+
answer:
|
|
19
|
+
'这取决于投影机的投射比。如果投射比是标准的 1.5:1,大约需要 3.3 米。如果是短焦投影机(Short Throw),距离可以缩短到 1 米以内。',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: '16:9 和 4:3 有什么区别?',
|
|
23
|
+
answer:
|
|
24
|
+
'16:9 是现代电影和电视剧使用的宽屏格式。4:3 是传统演示文稿使用的比例。选择正确的比例可以避免出现过大的黑边。',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: '安装投影机的高度重要吗?',
|
|
28
|
+
answer:
|
|
29
|
+
'非常重要。投影机通常有垂直偏移或梯形校正。理想状态是投影机对准屏幕的上边缘或下边缘中央,以避免图像变形。',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: '查询投射比',
|
|
36
|
+
text: '在投影机机身、手册或包装盒上查找类似“1.2:1”或“1.5-1.8:1”的数值。',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: '确定屏幕尺寸',
|
|
40
|
+
text: '输入您想要的对角线英寸数或墙面可用的宽度。',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: '选择画面比例',
|
|
44
|
+
text: '看电影或剧集选 16:9,办公演示选 4:3,追求院线感选 21:9。',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: '获取安装距离',
|
|
48
|
+
text: '计算器将给出安装投影机支架的确切距离。',
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
53
|
+
'@context': 'https://schema.org',
|
|
54
|
+
'@type': 'FAQPage',
|
|
55
|
+
mainEntity: faqData.map((item) => ({
|
|
56
|
+
'@type': 'Question',
|
|
57
|
+
name: item.question,
|
|
58
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
59
|
+
})),
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const howToSchema: WithContext<HowTo> = {
|
|
63
|
+
'@context': 'https://schema.org',
|
|
64
|
+
'@type': 'HowTo',
|
|
65
|
+
name: title,
|
|
66
|
+
description,
|
|
67
|
+
step: howToData.map((step) => ({
|
|
68
|
+
'@type': 'HowToStep',
|
|
69
|
+
name: step.name,
|
|
70
|
+
text: step.text,
|
|
71
|
+
})),
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
75
|
+
'@context': 'https://schema.org',
|
|
76
|
+
'@type': 'SoftwareApplication',
|
|
77
|
+
name: title,
|
|
78
|
+
description,
|
|
79
|
+
applicationCategory: 'UtilityApplication',
|
|
80
|
+
operatingSystem: 'All',
|
|
81
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'CNY' },
|
|
82
|
+
inLanguage: 'zh',
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export const content: ToolLocaleContent<ProjectorCalculatorUI> = {
|
|
86
|
+
slug,
|
|
87
|
+
title,
|
|
88
|
+
description,
|
|
89
|
+
faqTitle: '常见问题',
|
|
90
|
+
faq: faqData,
|
|
91
|
+
bibliographyTitle: '参考资料',
|
|
92
|
+
bibliography: [
|
|
93
|
+
{ name: 'Projector Central — 投射距离计算器', url: 'https://www.projectorcentral.com/projection-calculator-pro.cfm' },
|
|
94
|
+
{ name: 'Epson 投影安装指南', url: 'https://epson.com/' },
|
|
95
|
+
],
|
|
96
|
+
howTo: howToData,
|
|
97
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
98
|
+
seo: [
|
|
99
|
+
{
|
|
100
|
+
type: 'title',
|
|
101
|
+
text: '掌控投影几何学',
|
|
102
|
+
level: 2,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
type: 'paragraph',
|
|
106
|
+
html: '凭直觉安装投影机可能会毁掉观影体验。太近画面太小,太远则亮度不足。核心在于 <strong>投射比(Throw Ratio)</strong>,它精确定义了距离与画面尺寸的关系。',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
type: 'stats',
|
|
110
|
+
items: [
|
|
111
|
+
{ value: 'TR × W', label: '距离公式', icon: 'mdi:projector' },
|
|
112
|
+
{ value: '< 0.4', label: '超短焦', icon: 'mdi:arrow-collapse-horizontal' },
|
|
113
|
+
{ value: '> 2.0', label: '长焦', icon: 'mdi:arrow-expand-horizontal' },
|
|
114
|
+
],
|
|
115
|
+
columns: 3,
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
type: 'comparative',
|
|
119
|
+
items: [
|
|
120
|
+
{
|
|
121
|
+
title: '什么是投射比?',
|
|
122
|
+
description: '投射比是投影距离与画面宽度的比值。TR 为 1.5 意味着每 1 米画面宽度需要 1.5 米的投影距离。',
|
|
123
|
+
icon: 'mdi:ruler',
|
|
124
|
+
points: ['TR < 1: 短焦,适合小空间', 'TR 1–2: 客厅及会议室标准', 'TR > 2: 长焦,适合大型礼堂'],
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
title: '画面格式与比例',
|
|
128
|
+
description: '画面格式决定了投影比例。使用错误的比例会导致出现黑边,并浪费投影亮度。',
|
|
129
|
+
icon: 'mdi:aspect-ratio',
|
|
130
|
+
points: ['16:9: 现代电影与游戏的标准高清比例', '21:9: 宽屏幕电影院格式', '4:3: 办公演示与老式投影比例'],
|
|
131
|
+
},
|
|
132
|
+
],
|
|
133
|
+
columns: 2,
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
type: 'title',
|
|
137
|
+
text: '专业安装建议',
|
|
138
|
+
level: 3,
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
type: 'paragraph',
|
|
142
|
+
html: '<strong>镜头位移 (Lens Shift) vs 梯形校正:</strong> 如果投影机支持镜头位移,请务必优先使用,而不是使用数字梯形校正。梯形校正会损失分辨率。',
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
type: 'diagnostic',
|
|
146
|
+
variant: 'warning',
|
|
147
|
+
title: '环境光与幕布增益',
|
|
148
|
+
icon: 'mdi:lightbulb-on',
|
|
149
|
+
badge: '专业贴士',
|
|
150
|
+
html: '<p>在光线较亮的房间,考虑使用高增益(>1.0)幕布来补偿对比度的损失。</p>',
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
type: 'summary',
|
|
154
|
+
title: '安装自查清单',
|
|
155
|
+
items: [
|
|
156
|
+
'安装前先确认投影机的确切投射比。',
|
|
157
|
+
'核对墙面可用空间,确保能放下目标尺寸。',
|
|
158
|
+
'尽量使投影机光轴垂直并对准幕布中心。',
|
|
159
|
+
'避免数字校正:优先通过物理位置调整。',
|
|
160
|
+
'确保屏幕上没有直射光源干扰。',
|
|
161
|
+
],
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
ui: {
|
|
165
|
+
configTitle: '参数配置',
|
|
166
|
+
configSubtitle: '设置您的幕布与投影机',
|
|
167
|
+
labelDiagonal: '幕布对角线',
|
|
168
|
+
labelDiagonalUnit: '英寸 (")',
|
|
169
|
+
labelFormat: '画面比例',
|
|
170
|
+
labelThrowRatio: '投射比(Throw Ratio)',
|
|
171
|
+
throwRatioHint: '参考投影机手册。例如:1.50 表示每 1 米宽度需 1.5 米距离。',
|
|
172
|
+
ratio169Sub: '高清电视',
|
|
173
|
+
ratio219Sub: '宽银幕',
|
|
174
|
+
ratio43Sub: '普通/办公',
|
|
175
|
+
labelWidth: '屏幕宽度',
|
|
176
|
+
labelHeight: '屏幕高度',
|
|
177
|
+
labelDistance: '需安装距离',
|
|
178
|
+
simulationBadge: '实时模拟预测',
|
|
179
|
+
},
|
|
180
|
+
};
|
|
@@ -7,9 +7,6 @@ import type { ProjectorCalculatorUI } from './ui';
|
|
|
7
7
|
|
|
8
8
|
export type ProjectorCalculatorLocaleContent = ToolLocaleContent<ProjectorCalculatorUI>;
|
|
9
9
|
|
|
10
|
-
import { content as es } from './i18n/es';
|
|
11
|
-
import { content as en } from './i18n/en';
|
|
12
|
-
import { content as fr } from './i18n/fr';
|
|
13
10
|
|
|
14
11
|
export const projectorCalculator: HomeToolEntry<ProjectorCalculatorUI> = {
|
|
15
12
|
id: 'projector-calculator',
|
|
@@ -18,9 +15,21 @@ export const projectorCalculator: HomeToolEntry<ProjectorCalculatorUI> = {
|
|
|
18
15
|
fg: 'mdi:ruler',
|
|
19
16
|
},
|
|
20
17
|
i18n: {
|
|
21
|
-
|
|
22
|
-
en: async () => en,
|
|
23
|
-
|
|
18
|
+
de: async () => (await import('./i18n/de')).content,
|
|
19
|
+
en: async () => (await import('./i18n/en')).content,
|
|
20
|
+
es: async () => (await import('./i18n/es')).content,
|
|
21
|
+
fr: async () => (await import('./i18n/fr')).content,
|
|
22
|
+
id: async () => (await import('./i18n/id')).content,
|
|
23
|
+
it: async () => (await import('./i18n/it')).content,
|
|
24
|
+
ja: async () => (await import('./i18n/ja')).content,
|
|
25
|
+
ko: async () => (await import('./i18n/ko')).content,
|
|
26
|
+
nl: async () => (await import('./i18n/nl')).content,
|
|
27
|
+
pl: async () => (await import('./i18n/pl')).content,
|
|
28
|
+
pt: async () => (await import('./i18n/pt')).content,
|
|
29
|
+
ru: async () => (await import('./i18n/ru')).content,
|
|
30
|
+
sv: async () => (await import('./i18n/sv')).content,
|
|
31
|
+
tr: async () => (await import('./i18n/tr')).content,
|
|
32
|
+
zh: async () => (await import('./i18n/zh')).content,
|
|
24
33
|
},
|
|
25
34
|
};
|
|
26
35
|
|