@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,151 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { QRGeneratorUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'qr-generator';
|
|
6
|
+
const title = '오프라인 QR 코드 생성기';
|
|
7
|
+
const description =
|
|
8
|
+
'WiFi, URL, 연락처용 QR 코드를 웹 브라우저에서 100% 안전하게 생성하세요. 데이터가 기기 외부로 유출되지 않습니다.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'QR 코드에 유효 기간이 있나요?',
|
|
13
|
+
answer:
|
|
14
|
+
'아니요. 여기서 생성되는 코드는 정적(static)입니다. 코드가 이미지 내에 직접 포함되어 있어 외부 링크에 의존하지 않으며 영구적으로 작동합니다.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: '입력한 데이터가 저장되나요?',
|
|
18
|
+
answer:
|
|
19
|
+
'절대 저장되지 않습니다. 모든 과정은 브라우저(클라이언트) 내에서 이루어지며, 서버로 데이터를 전송하지 않아 100% 개인정보가 보호됩니다.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'iPhone이나 Android에서 사용할 수 있나요?',
|
|
23
|
+
answer:
|
|
24
|
+
'네. 대부분의 최신 스마트폰 카메라는 QR 코드를 기본적으로 인식하며, 해당 액션(WiFi 연결, 링크 열기 등)을 바로 제안합니다.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: '인터넷 없이도 사용할 수 있나요?',
|
|
28
|
+
answer:
|
|
29
|
+
'네. 일단 페이지가 로드되면, 인터넷 연결을 끊어도 생성기는 문제없이 작동합니다.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'QR 타입 선택',
|
|
36
|
+
text: 'WiFi 네트워크, URL 링크, 또는 연락처(vCard) 중 원하는 타입을 선택합니다.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: '정보 입력',
|
|
40
|
+
text: '네트워크 이름, 비밀번호, 웹 주소 등 필요한 정보를 입력합니다.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: '생성 및 확인',
|
|
44
|
+
text: 'QR 코드가 즉시 생성됩니다. 화면을 직접 스캔하여 제대로 작동하는지 확인하세요.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: '다운로드',
|
|
48
|
+
text: '인쇄하거나 디지털로 공유하기 위해 QR 코드를 이미지 파일로 저장합니다.',
|
|
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: 'KRW' },
|
|
82
|
+
inLanguage: 'ko',
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export const content: ToolLocaleContent<QRGeneratorUI> = {
|
|
86
|
+
slug,
|
|
87
|
+
title,
|
|
88
|
+
description,
|
|
89
|
+
faqTitle: '자주 묻는 질문',
|
|
90
|
+
faq: faqData,
|
|
91
|
+
bibliographyTitle: '참고 자료',
|
|
92
|
+
bibliography: [
|
|
93
|
+
{ name: 'node-qrcode 라이브러리', url: 'https://github.com/soldair/node-qrcode' },
|
|
94
|
+
{ name: 'vCard 표준 규격 (RFC 6350)', url: 'https://www.rfc-editor.org/rfc/rfc6350' },
|
|
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: '이 도구는 기기 내에서 직접 QR 코드를 생성합니다. <strong>WiFi 비밀번호</strong>나 <strong>개인 정보</strong>가 외부로 유출될 걱정이 없습니다.',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
type: 'stats',
|
|
110
|
+
items: [
|
|
111
|
+
{ value: '100%', label: '보안 완벽', icon: 'mdi:shield-lock' },
|
|
112
|
+
{ value: '오프라인', label: '서버 무관', icon: 'mdi:wifi-off' },
|
|
113
|
+
{ value: 'PNG', label: '이미지 저장', icon: 'mdi:download' },
|
|
114
|
+
],
|
|
115
|
+
columns: 3,
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
type: 'summary',
|
|
119
|
+
title: '사용 팁',
|
|
120
|
+
items: [
|
|
121
|
+
'모든 데이터는 브라우저 안에서만 처리됩니다.',
|
|
122
|
+
'WiFi 이름(SSID)과 비밀번호는 대소문자를 구분합니다.',
|
|
123
|
+
'정적 QR은 비밀번호가 바뀌면 새로 생성해야 합니다.',
|
|
124
|
+
'인쇄하기 전에 항상 화면을 직접 스캔하여 테스트하세요.',
|
|
125
|
+
],
|
|
126
|
+
},
|
|
127
|
+
],
|
|
128
|
+
ui: {
|
|
129
|
+
tabWifi: 'WiFi',
|
|
130
|
+
tabUrl: 'URL',
|
|
131
|
+
tabContact: '연락처',
|
|
132
|
+
labelSsid: '네트워크 이름(SSID)',
|
|
133
|
+
labelPassword: '비밀번호',
|
|
134
|
+
labelEncryption: '보안 방식',
|
|
135
|
+
labelHidden: '숨겨진 네트워크',
|
|
136
|
+
labelUrl: '웹사이트 주소(URL)',
|
|
137
|
+
labelName: '이름',
|
|
138
|
+
labelSurname: '성',
|
|
139
|
+
labelPhone: '전화번호',
|
|
140
|
+
labelEmail: '이메일',
|
|
141
|
+
labelOrg: '조직/회사명',
|
|
142
|
+
encWpa: 'WPA/WPA2',
|
|
143
|
+
encWep: 'WEP',
|
|
144
|
+
encNone: '없음',
|
|
145
|
+
downloadBtn: 'PNG 저장',
|
|
146
|
+
privacyMsg: '브라우저 내에서 100% 생성. 데이터는 안전합니다.',
|
|
147
|
+
placeholderSsid: '우리집WiFi_5G',
|
|
148
|
+
placeholderUrl: 'https://example.com',
|
|
149
|
+
placeholderPassword: '••••••••',
|
|
150
|
+
},
|
|
151
|
+
};
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { QRGeneratorUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'offline-qr-code-generator-dutch';
|
|
6
|
+
const title = 'Offline QR Code Generator';
|
|
7
|
+
const description =
|
|
8
|
+
'Genereer 100% veilig QR-codes voor WiFi, URL\'s en contacten in uw browser. Uw gegevens ver laten uw apparaat nooit.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Verlopen deze QR-codes?',
|
|
13
|
+
answer:
|
|
14
|
+
'Nee. Deze codes zijn statisch. De informatie is direct in de afbeelding gecodeerd. Ze werken voor altijd.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Worden mijn gegevens bewaard?',
|
|
18
|
+
answer:
|
|
19
|
+
'Absoluut niet. Het proces vindt volledig plaats in uw browser (Client-Side). Geen gegevens worden naar onze servers gestuurd.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Werkt het op iPhone en Android?',
|
|
23
|
+
answer:
|
|
24
|
+
'Ja. Moderne camera\'s op iOS en Android herkennen QR-codes direct en suggereren de actie (verbinden met WiFi, link openen, etc.).',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'Kan ik het zonder internet gebruiken?',
|
|
28
|
+
answer:
|
|
29
|
+
'Ja. Zodra de pagina geladen is, kunt u de verbinding verbreken en de generator blijft gewoon werken.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Kies type QR',
|
|
36
|
+
text: 'Selecteer of u een code wilt voor WiFi, een URL of een contact (vCard).',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Voer gegevens in',
|
|
40
|
+
text: 'Vul de velden in, zoals netwerknaam en wachtwoord, of het webadres.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Genereer en test',
|
|
44
|
+
text: 'De code wordt direct gemaakt. Scan hem direct vanaf het scherm om te testen.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Downloaden',
|
|
48
|
+
text: 'Sla de QR-code op als afbeelding om te printen of te delen.',
|
|
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: 'EUR' },
|
|
82
|
+
inLanguage: 'nl',
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export const content: ToolLocaleContent<QRGeneratorUI> = {
|
|
86
|
+
slug,
|
|
87
|
+
title,
|
|
88
|
+
description,
|
|
89
|
+
faqTitle: 'Veelgestelde Vragen',
|
|
90
|
+
faq: faqData,
|
|
91
|
+
bibliographyTitle: 'Referenties',
|
|
92
|
+
bibliography: [
|
|
93
|
+
{ name: 'node-qrcode library', url: 'https://github.com/soldair/node-qrcode' },
|
|
94
|
+
{ name: 'vCard Standard v3.0', url: 'https://www.rfc-editor.org/rfc/rfc6350' },
|
|
95
|
+
],
|
|
96
|
+
howTo: howToData,
|
|
97
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
98
|
+
seo: [
|
|
99
|
+
{
|
|
100
|
+
type: 'title',
|
|
101
|
+
text: 'Privacy Eerst: Lokale Generatie',
|
|
102
|
+
level: 2,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
type: 'paragraph',
|
|
106
|
+
html: 'Deze tool genereert QR-codes direct op uw toestel. Veilig voor uw <strong>WiFi-wachtwoorden</strong> of <strong>persoonlijke gegevens</strong>.',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
type: 'stats',
|
|
110
|
+
items: [
|
|
111
|
+
{ value: '100%', label: 'Privé', icon: 'mdi:shield-lock' },
|
|
112
|
+
{ value: 'Offline', label: 'Geen Server', icon: 'mdi:wifi-off' },
|
|
113
|
+
{ value: 'PNG', label: 'Download', icon: 'mdi:download' },
|
|
114
|
+
],
|
|
115
|
+
columns: 3,
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
type: 'summary',
|
|
119
|
+
title: 'Gebruikstips',
|
|
120
|
+
items: [
|
|
121
|
+
'Gegevens worden alleen in de browser verwerkt.',
|
|
122
|
+
'Let op hoofdletters bij de WiFi-naam.',
|
|
123
|
+
'Statische QR: bij een nieuw wachtwoord moet u een nieuwe QR maken.',
|
|
124
|
+
'Test de code altijd even voor u hem print.',
|
|
125
|
+
],
|
|
126
|
+
},
|
|
127
|
+
],
|
|
128
|
+
ui: {
|
|
129
|
+
tabWifi: 'WiFi',
|
|
130
|
+
tabUrl: 'URL',
|
|
131
|
+
tabContact: 'Contact',
|
|
132
|
+
labelSsid: 'Netwerknaam (SSID)',
|
|
133
|
+
labelPassword: 'Wachtwoord',
|
|
134
|
+
labelEncryption: 'Beveiliging',
|
|
135
|
+
labelHidden: 'Verborgen netwerk',
|
|
136
|
+
labelUrl: 'Webadres (URL)',
|
|
137
|
+
labelName: 'Voornaam',
|
|
138
|
+
labelSurname: 'Achternaam',
|
|
139
|
+
labelPhone: 'Telefoon',
|
|
140
|
+
labelEmail: 'Email',
|
|
141
|
+
labelOrg: 'Organisatie / Bedrijf',
|
|
142
|
+
encWpa: 'WPA/WPA2',
|
|
143
|
+
encWep: 'WEP',
|
|
144
|
+
encNone: 'Geen',
|
|
145
|
+
downloadBtn: 'PNG downloaden',
|
|
146
|
+
privacyMsg: '100% gegenereerd in de browser. Veilig en privé.',
|
|
147
|
+
placeholderSsid: 'MijnWiFi_5G',
|
|
148
|
+
placeholderUrl: 'https://voorbeeld.nl',
|
|
149
|
+
placeholderPassword: '••••••••',
|
|
150
|
+
},
|
|
151
|
+
};
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { QRGeneratorUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'generator-kodow-qr-offline';
|
|
6
|
+
const title = 'Generator Kodów QR Offline';
|
|
7
|
+
const description =
|
|
8
|
+
'Generuj kody QR dla WiFi, URL i Kontaktów w 100% bezpiecznie w swojej przeglądarce. Twoje dane nigdy nie opuszczają urządzenia.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Czy te kody QR wygasają?',
|
|
13
|
+
answer:
|
|
14
|
+
'Nie. Wygenerowane tutaj kody są statyczne. Informacja jest zakodowana bezpośrednio w obrazie. Będą działać na zawsze.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Czy zapisujecie moje dane?',
|
|
18
|
+
answer:
|
|
19
|
+
'Absolutnie nie. Cały proces odbywa się w Twojej przeglądarce (Client-Side). Żadne dane nie są wysyłane na serwer.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Czy to działa na iPhone i Android?',
|
|
23
|
+
answer:
|
|
24
|
+
'Tak. Większość nowoczesnych smartfonów czyta kody QR natywnie i sugeruje akcję (połącz z WiFi, otwórz link itp.).',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'Czy mogę używać tego bez internetu?',
|
|
28
|
+
answer:
|
|
29
|
+
'Tak. Gdy strona się załaduje, możesz odłączyć sieć, a generator nadal będzie tworzył kody.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Wybierz typ QR',
|
|
36
|
+
text: 'Wybierz czy chcesz kod dla sieci WiFi, linku URL czy kontaktu (vCard).',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Wpisz dane',
|
|
40
|
+
text: 'Wypełnij pola, takie jak nazwa sieci i hasło, lub adres strony.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Generuj i sprawdź',
|
|
44
|
+
text: 'Kod powstaje natychmiast. Możesz go przetestować skanując go prosto z ekranu.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Pobierz',
|
|
48
|
+
text: 'Zapisz kod QR jako obraz, aby go wydrukować lub udostępnić.',
|
|
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: 'PLN' },
|
|
82
|
+
inLanguage: 'pl',
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export const content: ToolLocaleContent<QRGeneratorUI> = {
|
|
86
|
+
slug,
|
|
87
|
+
title,
|
|
88
|
+
description,
|
|
89
|
+
faqTitle: 'Często Zadawane Pytania',
|
|
90
|
+
faq: faqData,
|
|
91
|
+
bibliographyTitle: 'Bibliografia',
|
|
92
|
+
bibliography: [
|
|
93
|
+
{ name: 'biblioteka node-qrcode', url: 'https://github.com/soldair/node-qrcode' },
|
|
94
|
+
{ name: 'Specyfikacja vCard (RFC 6350)', url: 'https://www.rfc-editor.org/rfc/rfc6350' },
|
|
95
|
+
],
|
|
96
|
+
howTo: howToData,
|
|
97
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
98
|
+
seo: [
|
|
99
|
+
{
|
|
100
|
+
type: 'title',
|
|
101
|
+
text: 'Prywatność Przede Wszystkim: Generowanie Lokalne',
|
|
102
|
+
level: 2,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
type: 'paragraph',
|
|
106
|
+
html: 'To narzędzie tworzy kod QR bezpośrednio na Twoim urządzeniu. Pełne bezpieczeństwo dla Twoich <strong>haseł WiFi</strong> i <strong>danych kontaktowych</strong>.',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
type: 'stats',
|
|
110
|
+
items: [
|
|
111
|
+
{ value: '100%', label: 'Prywatnie', icon: 'mdi:shield-lock' },
|
|
112
|
+
{ value: 'Offline', label: 'Brak Serwera', icon: 'mdi:wifi-off' },
|
|
113
|
+
{ value: 'PNG', label: 'Pobieranie', icon: 'mdi:download' },
|
|
114
|
+
],
|
|
115
|
+
columns: 3,
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
type: 'summary',
|
|
119
|
+
title: 'Porady',
|
|
120
|
+
items: [
|
|
121
|
+
'Dane przetwarzane wyłącznie lokalnie w przeglądarce.',
|
|
122
|
+
'Pamiętaj o wielkości liter w nazwie WiFi.',
|
|
123
|
+
'Kody statyczne: zmiana danych wymaga nowego kodu.',
|
|
124
|
+
'Przetestuj kod przed drukowaniem.',
|
|
125
|
+
],
|
|
126
|
+
},
|
|
127
|
+
],
|
|
128
|
+
ui: {
|
|
129
|
+
tabWifi: 'WiFi',
|
|
130
|
+
tabUrl: 'URL',
|
|
131
|
+
tabContact: 'Kontakt',
|
|
132
|
+
labelSsid: 'Nazwa Sieci (SSID)',
|
|
133
|
+
labelPassword: 'Hasło',
|
|
134
|
+
labelEncryption: 'Zabezpieczenia',
|
|
135
|
+
labelHidden: 'Ukryta Sieć',
|
|
136
|
+
labelUrl: 'Adres WWW (URL)',
|
|
137
|
+
labelName: 'Imię',
|
|
138
|
+
labelSurname: 'Nazwisko',
|
|
139
|
+
labelPhone: 'Telefon',
|
|
140
|
+
labelEmail: 'Email',
|
|
141
|
+
labelOrg: 'Organizacja / Firma',
|
|
142
|
+
encWpa: 'WPA/WPA2',
|
|
143
|
+
encWep: 'WEP',
|
|
144
|
+
encNone: 'Brak',
|
|
145
|
+
downloadBtn: 'Pobierz PNG',
|
|
146
|
+
privacyMsg: 'Wygenerowane w 100% w przeglądarce. Dane są bezpieczne.',
|
|
147
|
+
placeholderSsid: 'MojaSiec_5G',
|
|
148
|
+
placeholderUrl: 'https://przyklad.pl',
|
|
149
|
+
placeholderPassword: '••••••••',
|
|
150
|
+
},
|
|
151
|
+
};
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { QRGeneratorUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'gerador-codigos-qr-offline';
|
|
6
|
+
const title = 'Gerador de Códigos QR Offline';
|
|
7
|
+
const description =
|
|
8
|
+
'Gere códigos QR para WiFi, URLs e Contactos de forma 100% segura no seu navegador. Os seus dados nunca saem do seu dispositivo.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Estes códigos QR expiram?',
|
|
13
|
+
answer:
|
|
14
|
+
'Não. Os códigos gerados aqui são estáticos. A informação está codificada diretamente na imagem e não depende de ligações externas. Funcionam para sempre.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Guardam os meus dados?',
|
|
18
|
+
answer:
|
|
19
|
+
'Absolutamente não. Todo o processo ocorre no seu navegador (Client-Side). Nenhum dado é enviado para os nossos servidores.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Funciona no iPhone e Android?',
|
|
23
|
+
answer:
|
|
24
|
+
'Sim. A maioria das câmaras modernas lê códigos QR de forma nativa e sugere a ação correspondente (ligar ao WiFi, abrir link, etc.).',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'Posso usar sem internet?',
|
|
28
|
+
answer:
|
|
29
|
+
'Sim. Uma vez carregada a página, pode desligar o WiFi e o gerador continuará a funcionar perfeitamente.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Escolher tipo de QR',
|
|
36
|
+
text: 'Selecione se quer um código para uma rede WiFi, um link URL ou um contacto (vCard).',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Introduzir dados',
|
|
40
|
+
text: 'Preencha os campos necessários, como o nome da rede e a password, ou o endereço web.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Gerar e verificar',
|
|
44
|
+
text: 'O código é gerado instantaneamente. Pode testar o scan diretamente no ecrã.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Descarregar',
|
|
48
|
+
text: 'Guarde o código QR como imagem para imprimir ou partilhar.',
|
|
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: 'EUR' },
|
|
82
|
+
inLanguage: 'pt',
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export const content: ToolLocaleContent<QRGeneratorUI> = {
|
|
86
|
+
slug,
|
|
87
|
+
title,
|
|
88
|
+
description,
|
|
89
|
+
faqTitle: 'Perguntas Frequentes',
|
|
90
|
+
faq: faqData,
|
|
91
|
+
bibliographyTitle: 'Bibliografia',
|
|
92
|
+
bibliography: [
|
|
93
|
+
{ name: 'node-qrcode library', url: 'https://github.com/soldair/node-qrcode' },
|
|
94
|
+
{ name: 'RFC 6350: vCard specification', url: 'https://www.rfc-editor.org/rfc/rfc6350' },
|
|
95
|
+
],
|
|
96
|
+
howTo: howToData,
|
|
97
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
98
|
+
seo: [
|
|
99
|
+
{
|
|
100
|
+
type: 'title',
|
|
101
|
+
text: 'Privacidade Primeiro: Geração Local',
|
|
102
|
+
level: 2,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
type: 'paragraph',
|
|
106
|
+
html: 'Esta ferramenta gera o código QR diretamente no seu dispositivo. Segurança total para as suas <strong>palavras-passe WiFi</strong> ou <strong>dados pessoais</strong>.',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
type: 'stats',
|
|
110
|
+
items: [
|
|
111
|
+
{ value: '100%', label: 'Privado', icon: 'mdi:shield-lock' },
|
|
112
|
+
{ value: 'Offline', label: 'Sem Servidor', icon: 'mdi:wifi-off' },
|
|
113
|
+
{ value: 'PNG', label: 'Download', icon: 'mdi:download' },
|
|
114
|
+
],
|
|
115
|
+
columns: 3,
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
type: 'summary',
|
|
119
|
+
title: 'Dicas de Utilização',
|
|
120
|
+
items: [
|
|
121
|
+
'Dados processados apenas no navegador.',
|
|
122
|
+
'Atenção a maiúsculas/minúsculas no nome da rede.',
|
|
123
|
+
'QR codes estáticos: se mudar a pass, gere um novo.',
|
|
124
|
+
'Teste sempre o scan antes de imprimir.',
|
|
125
|
+
],
|
|
126
|
+
},
|
|
127
|
+
],
|
|
128
|
+
ui: {
|
|
129
|
+
tabWifi: 'WiFi',
|
|
130
|
+
tabUrl: 'URL',
|
|
131
|
+
tabContact: 'Contacto',
|
|
132
|
+
labelSsid: 'Nome da Rede (SSID)',
|
|
133
|
+
labelPassword: 'Palavra-passe',
|
|
134
|
+
labelEncryption: 'Segurança',
|
|
135
|
+
labelHidden: 'Rede Oculta',
|
|
136
|
+
labelUrl: 'Endereço Web (URL)',
|
|
137
|
+
labelName: 'Nome',
|
|
138
|
+
labelSurname: 'Apelido',
|
|
139
|
+
labelPhone: 'Telefone',
|
|
140
|
+
labelEmail: 'Email',
|
|
141
|
+
labelOrg: 'Organização / Empresa',
|
|
142
|
+
encWpa: 'WPA/WPA2',
|
|
143
|
+
encWep: 'WEP',
|
|
144
|
+
encNone: 'Nenhuma',
|
|
145
|
+
downloadBtn: 'Descarregar PNG',
|
|
146
|
+
privacyMsg: 'Gerado 100% no seu navegador. Dados seguros.',
|
|
147
|
+
placeholderSsid: 'MinhaRede_5G',
|
|
148
|
+
placeholderUrl: 'https://exemplo.pt',
|
|
149
|
+
placeholderPassword: '••••••••',
|
|
150
|
+
},
|
|
151
|
+
};
|