@jjlmoya/utils-tools 1.1.0 → 1.3.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 +2 -1
- package/src/category/i18n/de.ts +172 -0
- package/src/category/i18n/id.ts +172 -0
- package/src/category/i18n/it.ts +172 -0
- package/src/category/i18n/ja.ts +172 -0
- package/src/category/i18n/ko.ts +172 -0
- package/src/category/i18n/nl.ts +172 -0
- package/src/category/i18n/pl.ts +172 -0
- package/src/category/i18n/pt.ts +172 -0
- package/src/category/i18n/ru.ts +172 -0
- package/src/category/i18n/sv.ts +172 -0
- package/src/category/i18n/tr.ts +172 -0
- package/src/category/i18n/zh.ts +172 -0
- package/src/category/index.ts +13 -1
- package/src/tests/i18n_coverage.test.ts +36 -0
- package/src/tests/locale_completeness.test.ts +1 -1
- package/src/tests/slug_uniqueness.test.ts +81 -0
- package/src/tests/title_quality.test.ts +0 -1
- package/src/tool/date-diff-calculator/i18n/de.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/fr.ts +1 -1
- package/src/tool/date-diff-calculator/i18n/id.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/it.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/ja.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/ko.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/nl.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/pl.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/pt.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/ru.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/sv.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/tr.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/zh.ts +132 -0
- package/src/tool/date-diff-calculator/index.ts +12 -0
- package/src/tool/drive-direct-link/i18n/de.ts +118 -0
- package/src/tool/drive-direct-link/i18n/id.ts +118 -0
- package/src/tool/drive-direct-link/i18n/it.ts +118 -0
- package/src/tool/drive-direct-link/i18n/ja.ts +118 -0
- package/src/tool/drive-direct-link/i18n/ko.ts +118 -0
- package/src/tool/drive-direct-link/i18n/nl.ts +118 -0
- package/src/tool/drive-direct-link/i18n/pl.ts +118 -0
- package/src/tool/drive-direct-link/i18n/pt.ts +118 -0
- package/src/tool/drive-direct-link/i18n/ru.ts +118 -0
- package/src/tool/drive-direct-link/i18n/sv.ts +118 -0
- package/src/tool/drive-direct-link/i18n/tr.ts +118 -0
- package/src/tool/drive-direct-link/i18n/zh.ts +118 -0
- package/src/tool/drive-direct-link/index.ts +12 -0
- package/src/tool/email-list-cleaner/i18n/de.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/es.ts +1 -1
- package/src/tool/email-list-cleaner/i18n/fr.ts +1 -1
- package/src/tool/email-list-cleaner/i18n/id.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/it.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/ja.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/ko.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/nl.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/pl.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/pt.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/ru.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/sv.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/tr.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/zh.ts +140 -0
- package/src/tool/email-list-cleaner/index.ts +12 -0
- package/src/tool/env-badge-spain/i18n/de.ts +153 -0
- package/src/tool/env-badge-spain/i18n/es.ts +1 -1
- package/src/tool/env-badge-spain/i18n/fr.ts +1 -1
- package/src/tool/env-badge-spain/i18n/id.ts +153 -0
- package/src/tool/env-badge-spain/i18n/it.ts +153 -0
- package/src/tool/env-badge-spain/i18n/ja.ts +153 -0
- package/src/tool/env-badge-spain/i18n/ko.ts +153 -0
- package/src/tool/env-badge-spain/i18n/nl.ts +153 -0
- package/src/tool/env-badge-spain/i18n/pl.ts +153 -0
- package/src/tool/env-badge-spain/i18n/pt.ts +153 -0
- package/src/tool/env-badge-spain/i18n/ru.ts +153 -0
- package/src/tool/env-badge-spain/i18n/sv.ts +153 -0
- package/src/tool/env-badge-spain/i18n/tr.ts +153 -0
- package/src/tool/env-badge-spain/i18n/zh.ts +153 -0
- package/src/tool/env-badge-spain/index.ts +12 -0
- package/src/tool/morse-beacon/i18n/de.ts +157 -0
- package/src/tool/morse-beacon/i18n/es.ts +1 -1
- package/src/tool/morse-beacon/i18n/id.ts +157 -0
- package/src/tool/morse-beacon/i18n/it.ts +157 -0
- package/src/tool/morse-beacon/i18n/ja.ts +157 -0
- package/src/tool/morse-beacon/i18n/ko.ts +157 -0
- package/src/tool/morse-beacon/i18n/nl.ts +157 -0
- package/src/tool/morse-beacon/i18n/pl.ts +157 -0
- package/src/tool/morse-beacon/i18n/pt.ts +157 -0
- package/src/tool/morse-beacon/i18n/ru.ts +157 -0
- package/src/tool/morse-beacon/i18n/sv.ts +157 -0
- package/src/tool/morse-beacon/i18n/tr.ts +157 -0
- package/src/tool/morse-beacon/i18n/zh.ts +157 -0
- package/src/tool/morse-beacon/index.ts +13 -1
- package/src/tool/password-generator/i18n/de.ts +166 -0
- package/src/tool/password-generator/i18n/fr.ts +1 -1
- package/src/tool/password-generator/i18n/id.ts +166 -0
- package/src/tool/password-generator/i18n/it.ts +166 -0
- package/src/tool/password-generator/i18n/ja.ts +166 -0
- package/src/tool/password-generator/i18n/ko.ts +166 -0
- package/src/tool/password-generator/i18n/nl.ts +166 -0
- package/src/tool/password-generator/i18n/pl.ts +166 -0
- package/src/tool/password-generator/i18n/pt.ts +166 -0
- package/src/tool/password-generator/i18n/ru.ts +166 -0
- package/src/tool/password-generator/i18n/sv.ts +166 -0
- package/src/tool/password-generator/i18n/tr.ts +166 -0
- package/src/tool/password-generator/i18n/zh.ts +166 -0
- package/src/tool/password-generator/index.ts +13 -1
- package/src/tool/routes/i18n/de.ts +157 -0
- package/src/tool/routes/i18n/es.ts +1 -1
- package/src/tool/routes/i18n/id.ts +157 -0
- package/src/tool/routes/i18n/it.ts +157 -0
- package/src/tool/routes/i18n/ja.ts +157 -0
- package/src/tool/routes/i18n/ko.ts +157 -0
- package/src/tool/routes/i18n/nl.ts +157 -0
- package/src/tool/routes/i18n/pl.ts +157 -0
- package/src/tool/routes/i18n/pt.ts +157 -0
- package/src/tool/routes/i18n/ru.ts +157 -0
- package/src/tool/routes/i18n/sv.ts +157 -0
- package/src/tool/routes/i18n/tr.ts +157 -0
- package/src/tool/routes/i18n/zh.ts +157 -0
- package/src/tool/routes/index.ts +13 -1
- package/src/tool/rule-of-three/i18n/de.ts +171 -0
- package/src/tool/rule-of-three/i18n/en.ts +1 -1
- package/src/tool/rule-of-three/i18n/id.ts +171 -0
- package/src/tool/rule-of-three/i18n/it.ts +171 -0
- package/src/tool/rule-of-three/i18n/ja.ts +171 -0
- package/src/tool/rule-of-three/i18n/ko.ts +171 -0
- package/src/tool/rule-of-three/i18n/nl.ts +171 -0
- package/src/tool/rule-of-three/i18n/pl.ts +171 -0
- package/src/tool/rule-of-three/i18n/pt.ts +171 -0
- package/src/tool/rule-of-three/i18n/ru.ts +171 -0
- package/src/tool/rule-of-three/i18n/sv.ts +171 -0
- package/src/tool/rule-of-three/i18n/tr.ts +171 -0
- package/src/tool/rule-of-three/i18n/zh.ts +171 -0
- package/src/tool/rule-of-three/index.ts +13 -1
- package/src/tool/seo-content-optimizer/i18n/de.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/id.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/it.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/ja.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/ko.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/nl.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/pl.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/pt.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/ru.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/sv.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/tr.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/zh.ts +136 -0
- package/src/tool/seo-content-optimizer/index.ts +12 -0
- package/src/tool/speed-reader/i18n/de.ts +152 -0
- package/src/tool/speed-reader/i18n/es.ts +1 -1
- package/src/tool/speed-reader/i18n/id.ts +152 -0
- package/src/tool/speed-reader/i18n/it.ts +152 -0
- package/src/tool/speed-reader/i18n/ja.ts +152 -0
- package/src/tool/speed-reader/i18n/ko.ts +152 -0
- package/src/tool/speed-reader/i18n/nl.ts +152 -0
- package/src/tool/speed-reader/i18n/pl.ts +152 -0
- package/src/tool/speed-reader/i18n/pt.ts +152 -0
- package/src/tool/speed-reader/i18n/ru.ts +152 -0
- package/src/tool/speed-reader/i18n/sv.ts +152 -0
- package/src/tool/speed-reader/i18n/tr.ts +152 -0
- package/src/tool/speed-reader/i18n/zh.ts +152 -0
- package/src/tool/speed-reader/index.ts +12 -0
- package/src/tool/text-pixel-calculator/i18n/de.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/id.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/it.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/ja.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/ko.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/nl.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/pl.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/pt.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/ru.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/sv.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/tr.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/zh.ts +133 -0
- package/src/tool/text-pixel-calculator/index.ts +12 -0
- package/src/tool/whatsapp-link/i18n/de.ts +128 -0
- package/src/tool/whatsapp-link/i18n/es.ts +1 -1
- package/src/tool/whatsapp-link/i18n/id.ts +128 -0
- package/src/tool/whatsapp-link/i18n/it.ts +128 -0
- package/src/tool/whatsapp-link/i18n/ja.ts +128 -0
- package/src/tool/whatsapp-link/i18n/ko.ts +128 -0
- package/src/tool/whatsapp-link/i18n/nl.ts +128 -0
- package/src/tool/whatsapp-link/i18n/pl.ts +128 -0
- package/src/tool/whatsapp-link/i18n/pt.ts +128 -0
- package/src/tool/whatsapp-link/i18n/ru.ts +128 -0
- package/src/tool/whatsapp-link/i18n/sv.ts +128 -0
- package/src/tool/whatsapp-link/i18n/tr.ts +128 -0
- package/src/tool/whatsapp-link/i18n/zh.ts +128 -0
- package/src/tool/whatsapp-link/index.ts +12 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
3
|
+
import type { MorseBeaconUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const faqData = [
|
|
6
|
+
{
|
|
7
|
+
question: 'Mors alfabesinde SOS imdat sinyali nedir?',
|
|
8
|
+
answer: "Sinyal '... --- ...' şeklindedir (üç nokta, üç çizgi, üç nokta). Acil bir durumu belirtmek için harfler arasında boşluk bırakılmadan sürekli olarak iletilir.",
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
question: 'Fener neden tarayıcımda çalışmıyor?',
|
|
12
|
+
answer: 'Feneri etkinleştirmek tarayıcının kamera izinlerine sahip olmasını gerektirir. Bazı mobil tarayıcılar veya eski masaüstü sürümleri gizlilik nedenleriyle bu API\'yi desteklemez.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'Ekran SOS sinyali görünür mü?',
|
|
16
|
+
answer: 'Evet, tam karanlık koşullarda, Mors alfabesinde yanıp sönen beyaz bir ekranın maksimum parlaklığı birkaç yüz metre öteden görülebilir; bu da fenerin arızalanması durumunda yararlı bir alternatiftir.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'Uluslararası Mors alfabesi nedir?',
|
|
20
|
+
answer: 'Harfleri ve sayıları temsil etmek için kısa (nokta) ve uzun (çizgi) sinyal dizilerini kullanan, radyo iletişimleri ve optik sinyaller için ITU tarafından standartlaştırılmış bir iletişim sistemidir.',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{
|
|
26
|
+
name: 'Mesajı yazın',
|
|
27
|
+
text: "İletmek istediğiniz metni girin veya acil durumlar için önceden yapılandırılmış 'SOS' düğmesini kullanın.",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: 'Hızı yapılandırın',
|
|
31
|
+
text: 'Görünürlüğe bağlı olarak sinyali daha hızlı veya daha yavaş hale getirmek için WPM\'yi (dakika başına kelime) ayarlayın.',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'Işık kaynağını seçin',
|
|
35
|
+
text: 'Daha güçlü bir sinyal için tam ekran yanıp sönmeyi etkinleştirin veya kamera fenerine erişime izin verin.',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'İletimi başlatın',
|
|
39
|
+
text: 'Sistemin metni Mors standardını izleyen otomatik görsel darbelere dönüştürmesi için İlet\'e basın.',
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
44
|
+
'@context': 'https://schema.org',
|
|
45
|
+
'@type': 'FAQPage',
|
|
46
|
+
mainEntity: faqData.map((item) => ({
|
|
47
|
+
'@type': 'Question',
|
|
48
|
+
name: item.question,
|
|
49
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
50
|
+
})),
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const howToSchema: WithContext<HowTo> = {
|
|
54
|
+
'@context': 'https://schema.org',
|
|
55
|
+
'@type': 'HowTo',
|
|
56
|
+
name: 'Mesaj iletmek için Mors feneri nasıl kullanılır?',
|
|
57
|
+
step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
61
|
+
'@context': 'https://schema.org',
|
|
62
|
+
'@type': 'SoftwareApplication',
|
|
63
|
+
name: 'Mors Feneri: Taktik SOS Vericisi',
|
|
64
|
+
applicationCategory: 'UtilitiesApplication',
|
|
65
|
+
operatingSystem: 'Web',
|
|
66
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
67
|
+
description: 'Cihazınızı bir Mors iletim istasyonuna dönüştürün. Flaşı ve ekranı acil durum ışık sinyalleri ve taktik iletişim olarak kullanın.',
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const ui: MorseBeaconUI = {
|
|
71
|
+
labelMessage: 'İletilecek Mesaj',
|
|
72
|
+
placeholder: 'Mesajınızı buraya yazın (SOS, MERHABA, YARDIM)...',
|
|
73
|
+
btnTransmit: 'İlet',
|
|
74
|
+
btnSosLoop: 'SOS Döngüsü',
|
|
75
|
+
btnStop: 'Durdur',
|
|
76
|
+
labelTorch: 'Flaş/Fener',
|
|
77
|
+
statusStandby: 'BEKLEMEDE',
|
|
78
|
+
statusTransmitting: 'İLETİLİYOR',
|
|
79
|
+
statusStopping: 'DURDURULUYOR...',
|
|
80
|
+
statusWaiting: 'BEKLİYOR',
|
|
81
|
+
statusReady: 'DONANIM HAZIR',
|
|
82
|
+
statusNoTorch: 'FENER YOK',
|
|
83
|
+
statusNoPermission: 'İZİN YOK',
|
|
84
|
+
statusNotSupported: 'DESTEKLENMİYOR',
|
|
85
|
+
statusReqHttps: 'HTTPS GEREKLİ',
|
|
86
|
+
statusSending: 'GÖNDERİLİYOR:',
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export const content: ToolLocaleContent<MorseBeaconUI> = {
|
|
90
|
+
slug: 'mors-feneri',
|
|
91
|
+
title: 'Mors Feneri: Taktik SOS Vericisi',
|
|
92
|
+
description: 'Cihazınızı bir Mors iletim istasyonuna dönüştürün. Flaşı ve ekranı acil durum ışık sinyalleri ve taktik iletişim olarak kullanın.',
|
|
93
|
+
ui,
|
|
94
|
+
faqTitle: 'Sıkça Sorulan Sorular',
|
|
95
|
+
faq: faqData,
|
|
96
|
+
howTo: howToData,
|
|
97
|
+
bibliographyTitle: 'Kaynaklar',
|
|
98
|
+
bibliography: [
|
|
99
|
+
{ name: 'ITU-R M.1677-1 — Uluslararası Mors Alfabesi', url: 'https://www.itu.int/dms_pubrec/itu-r/rec/m/R-REC-M.1677-1-200910-I!!PDF-E.pdf' },
|
|
100
|
+
{ name: 'W3C MediaCapture Image — Torch', url: 'https://w3c.github.io/mediacapture-image/#torch' },
|
|
101
|
+
{ name: 'Mors Alfabesi — Vikipedi', url: 'https://tr.wikipedia.org/wiki/Mors_alfabesi' },
|
|
102
|
+
],
|
|
103
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
104
|
+
seo: [
|
|
105
|
+
{
|
|
106
|
+
type: 'title',
|
|
107
|
+
text: 'Işığın Dili',
|
|
108
|
+
level: 2,
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
type: 'paragraph',
|
|
112
|
+
html: 'Bu araç, cihazınızı kilometrelerce öteden görülebilen mesajlar iletebilen bir optik sinyal fenerine dönüştürür. Uluslararası Mors Alfabesi standardını kullanarak, ışık darbeleri (fener ve ekran) aracılığıyla sessiz veya acil durum iletişimi sağlar.',
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
type: 'comparative',
|
|
116
|
+
columns: 2,
|
|
117
|
+
items: [
|
|
118
|
+
{
|
|
119
|
+
icon: 'mdi:history',
|
|
120
|
+
title: 'Evrensel Bir Standart',
|
|
121
|
+
description: '1830 yılında Samuel Morse tarafından geliştirilen bu noktalardan ve çizgilerden oluşan ikili sistem, telekomünikasyonda devrim yaratmıştır. Basitliği onu son derece sağlam kılar: Ses, radyo, elektrik veya ışık yoluyla iletilebilir ve şiddetli parazit altında bile okunabilir kalır.',
|
|
122
|
+
points: [],
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
icon: 'mdi:flash-alert',
|
|
126
|
+
title: 'SOS Acil Durum Modu',
|
|
127
|
+
description: "'SOS Döngüsü' düğmesi sürekli olarak ··· --- ··· dizisini iletir. Bu sinyal evrensel olarak bir yardım çağrısı olarak kabul edilir ve LED fenerin yüksek kontrastı sayesinde belirli koşullar altında gün ışığında bile çok uzak mesafelerden görülebilir.",
|
|
128
|
+
points: [],
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
type: 'title',
|
|
134
|
+
text: 'ITU-R M.1677-1 Standartı',
|
|
135
|
+
level: 2,
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
type: 'paragraph',
|
|
139
|
+
html: 'Bu araç, Uluslararası Telekomünikasyon Birliği tarafından tanımlanan uluslararası Mors alfabesinin <strong>düzenleyici zamanlamalarına</strong> kesinlikle uyar.',
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
type: 'list',
|
|
143
|
+
items: [
|
|
144
|
+
'1 nokta = 1 zaman birimi',
|
|
145
|
+
'1 çizgi = 3 zaman birimi',
|
|
146
|
+
'Öğeler arasındaki boşluk = 1 birim',
|
|
147
|
+
'Harfler arasındaki boşluk = 3 birim',
|
|
148
|
+
'Kelimeler arasındaki boşluk = 7 birim',
|
|
149
|
+
],
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: 'tip',
|
|
153
|
+
title: 'Standart hız',
|
|
154
|
+
html: 'Varsayılan hız, profesyonel bir iletim hızına karşılık gelen <strong>15 WPM</strong>\'dir (dakika başına kelime). 15 WPM\'de 1 birim = 80 ms.',
|
|
155
|
+
},
|
|
156
|
+
],
|
|
157
|
+
};
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
3
|
+
import type { MorseBeaconUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const faqData = [
|
|
6
|
+
{
|
|
7
|
+
question: '摩尔斯电码中的 SOS 求救信号是什么?',
|
|
8
|
+
answer: "信号是 '... --- ...'(三短、三长、三短)。它是连续发送的,字母之间没有空格,表示紧急情况。",
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
question: '为什么我的浏览器中闪光灯不工作?',
|
|
12
|
+
answer: '激活闪光灯需要浏览器拥有摄像头权限。由于隐私原因,一些移动浏览器或旧版本的桌面浏览器不支持此 API。',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: '屏幕 SOS 信号可见吗?',
|
|
16
|
+
answer: '是的,在完全黑暗的情况下,摩尔斯电码闪烁的白色屏幕的最大亮度可以在几百米外看到,如果不幸闪光灯失效,这是一个有用的替代方案。',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: '什么是国际摩尔斯电码?',
|
|
20
|
+
answer: '它是一种通信系统,使用短(点)和长(划)信号序列来表示字母和数字,由国际电联标准化,用于无线电通信和光学信号。',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{
|
|
26
|
+
name: '编写消息',
|
|
27
|
+
text: "输入您想要传输的文本,或使用预设的 'SOS' 按钮应对紧急情况。",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: '配置速度',
|
|
31
|
+
text: '调整 WPM(每分钟词数),根据能见度加快或放慢信号。',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: '选择光源',
|
|
35
|
+
text: '开启全屏闪烁或允许访问摄像头闪光灯以获得更强的信号。',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: '开始传输',
|
|
39
|
+
text: '按下“传输”,系统将根据摩尔斯标准将文本转换为自动光脉冲。',
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
44
|
+
'@context': 'https://schema.org',
|
|
45
|
+
'@type': 'FAQPage',
|
|
46
|
+
mainEntity: faqData.map((item) => ({
|
|
47
|
+
'@type': 'Question',
|
|
48
|
+
name: item.question,
|
|
49
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
50
|
+
})),
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const howToSchema: WithContext<HowTo> = {
|
|
54
|
+
'@context': 'https://schema.org',
|
|
55
|
+
'@type': 'HowTo',
|
|
56
|
+
name: '如何使用摩尔斯信标传输信息',
|
|
57
|
+
step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
61
|
+
'@context': 'https://schema.org',
|
|
62
|
+
'@type': 'SoftwareApplication',
|
|
63
|
+
name: '摩尔斯信标:战术 SOS 发射器',
|
|
64
|
+
applicationCategory: 'UtilitiesApplication',
|
|
65
|
+
operatingSystem: 'Web',
|
|
66
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
67
|
+
description: '将您的设备变成摩尔斯电码传输站。使用闪光灯和屏幕作为紧急光信号和战术通信。',
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const ui: MorseBeaconUI = {
|
|
71
|
+
labelMessage: '待传输消息',
|
|
72
|
+
placeholder: '在此输入您的消息 (SOS, HELLO, HELP)...',
|
|
73
|
+
btnTransmit: '传输',
|
|
74
|
+
btnSosLoop: 'SOS 循环',
|
|
75
|
+
btnStop: '停止',
|
|
76
|
+
labelTorch: '闪光灯/手电筒',
|
|
77
|
+
statusStandby: '待命',
|
|
78
|
+
statusTransmitting: '传输中',
|
|
79
|
+
statusStopping: '停止中...',
|
|
80
|
+
statusWaiting: '等待中',
|
|
81
|
+
statusReady: '硬件就绪',
|
|
82
|
+
statusNoTorch: '无闪光灯',
|
|
83
|
+
statusNoPermission: '无权限',
|
|
84
|
+
statusNotSupported: '不支持',
|
|
85
|
+
statusReqHttps: '需要 HTTPS',
|
|
86
|
+
statusSending: '发送内容:',
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export const content: ToolLocaleContent<MorseBeaconUI> = {
|
|
90
|
+
slug: 'morse-beacon',
|
|
91
|
+
title: '摩尔斯信标:战术 SOS 发射器',
|
|
92
|
+
description: '将您的设备变成摩尔斯电码传输站。使用闪光灯和屏幕作为紧急光信号和战术通信。',
|
|
93
|
+
ui,
|
|
94
|
+
faqTitle: '常见问题',
|
|
95
|
+
faq: faqData,
|
|
96
|
+
howTo: howToData,
|
|
97
|
+
bibliographyTitle: '参考文献',
|
|
98
|
+
bibliography: [
|
|
99
|
+
{ name: 'ITU-R M.1677-1 — 国际摩尔斯电码', url: 'https://www.itu.int/dms_pubrec/itu-r/rec/m/R-REC-M.1677-1-200910-I!!PDF-E.pdf' },
|
|
100
|
+
{ name: 'W3C MediaCapture Image — Torch', url: 'https://w3c.github.io/mediacapture-image/#torch' },
|
|
101
|
+
{ name: '摩尔斯电码 — 维基百科', url: 'https://zh.wikipedia.org/wiki/%E6%91%A9%E5%B0%94%E6%96%AF%E7%94%B5%E7%A0%81' },
|
|
102
|
+
],
|
|
103
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
104
|
+
seo: [
|
|
105
|
+
{
|
|
106
|
+
type: 'title',
|
|
107
|
+
text: '光的语言',
|
|
108
|
+
level: 2,
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
type: 'paragraph',
|
|
112
|
+
html: '该工具将您的设备转变为一个光学信号信标,能够传输数公里外可见的信息。它使用国际摩尔斯电码标准,通过光脉冲(闪光灯和屏幕)实现无声或紧急通信。',
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
type: 'comparative',
|
|
116
|
+
columns: 2,
|
|
117
|
+
items: [
|
|
118
|
+
{
|
|
119
|
+
icon: 'mdi:history',
|
|
120
|
+
title: '通用标准',
|
|
121
|
+
description: '由塞缪尔·摩尔斯于 1830 年开发,这种由点和划组成的二进制系统彻底改变了电信领域。它的简单性使其极其稳健:它可以通过声音、无线电、电力或光进行传输,即使在严重的干扰下仍可识别。',
|
|
122
|
+
points: [],
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
icon: 'mdi:flash-alert',
|
|
126
|
+
title: 'SOS 紧急模式',
|
|
127
|
+
description: "“SOS 循环”按钮持续发送 ··· --- ··· 序列。该信号是全球公认的求救信号,得益于 LED 闪光灯的高对比度,在某些条件下的白天,即使在很远的地方也可以看到。",
|
|
128
|
+
points: [],
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
type: 'title',
|
|
134
|
+
text: 'ITU-R M.1677-1 标准',
|
|
135
|
+
level: 2,
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
type: 'paragraph',
|
|
139
|
+
html: '该工具严格遵守国际电信联盟定义的国际摩尔斯电码的<strong>监管时序</strong>。',
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
type: 'list',
|
|
143
|
+
items: [
|
|
144
|
+
'1 点 = 1 时间单位',
|
|
145
|
+
'1 划 = 3 时间单位',
|
|
146
|
+
'元素间空格 = 1 单位',
|
|
147
|
+
'字母间空格 = 3 单位',
|
|
148
|
+
'单词间空格 = 7 单位',
|
|
149
|
+
],
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: 'tip',
|
|
153
|
+
title: '标准速度',
|
|
154
|
+
html: '默认速度为 <strong>15 WPM</strong>(每分钟词数),对应于专业传输节奏。在 15 WPM 时,1 单位 = 80 毫秒。',
|
|
155
|
+
},
|
|
156
|
+
],
|
|
157
|
+
};
|
|
@@ -8,9 +8,21 @@ export const morseBeacon: ToolsToolEntry<MorseBeaconUI> = {
|
|
|
8
8
|
id: 'morse-beacon',
|
|
9
9
|
icons: { bg: 'mdi:transmission-tower', fg: 'mdi:dots-horizontal' },
|
|
10
10
|
i18n: {
|
|
11
|
-
|
|
11
|
+
de: () => import('./i18n/de').then((m) => m.content),
|
|
12
12
|
en: () => import('./i18n/en').then((m) => m.content),
|
|
13
|
+
es: () => import('./i18n/es').then((m) => m.content),
|
|
13
14
|
fr: () => import('./i18n/fr').then((m) => m.content),
|
|
15
|
+
id: () => import('./i18n/id').then((m) => m.content),
|
|
16
|
+
it: () => import('./i18n/it').then((m) => m.content),
|
|
17
|
+
ja: () => import('./i18n/ja').then((m) => m.content),
|
|
18
|
+
ko: () => import('./i18n/ko').then((m) => m.content),
|
|
19
|
+
nl: () => import('./i18n/nl').then((m) => m.content),
|
|
20
|
+
pl: () => import('./i18n/pl').then((m) => m.content),
|
|
21
|
+
pt: () => import('./i18n/pt').then((m) => m.content),
|
|
22
|
+
ru: () => import('./i18n/ru').then((m) => m.content),
|
|
23
|
+
sv: () => import('./i18n/sv').then((m) => m.content),
|
|
24
|
+
tr: () => import('./i18n/tr').then((m) => m.content),
|
|
25
|
+
zh: () => import('./i18n/zh').then((m) => m.content),
|
|
14
26
|
},
|
|
15
27
|
};
|
|
16
28
|
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
3
|
+
import type { PasswordGeneratorUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const faqData = [
|
|
6
|
+
{
|
|
7
|
+
question: 'Ist es sicher, einen Online-Passwortgenerator zu verwenden?',
|
|
8
|
+
answer: 'Ja, solange der Generator clientseitig arbeitet. Unser Tool generiert Passwörter lokal in Ihrem Browser unter Verwendung kryptografisch sicherer Algorithmen. Ihr Passwort wird niemals über das Internet gesendet oder auf einem Server gespeichert.',
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
question: 'Was macht ein Passwort „hacksicher“?',
|
|
12
|
+
answer: 'Der Schlüssel ist Entropie (Zufälligkeit). Eine Mischung aus Groß- und Kleinschreibung, Zahlen und Sonderzeichen in Kombination mit einer Mindestlänge von 12–16 Zeichen macht einen Brute-Force-Angriff mit aktueller Technologie praktisch unmöglich.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'Warum sollte man gängige Wörter oder Daten vermeiden?',
|
|
16
|
+
answer: 'Hacker verwenden Wörterbuchangriffe, die Millionen von Wörtern, Namen und Datumskombinationen pro Sekunde testen. Rein zufällige Passwörter folgen keinen linguistischen Mustern, was sie weitaus sicherer macht.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'Sollte ich mir alle meine Passwörter merken?',
|
|
20
|
+
answer: 'Nicht empfehlenswert. Der ideale Ansatz ist die Verwendung eines Passwortmanagers (wie Bitwarden, 1Password oder der in Ihrem Browser integrierte), um diese langen, zufälligen Passwörter zu speichern, sodass Sie sich nur ein einziges starkes Master-Passwort merken müssen.',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{
|
|
26
|
+
name: 'Länge festlegen',
|
|
27
|
+
text: 'Verwenden Sie den Schieberegler, um zu wählen, wie viele Zeichen Ihr Passwort haben soll. Aktuelle Sicherheitsstandards empfehlen mindestens 12.',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: 'Komplexität wählen',
|
|
31
|
+
text: 'Aktivieren Sie die Optionen für Großbuchstaben, Zahlen und Symbole entsprechend den Anforderungen der Website, auf der Sie das Passwort verwenden möchten.',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'Passwort generieren',
|
|
35
|
+
text: 'Klicken Sie auf die Schaltfläche „Generieren“. Jeder Klick erzeugt eine einzigartige Kombination mit hoher Entropie basierend auf kryptografischen Algorithmen.',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'Mit einem Klick kopieren',
|
|
39
|
+
text: 'Verwenden Sie die Kopier-Schaltfläche, um das Passwort auf sichere Weise direkt in Ihre Zwischenablage zu senden.',
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
44
|
+
'@context': 'https://schema.org',
|
|
45
|
+
'@type': 'FAQPage',
|
|
46
|
+
mainEntity: faqData.map((item) => ({
|
|
47
|
+
'@type': 'Question',
|
|
48
|
+
name: item.question,
|
|
49
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
50
|
+
})),
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const howToSchema: WithContext<HowTo> = {
|
|
54
|
+
'@context': 'https://schema.org',
|
|
55
|
+
'@type': 'HowTo',
|
|
56
|
+
name: 'So verwenden Sie den sicheren Passwortgenerator',
|
|
57
|
+
step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
61
|
+
'@context': 'https://schema.org',
|
|
62
|
+
'@type': 'SoftwareApplication',
|
|
63
|
+
name: 'Sicherer Zufallspasswort-Generator',
|
|
64
|
+
applicationCategory: 'SecurityApplication',
|
|
65
|
+
operatingSystem: 'Web',
|
|
66
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
67
|
+
description: 'Erstellen Sie sofort starke, hacksichere Passwörter. Kostenloses Cybersecurity-Tool zum Generieren zufälliger, sicherer Schlüssel.',
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const ui: PasswordGeneratorUI = {
|
|
71
|
+
generating: 'Generiert...',
|
|
72
|
+
labelSecurity: 'Stärke',
|
|
73
|
+
labelLength: 'Länge',
|
|
74
|
+
strengthWeak: 'Schwach',
|
|
75
|
+
strengthFair: 'Mittel',
|
|
76
|
+
strengthGood: 'Gut',
|
|
77
|
+
strengthStrong: 'Stark',
|
|
78
|
+
strengthUnbreakable: 'Unknackbar',
|
|
79
|
+
optionUppercase: 'Großbuchstaben',
|
|
80
|
+
optionLowercase: 'Kleinbuchstaben',
|
|
81
|
+
optionNumbers: 'Zahlen',
|
|
82
|
+
optionSymbols: 'Symbole',
|
|
83
|
+
copyTitle: 'Kopieren',
|
|
84
|
+
regenerateTitle: 'Neu generieren',
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export const content: ToolLocaleContent<PasswordGeneratorUI> = {
|
|
88
|
+
slug: 'passwort-generator',
|
|
89
|
+
title: 'Sicherer Zufallspasswort Generator',
|
|
90
|
+
description: 'Erstellen Sie sofort starke, hacksichere Passwörter. Kostenloses Cybersecurity-Tool zum Generieren zufälliger, sicherer Schlüssel.',
|
|
91
|
+
ui,
|
|
92
|
+
faqTitle: 'Häufig gestellte Fragen',
|
|
93
|
+
faq: faqData,
|
|
94
|
+
howTo: howToData,
|
|
95
|
+
bibliographyTitle: 'Referenzen',
|
|
96
|
+
bibliography: [
|
|
97
|
+
{ name: 'Web Cryptography API — MDN Web Docs', url: 'https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API' },
|
|
98
|
+
{ name: 'NIST SP 800-63B: Digital Identity Guidelines', url: 'https://pages.nist.gov/800-63-3/sp800-63b.html' },
|
|
99
|
+
{ name: 'Passwort — Wikipedia', url: 'https://de.wikipedia.org/wiki/Passwort' },
|
|
100
|
+
{ name: 'Have I Been Pwned — Prüfen Sie, ob Ihr Passwort geleakt wurde', url: 'https://haveibeenpwned.com/Passwords' },
|
|
101
|
+
],
|
|
102
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
103
|
+
seo: [
|
|
104
|
+
{
|
|
105
|
+
type: 'title',
|
|
106
|
+
text: 'Die Anatomie eines unknackbaren Passworts',
|
|
107
|
+
level: 2,
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
type: 'paragraph',
|
|
111
|
+
html: 'Ihr Passwort ist die einzige Barriere zwischen Ihren persönlichen Daten (Bankwesen, Medizin, Fotos) und einem Cyberkriminellen. Dennoch verlassen sich Durchschnittsnutzer immer noch auf vorhersehbare Muster wie „123456“ oder Haustiernamen, die in <strong>weniger als einer Sekunde</strong> geknackt werden können.',
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
type: 'comparative',
|
|
115
|
+
columns: 2,
|
|
116
|
+
items: [
|
|
117
|
+
{
|
|
118
|
+
icon: 'mdi:alert-circle',
|
|
119
|
+
title: 'Die Gefahr von Rainbow Tables',
|
|
120
|
+
description: 'Hacker erraten Ihr Passwort nicht Versuch für Versuch. Sie verwenden riesige Datenbanken (Rainbow Tables), die Millionen von vorberechneten Hashes gängiger Passwörter enthalten. Wenn Ihr Passwort im Wörterbuch steht oder eine bekannte Phrase ist, war es bereits kompromittiert, bevor Sie es überhaupt verwendet haben.',
|
|
121
|
+
points: [],
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
icon: 'mdi:flask',
|
|
125
|
+
title: 'Die Lösung: Reine Entropie',
|
|
126
|
+
description: 'Entropie misst Unordnung oder Unvorhersehbarkeit. Je höher die Entropie (Bits), desto mehr Zeit benötigt ein Computer, um es zu knacken. Dieses Tool verwendet crypto.getRandomValues(), eine Browser-API, die kryptografisch sichere Zufallszahlen generiert, im Gegensatz zu Math.random(), das vorhersehbar ist.',
|
|
127
|
+
points: [],
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
type: 'title',
|
|
133
|
+
text: 'Grundlegende Cybersecurity-Prinzipien',
|
|
134
|
+
level: 2,
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
type: 'comparative',
|
|
138
|
+
columns: 3,
|
|
139
|
+
items: [
|
|
140
|
+
{
|
|
141
|
+
icon: 'mdi:ruler',
|
|
142
|
+
title: 'Länge vor Komplexität',
|
|
143
|
+
description: 'Ein 20-stelliges Passwort, das nur aus Kleinbuchstaben besteht, ist sicherer als ein 8-stelliges Passwort mit seltenen Symbolen. Mathematisch gesehen vervielfacht jedes zusätzliche Zeichen die Schwierigkeit exponentiell.',
|
|
144
|
+
points: [],
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
icon: 'mdi:eye-off',
|
|
148
|
+
title: 'Der Mythos der Ersetzung',
|
|
149
|
+
description: 'Das Ersetzen von „a“ durch „@“ oder „e“ durch „3“ (Leetspeak) täuscht niemanden. Moderne Wörterbuchangriffe enthalten diese Variationen bereits automatisch. Vermeiden Sie erkennbare Wörter.',
|
|
150
|
+
points: [],
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
icon: 'mdi:key-chain',
|
|
154
|
+
title: 'Andere Seite, anderer Schlüssel',
|
|
155
|
+
description: 'Wenn Sie dasselbe Passwort für Ihre E-Mail und ein Forum verwenden und das Forum gehackt wird, haben die Angreifer nun auch Zugriff auf Ihre E-Mails. Verwenden Sie einen Passwortmanager (wie Bitwarden oder 1Password), um sich komplexe Passwörter zu merken.',
|
|
156
|
+
points: [],
|
|
157
|
+
},
|
|
158
|
+
],
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
type: 'tip',
|
|
162
|
+
title: 'Datenschutz garantiert',
|
|
163
|
+
html: 'Die gesamte Generierung findet <strong>in Ihrem Browser</strong> statt. Kein Passwort wird über das Internet übertragen oder auf einem Server protokolliert. Der Quellcode ist überprüfbar.',
|
|
164
|
+
},
|
|
165
|
+
],
|
|
166
|
+
};
|
|
@@ -85,7 +85,7 @@ const ui: PasswordGeneratorUI = {
|
|
|
85
85
|
};
|
|
86
86
|
|
|
87
87
|
export const content: ToolLocaleContent<PasswordGeneratorUI> = {
|
|
88
|
-
slug: 'generateur-
|
|
88
|
+
slug: 'generateur-mots-de-passe',
|
|
89
89
|
title: 'Générateur de mots de passe sécurisés et aléatoires',
|
|
90
90
|
description: 'Créez des mots de passe robustes et impossibles à pirater instantanément. Outil de cybersécurité gratuit pour générer des clés aléatoires et sécurisées.',
|
|
91
91
|
ui,
|