@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,152 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
3
|
+
import type { SpeedReaderUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const faqData = [
|
|
6
|
+
{
|
|
7
|
+
question: 'RSVP teknolojisi nedir?',
|
|
8
|
+
answer: "RSVP, Rapid Serial Visual Presentation (Hızlı Seri Görsel Sunum) anlamına gelir. Kelimeler aynı odak noktasında teker teker görünüyor, böylece gözlerinizi soldan sağa hareket ettirme ihtiyacı ortadan kalkıyor. Bu, pratik yapıldığında anlama yeteneğinden ödün vermeden çok daha yüksek hızlarda okumaya olanak tanır.",
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
question: 'Daha hızlı okumak anlamayı azaltır mı?',
|
|
12
|
+
answer: 'Bu eğitim durumuna bağlıdır. Orta hızlarda (350-500 WPM), birçok kullanıcı iç seslendirmeyi (subvocalization) ortadan kaldırarak daha yüksek konsantrasyona ulaştığını belirtmektedir. Aşırı hızlarda (800+ WPM), önceden pratik yapılmadığında hatırlama oranı düşebilir.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'Ortalama okuma hızı nedir?',
|
|
16
|
+
answer: 'Ortalama bir yetişkin dakikada 200 ile 250 kelime arasında okur. RSVP okuyucusu ve biraz pratikle, mükemmel anlamayı koruyarak bu hızı ikiye katlamak (400-500 WPM) oldukça yaygındır.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'RSVP göz yorgunluğuna neden olur mu?',
|
|
20
|
+
answer: 'Gözlerinizi hareket ettirmenin kas eforunu ortadan kaldırarak, birçok kullanıcı geleneksel yöntemlere göre daha az yorgunlukla okuyabildiklerini fark eder. İlk başta yoğun hissettirebilir ancak beyin hızla uyum sağlar.',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{ name: 'Metninizi girin', text: 'Okumak istediğiniz makaleyi, kitabı veya belgeyi metin alanına yapıştırın.' },
|
|
26
|
+
{ name: 'WPM Yapılandırması', text: 'Dakikadaki Kelime Sayısını (WPM) ayarlayın. Yeni başlıyorsanız 300 WPM ile başlayın ve kademeli olarak artırın.' },
|
|
27
|
+
{ name: 'Bakışınızı sabitleyin', text: 'Gözlerinizi kırmızı harf (ORP odak noktası) üzerinde tutun. Kelimeleri göz hareketiyle takip etmeye çalışmayın.' },
|
|
28
|
+
{ name: 'Eğitimi başlatın', text: 'Oynat düğmesine basın ve bilgilerin akmasına izin verin. İstediğiniz zaman duraklatabilirsiniz.' },
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
32
|
+
'@context': 'https://schema.org',
|
|
33
|
+
'@type': 'FAQPage',
|
|
34
|
+
mainEntity: faqData.map((item) => ({
|
|
35
|
+
'@type': 'Question',
|
|
36
|
+
name: item.question,
|
|
37
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
38
|
+
})),
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const howToSchema: WithContext<HowTo> = {
|
|
42
|
+
'@context': 'https://schema.org',
|
|
43
|
+
'@type': 'HowTo',
|
|
44
|
+
name: 'RSVP Hızlı Okuyucu nasıl kullanılır?',
|
|
45
|
+
step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
49
|
+
'@context': 'https://schema.org',
|
|
50
|
+
'@type': 'SoftwareApplication',
|
|
51
|
+
name: 'RSVP Speed Reader',
|
|
52
|
+
applicationCategory: 'UtilitiesApplication',
|
|
53
|
+
operatingSystem: 'Web',
|
|
54
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
55
|
+
description: 'RSVP teknolojisi ve optimal tanıma noktası hizalaması ile okuma hızınızı dakikada 1000 kelimeye kadar eğitin.',
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const ui: SpeedReaderUI = {
|
|
59
|
+
progressLabel: 'Okuma ilerlemesi',
|
|
60
|
+
speedLabel: 'Hız',
|
|
61
|
+
slowLabel: 'YAVAŞ',
|
|
62
|
+
fastLabel: 'TANRI',
|
|
63
|
+
speedHint: 'Sınırlarınızı zorlamak için 300 WPM ile başlayın ve kademeli olarak artırın.',
|
|
64
|
+
textLabel: 'İşlenecek metin',
|
|
65
|
+
textPlaceholder: 'Makalenizi, kitabınızı veya metninizi buraya yapıştırın...',
|
|
66
|
+
clearLabel: 'TEMİZLE',
|
|
67
|
+
words: 'kelime',
|
|
68
|
+
defaultText: 'RSVP Speed Reader\'a hoş geldiniz. Başlamak için metninizi aşağıya yapıştırın. Bu teknoloji, gereksiz göz hareketlerini ortadan kaldırarak üç kata kadar daha hızlı okumanıza yardımcı olacaktır.',
|
|
69
|
+
play: 'Oynat',
|
|
70
|
+
pause: 'Duraklat',
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export const content: ToolLocaleContent<SpeedReaderUI> = {
|
|
74
|
+
slug: 'hizli-okuyucu',
|
|
75
|
+
title: 'Hızlı Okuma RSVP Speed Reader',
|
|
76
|
+
description: 'Okuma hızınızı dakikada 1000 kelimeye kadar eğitin. Optimal odak noktası hizalamalı RSVP teknolojisi. Entelektüel üretkenliğinizi ikiye katlayın.',
|
|
77
|
+
ui,
|
|
78
|
+
faqTitle: 'Sıkça Sorulan Sorular',
|
|
79
|
+
faq: faqData,
|
|
80
|
+
howTo: howToData,
|
|
81
|
+
bibliographyTitle: 'Kaynaklar',
|
|
82
|
+
bibliography: [
|
|
83
|
+
{ name: 'Rayner, K., et al. (2016). So much to read, so little time. Psychological Science in the Public Interest.', url: 'https://journals.sagepub.com/doi/full/10.1177/1529100615623267' },
|
|
84
|
+
{ name: 'Forster, K. I. (1970). Visual perception of rapidly presented word sequences. Perception & Psychophysics.', url: 'https://link.springer.com/article/10.3758/BF03212522' },
|
|
85
|
+
{ name: 'Öquist, G., & Goldstein, M. (2003). Towards an improved readability on mobile devices. Mobile HCI.', url: 'https://www.researchgate.net/publication/221063852_Towards_an_improved_readability_on_mobile_devices' },
|
|
86
|
+
{ name: 'Juola, J. F., et al. (1982). Visual search and reading of rapid serial visual presentations. Perception & Psychophysics.', url: 'https://link.springer.com/article/10.3758/BF03202598' },
|
|
87
|
+
{ name: 'Masson, M. E. J. (1983). Conceptual processing of text during rapid serial visual presentation. Journal of Educational Psychology.', url: 'https://psycnet.apa.org/record/1984-08638-001' },
|
|
88
|
+
{ name: 'Saldana, D., & Greene, R. (2022). Reading effectiveness with RSVP apps. Reading Psychology.', url: 'https://www.tandfonline.com/doi/abs/10.1080/02702711.2022.2030000' },
|
|
89
|
+
],
|
|
90
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
91
|
+
seo: [
|
|
92
|
+
{ type: 'title', level: 2, text: 'Okumanın Formula 1\'i: Zihinsel Bant Genişliğinizin Kilidini Açın' },
|
|
93
|
+
{
|
|
94
|
+
type: 'paragraph',
|
|
95
|
+
html: 'Ya okuma eylemi, biyomekanik olarak bir zaman kaybı olsaydı? Beyniniz, analog bir bağlantıyla -gözlerinizle- kısıtlanmış bir süper bilgisayardır. <strong>RSVP Okuyucu</strong>, kelimeleri zihninizin onları en hızlı işlediği odak noktasında sunarak bu darboğazı kırar.',
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
type: 'paragraph',
|
|
99
|
+
html: 'Geleneksel okuma verimsiz bir süreçtir. Gözleriniz bir tarayıcı gibi çalışmaz; seri çekim modundaki bir kamera gibi çalışır: dur, odaklan, atla. <strong>Sakkad</strong> adı verilen bu atlama hareketi, okuma sürenizin büyük bir kısmını bilgiyi özümsemek yerine sadece gözlerinizi hareket ettirmekle geçirdiğiniz anlamına gelir.',
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
type: 'tip',
|
|
103
|
+
html: '"RSVP okuma sadece daha hızlı okumak değildir. Metin ile beyniniz arasındaki mekanik sürtünmeyi ortadan kaldırmaktır."',
|
|
104
|
+
},
|
|
105
|
+
{ type: 'title', level: 3, text: 'Veri Enjeksiyonunun Arkasındaki Bilim' },
|
|
106
|
+
{
|
|
107
|
+
type: 'comparative',
|
|
108
|
+
columns: 3,
|
|
109
|
+
items: [
|
|
110
|
+
{
|
|
111
|
+
icon: 'mdi:bullseye-arrow',
|
|
112
|
+
title: 'Optimal Tanıma Noktası (ORP)',
|
|
113
|
+
description: 'Her kelimenin, beyninizin onu en hızlı tanıdığı bir noktası vardır. Algoritma bu tam harfi (kırmızı olan) hesaplar ve mükemmel şekilde merkezler. Gözleriniz tek bir milimetre bile hareket etmez.',
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
icon: 'mdi:speedometer-slow',
|
|
117
|
+
title: 'Bilişsel Sessizlik',
|
|
118
|
+
highlight: true,
|
|
119
|
+
description: '400-500 WPM\'nin üzerinde, iç sesiniz susar - yetişemez. Okuduğunuzu "duymayı" bırakır ve somut anlamları ve kavramları "görmeye" başlarsınız. Bu, nihai akış (flow) halidir.',
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
icon: 'mdi:brain',
|
|
123
|
+
title: 'Görsel Nöroplastisite',
|
|
124
|
+
description: 'Spor salonuna gitmek gibi: 300 WPM başlangıçta hızlı hissettirecektir. Bir hafta sonra, 500 WPM bir yürüyüş gibi gelecektir. Görsel korteksinizi dil işleme merkezine bağlayan nöral yolları yeniden eğitiyorsunuz.',
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
},
|
|
128
|
+
{ type: 'title', level: 3, text: 'Eğitim Protokolü: Yeni Başlayandan Neo\'ya' },
|
|
129
|
+
{
|
|
130
|
+
type: 'comparative',
|
|
131
|
+
columns: 3,
|
|
132
|
+
items: [
|
|
133
|
+
{
|
|
134
|
+
title: 'Seviye 1: Uyanış (200 300 WPM)',
|
|
135
|
+
description: 'Normal okuma hızınız. Arayüze alışın. Yüzünüzü gevşetin ve kelimelerin size gelmesine izin verin. Onları "yakalamaya" çalışmayın.',
|
|
136
|
+
points: ['Yeni başlayanlar için ideal', 'ORP aşinalığı', 'Göz yorgunluğu yok'],
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
title: 'Seviye 2: Ses Duvarı (400 500 WPM)',
|
|
140
|
+
highlight: true,
|
|
141
|
+
description: 'Sihrin gerçekleştiği yer burasıdır. Rahatsızlık hissedeceksiniz. Bir kelimeyi kaçırdığınızda yavaşlamayın - beyniniz boşlukları bağlamdan doldurmayı öğrenecektir.',
|
|
142
|
+
points: ['İç seslendirme kaybolur', 'Zihinsel akış hali', 'Temel hızınızı ikiye katlayın'],
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
title: 'Seviye 3: Kurtulma Hızı (600+ WPM)',
|
|
146
|
+
description: 'İleri düzey bölge. Çalışma materyallerini gözden geçirmek, haber okumak veya temel kavramları aradığınız teknik belgeleri tüketmek için idealdir.',
|
|
147
|
+
points: ['Ortalama bir roman 2 saatte biter', 'Maksimum okuma verimliliği', 'Önceden pratik gerektirir'],
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
},
|
|
151
|
+
],
|
|
152
|
+
};
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
3
|
+
import type { SpeedReaderUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const faqData = [
|
|
6
|
+
{
|
|
7
|
+
question: '什么是 RSVP 技术?',
|
|
8
|
+
answer: 'RSVP 代表 Rapid Serial Visual Presentation(急速逐次视觉呈现)。单词出现在同一个焦点的中心,每次出现一个,从而消除了眼睛从左向右移动的需要。经过练习,这可以在不牺牲理解力的情况下大幅提高阅读速度。',
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
question: '阅读速度过快会降低理解力吗?',
|
|
12
|
+
answer: '这取决于训练。在适中速度(350-500 WPM)下,许多用户通过消除默读(内心发声)报告了更高的专注度。在极端速度(800+ WPM)下,如果没有预先练习,记忆力可能会下降。',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: '平均阅读速度是多少?',
|
|
16
|
+
answer: '普通成年人每分钟阅读 200 到 250 个单词。配合 RSVP 阅读器并辅以练习,通常可以将速度翻倍(400-500 WPM),且保持极佳的理解力。',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'RSVP 会导致眼睛疲劳吗?',
|
|
20
|
+
answer: '通过消除移动眼睛的肌肉疲劳,许多用户发现阅读比传统方法更不容易疲劳。起初可能会感觉强度很大,但大脑会迅速适应。',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{ name: '输入文本', text: '将您想要阅读的文章、书籍或文档粘贴到文本区域。' },
|
|
26
|
+
{ name: '配置 WPM', text: '调整每分钟单词数 (WPM)。如果您是初学者,请从 300 WPM 开始并逐渐增加。' },
|
|
27
|
+
{ name: '固定视线', text: '盯着红色字母(ORP 焦点)。不要尝试用眼球运动来跟随单词。' },
|
|
28
|
+
{ name: '开始训练', text: '按播放按钮,让信息流式呈现。您可以随时暂停。' },
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
32
|
+
'@context': 'https://schema.org',
|
|
33
|
+
'@type': 'FAQPage',
|
|
34
|
+
mainEntity: faqData.map((item) => ({
|
|
35
|
+
'@type': 'Question',
|
|
36
|
+
name: item.question,
|
|
37
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
38
|
+
})),
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const howToSchema: WithContext<HowTo> = {
|
|
42
|
+
'@context': 'https://schema.org',
|
|
43
|
+
'@type': 'HowTo',
|
|
44
|
+
name: '如何使用 RSVP 快速阅读器',
|
|
45
|
+
step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
49
|
+
'@context': 'https://schema.org',
|
|
50
|
+
'@type': 'SoftwareApplication',
|
|
51
|
+
name: 'RSVP Speed Reader',
|
|
52
|
+
applicationCategory: 'UtilitiesApplication',
|
|
53
|
+
operatingSystem: 'Web',
|
|
54
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
55
|
+
description: '利用 RSVP 技术和最佳识别点对齐,将您的阅读速度训练至每分钟 1000 个单词。',
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const ui: SpeedReaderUI = {
|
|
59
|
+
progressLabel: '阅读进度',
|
|
60
|
+
speedLabel: '速度',
|
|
61
|
+
slowLabel: '慢速',
|
|
62
|
+
fastLabel: '神速',
|
|
63
|
+
speedHint: '从 300 WPM 开始并逐渐增加,挑战您的极限。',
|
|
64
|
+
textLabel: '待处理文本',
|
|
65
|
+
textPlaceholder: '在这里粘贴您的文章、书籍或文本...',
|
|
66
|
+
clearLabel: '清除',
|
|
67
|
+
words: '单词',
|
|
68
|
+
defaultText: '欢迎使用 RSVP Speed Reader。在下方粘贴您的文本以开始。这项技术通过消除不必要的眼球运动,帮助您提高三倍的阅读速度。',
|
|
69
|
+
play: '播放',
|
|
70
|
+
pause: '暂停',
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export const content: ToolLocaleContent<SpeedReaderUI> = {
|
|
74
|
+
slug: 'speed-reader',
|
|
75
|
+
title: 'RSVP Speed Reader',
|
|
76
|
+
description: '将您的阅读速度训练至每分钟 1000 个单词。具有最佳焦点对齐功能的 RSVP 技术。使您的智力生产力翻倍。',
|
|
77
|
+
ui,
|
|
78
|
+
faqTitle: '常见问题',
|
|
79
|
+
faq: faqData,
|
|
80
|
+
howTo: howToData,
|
|
81
|
+
bibliographyTitle: '参考文献',
|
|
82
|
+
bibliography: [
|
|
83
|
+
{ name: 'Rayner, K., et al. (2016). So much to read, so little time. Psychological Science in the Public Interest.', url: 'https://journals.sagepub.com/doi/full/10.1177/1529100615623267' },
|
|
84
|
+
{ name: 'Forster, K. I. (1970). Visual perception of rapidly presented word sequences. Perception & Psychophysics.', url: 'https://link.springer.com/article/10.3758/BF03212522' },
|
|
85
|
+
{ name: 'Öquist, G., & Goldstein, M. (2003). Towards an improved readability on mobile devices. Mobile HCI.', url: 'https://www.researchgate.net/publication/221063852_Towards_an_improved_readability_on_mobile_devices' },
|
|
86
|
+
{ name: 'Juola, J. F., et al. (1982). Visual search and reading of rapid serial visual presentations. Perception & Psychophysics.', url: 'https://link.springer.com/article/10.3758/BF03202598' },
|
|
87
|
+
{ name: 'Masson, M. E. J. (1983). Conceptual processing of text during rapid serial visual presentation. Journal of Educational Psychology.', url: 'https://psycnet.apa.org/record/1984-08638-001' },
|
|
88
|
+
{ name: 'Saldana, D., & Greene, R. (2022). Reading effectiveness with RSVP apps. Reading Psychology.', url: 'https://www.tandfonline.com/doi/abs/10.1080/02702711.2022.2030000' },
|
|
89
|
+
],
|
|
90
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
91
|
+
seo: [
|
|
92
|
+
{ type: 'title', level: 2, text: '阅读的方程式:释放您的精神带宽' },
|
|
93
|
+
{
|
|
94
|
+
type: 'paragraph',
|
|
95
|
+
html: '如果从生物力学的角度来看,阅读是在浪费时间呢?您的大脑是一台被模拟连接(双眼)所限制的超级计算机。<strong>RSVP 阅读器</strong>通过在您大脑处理速度最快的精确焦点上呈现单词,打破了这一瓶颈。',
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
type: 'paragraph',
|
|
99
|
+
html: '传统阅读是一个低效的过程。您的眼睛不像扫描仪那样工作;它们像连拍模式下的相机:停止、聚焦、跳跃。这种跳跃称为<strong>扫视 (saccade)</strong>,这意味着您在阅读时 spends 了大量时间仅仅是移动眼睛,而不是吸收信息。',
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
type: 'tip',
|
|
103
|
+
html: '“RSVP 阅读不仅仅是读得更快。它是消除了文本和大脑之间的机械摩擦。”',
|
|
104
|
+
},
|
|
105
|
+
{ type: 'title', level: 3, text: '数据注入背后的科学' },
|
|
106
|
+
{
|
|
107
|
+
type: 'comparative',
|
|
108
|
+
columns: 3,
|
|
109
|
+
items: [
|
|
110
|
+
{
|
|
111
|
+
icon: 'mdi:bullseye-arrow',
|
|
112
|
+
title: '最佳识别点 (ORP)',
|
|
113
|
+
description: '每个单词都有一个大脑识别速度最快的点。该算法会计算精准的字母(红色部分)并将其完美居中。您的眼睛一毫米都不必移动。',
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
icon: 'mdi:speedometer-slow',
|
|
117
|
+
title: '认知静默',
|
|
118
|
+
highlight: true,
|
|
119
|
+
description: '当速度高于 400-500 WPM 时,您的内心声音会保持安静——它跟不上速度。您不再“听到”您所读的内容,而是开始“看到”纯粹的含义和概念。这是终极的心流状态。',
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
icon: 'mdi:brain',
|
|
123
|
+
title: '视觉神经可塑性',
|
|
124
|
+
description: '就像去健身房一样:起初 300 WPM 会感觉很快。一周后,500 WPM 就像散步一样。您正在重新训练连接视觉皮层与语言处理的神经通路。',
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
},
|
|
128
|
+
{ type: 'title', level: 3, text: '训练方案:从初学者到 Neo' },
|
|
129
|
+
{
|
|
130
|
+
type: 'comparative',
|
|
131
|
+
columns: 3,
|
|
132
|
+
items: [
|
|
133
|
+
{
|
|
134
|
+
title: '级别 1:觉醒 (200 到 300 WPM)',
|
|
135
|
+
description: '您的正常阅读速度。习惯界面。放松脸部,让单词呈现在您面前。不要试图“捕捉”它们。',
|
|
136
|
+
points: ['适合初学者', '熟悉 ORP', '无眼部疲劳'],
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
title: '级别 2:音障 (400 到 500 WPM)',
|
|
140
|
+
highlight: true,
|
|
141
|
+
description: '这就是奇迹发生的地方。您会感到不适。错过单词时不要慢下来——您的大脑会学会根据上下文填补空白。',
|
|
142
|
+
points: ['默读消失', '精神心流状态', '两倍基础速度'],
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
title: '级别 3:脱离速度 (600+ WPM)',
|
|
146
|
+
description: '进阶领域。非常适合复习学习材料、阅读新闻或当您在寻找核心概念时阅读技术文档。',
|
|
147
|
+
points: ['2 小时读完普通小说', '极致阅读效率', '需要预先练习'],
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
},
|
|
151
|
+
],
|
|
152
|
+
};
|
|
@@ -11,6 +11,18 @@ export const speedReader: ToolsToolEntry<SpeedReaderUI> = {
|
|
|
11
11
|
es: () => import('./i18n/es').then((m) => m.content),
|
|
12
12
|
en: () => import('./i18n/en').then((m) => m.content),
|
|
13
13
|
fr: () => import('./i18n/fr').then((m) => m.content),
|
|
14
|
+
de: () => import('./i18n/de').then((m) => m.content),
|
|
15
|
+
it: () => import('./i18n/it').then((m) => m.content),
|
|
16
|
+
pt: () => import('./i18n/pt').then((m) => m.content),
|
|
17
|
+
nl: () => import('./i18n/nl').then((m) => m.content),
|
|
18
|
+
pl: () => import('./i18n/pl').then((m) => m.content),
|
|
19
|
+
tr: () => import('./i18n/tr').then((m) => m.content),
|
|
20
|
+
id: () => import('./i18n/id').then((m) => m.content),
|
|
21
|
+
sv: () => import('./i18n/sv').then((m) => m.content),
|
|
22
|
+
ru: () => import('./i18n/ru').then((m) => m.content),
|
|
23
|
+
ja: () => import('./i18n/ja').then((m) => m.content),
|
|
24
|
+
ko: () => import('./i18n/ko').then((m) => m.content),
|
|
25
|
+
zh: () => import('./i18n/zh').then((m) => m.content),
|
|
14
26
|
},
|
|
15
27
|
};
|
|
16
28
|
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
3
|
+
import type { TextPixelCalculatorUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const faqData = [
|
|
6
|
+
{
|
|
7
|
+
question: 'Wie berechne ich die Pixelbreite von Text online?',
|
|
8
|
+
answer: 'Fügen Sie Ihren Text in das Eingabefeld ein, konfigurieren Sie Schriftart und Größe, und das Tool verwendet automatisch die Browser-Canvas-API, um die exakte Breite in Pixeln zurückzugeben.',
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
question: 'Warum variiert die Pixelbreite zwischen den Schriftarten?',
|
|
12
|
+
answer: "Die meisten Schriftarten sind proportional, was bedeutet, dass jedes Zeichen eine andere Breite hat. Zum Beispiel ist ein großes 'M' in einer Standard-Sans-Serif-Schriftart immer breiter als ein kleines 'i'.",
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'Ist das Messen von Zeichen dasselbe wie das Messen von Pixeln?',
|
|
16
|
+
answer: 'Nein. Das Messen von Zeichen ergibt die String-Länge, während das Messen von Pixeln den visuellen Raum ergibt, den der Text einnimmt. Dies ist entscheidend, um sicherzustellen, dass Text in einem Webdesign nicht aus seinem Container herausläuft.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'Kann ich jede Google Fonts Schriftart verwenden?',
|
|
20
|
+
answer: 'Ja, solange die Schriftart auf Ihrem Betriebssystem installiert oder auf der aktuellen Seite geladen ist, misst das Tool ihre Abmessungen genau.',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
question: 'Ist es sicher, privaten Text oder Code-Snippets zu verarbeiten?',
|
|
24
|
+
answer: 'Ja. Der Rechner arbeitet vollständig lokal. Es werden keine Daten an externe Server gesendet, was die absolute Privatsphäre für Ihre Projekte garantiert.',
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
const howToData = [
|
|
29
|
+
{ name: 'Text eingeben', text: 'Geben Sie den Text, den Sie messen möchten, in den Eingabebereich ein.' },
|
|
30
|
+
{ name: 'Schriftart konfigurieren', text: 'Legen Sie die Schriftfamilie, die Größe in Pixeln, das Gewicht und den Stil (kursiv) fest.' },
|
|
31
|
+
{ name: 'Ergebnis ablesen', text: 'Die Pixelbreite und die Zeichenanzahl werden in Echtzeit aktualisiert.' },
|
|
32
|
+
{ name: 'Wert kopieren', text: 'Klicken Sie auf „Breite kopieren“, um die Pixelanzahl in die Zwischenablage zu speichern.' },
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
36
|
+
'@context': 'https://schema.org',
|
|
37
|
+
'@type': 'FAQPage',
|
|
38
|
+
mainEntity: faqData.map((item) => ({
|
|
39
|
+
'@type': 'Question',
|
|
40
|
+
name: item.question,
|
|
41
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
42
|
+
})),
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const howToSchema: WithContext<HowTo> = {
|
|
46
|
+
'@context': 'https://schema.org',
|
|
47
|
+
'@type': 'HowTo',
|
|
48
|
+
name: 'So messen Sie die Textbreite in Pixeln',
|
|
49
|
+
step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
53
|
+
'@context': 'https://schema.org',
|
|
54
|
+
'@type': 'SoftwareApplication',
|
|
55
|
+
name: 'Text-Pixelbreitenrechner',
|
|
56
|
+
applicationCategory: 'UtilitiesApplication',
|
|
57
|
+
operatingSystem: 'Web',
|
|
58
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
59
|
+
description: 'Berechnen Sie die Pixelbreite eines beliebigen Textes basierend auf Schriftart, Größe und Stil genau.',
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const ui: TextPixelCalculatorUI = {
|
|
63
|
+
textLabel: 'Zu messender Text',
|
|
64
|
+
textPlaceholder: 'Geben Sie hier den Text ein, den Sie messen möchten...',
|
|
65
|
+
defaultText: 'Hallo Welt',
|
|
66
|
+
fontLabel: 'Schriftfamilie',
|
|
67
|
+
sizeLabel: 'Größe (px)',
|
|
68
|
+
weightLabel: 'Gewicht',
|
|
69
|
+
italicLabel: 'Kursiv',
|
|
70
|
+
widthLabel: 'Breite (Pixel)',
|
|
71
|
+
charsLabel: 'Zeichen',
|
|
72
|
+
previewLabel: 'Visuelle Vorschau',
|
|
73
|
+
copyBtn: 'Breite kopieren',
|
|
74
|
+
resetBtn: 'Zurücksetzen',
|
|
75
|
+
copyDone: 'Breite kopiert',
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export const content: ToolLocaleContent<TextPixelCalculatorUI> = {
|
|
79
|
+
slug: 'text-pixel-breitenrechner',
|
|
80
|
+
title: 'Text Pixelbreitenrechner',
|
|
81
|
+
description: 'Berechnen Sie genau, wie breit ein beliebiger Text in Pixeln ist, basierend auf Schriftart, Größe und Stil. Kostenloses Tool für Designer und Entwickler.',
|
|
82
|
+
ui,
|
|
83
|
+
faqTitle: 'Häufig gestellte Fragen',
|
|
84
|
+
faq: faqData,
|
|
85
|
+
howTo: howToData,
|
|
86
|
+
bibliographyTitle: 'Referenzen',
|
|
87
|
+
bibliography: [
|
|
88
|
+
{ name: 'W3C: CSS Text Module Level 3', url: 'https://www.w3.org/TR/css-text-3/' },
|
|
89
|
+
{ name: 'Google Fonts: Understanding variable fonts', url: 'https://fonts.google.com/knowledge/glossary/variable_fonts' },
|
|
90
|
+
],
|
|
91
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
92
|
+
seo: [
|
|
93
|
+
{ type: 'title', level: 2, text: 'Messen Sie die exakte Pixelbreite eines beliebigen Textes' },
|
|
94
|
+
{
|
|
95
|
+
type: 'paragraph',
|
|
96
|
+
html: 'Läuft Ihr Text aus seinem Container heraus? Müssen Sie wissen, wie viel Platz eine Überschrift einnimmt, bevor sie gerendert wird? Die <strong>Canvas-API des Browsers</strong> ermöglicht es Ihnen, die exakte Breite einer beliebigen Zeichenfolge mit Pixelpräzision zu messen, ohne sie im DOM zu rendern.',
|
|
97
|
+
},
|
|
98
|
+
{ type: 'title', level: 3, text: 'Warum das Zählen von Zeichen nicht ausreicht' },
|
|
99
|
+
{
|
|
100
|
+
type: 'paragraph',
|
|
101
|
+
html: 'Moderne Schriftarten sind <strong>proportional</strong>: Jedes Zeichen hat eine andere Breite. Ein „W“ kann dreimal mehr Platz einnehmen als ein „i“. Die Anzahl der Zeichen sagt nichts über den tatsächlichen visuellen Raum aus, den der Text einnimmt.',
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
type: 'list',
|
|
105
|
+
items: [
|
|
106
|
+
'<strong>Webdesign:</strong> Verhindern Sie Überläufe in Schaltflächen, Beschriftungen und Tabellenzellen.',
|
|
107
|
+
'<strong>SEO:</strong> Suchmaschinen kürzen Titel nach Pixeln, nicht nach Zeichen.',
|
|
108
|
+
'<strong>Canvas und PDF:</strong> Berechnen Sie die exakte Position, bevor Sie Text programmatisch zeichnen.',
|
|
109
|
+
'<strong>Tooltips und Bubbles:</strong> Passen Sie Containergrößen dynamisch basierend auf dem enthaltenen Text an.',
|
|
110
|
+
],
|
|
111
|
+
},
|
|
112
|
+
{ type: 'title', level: 3, text: 'Wie die Messung mit Canvas funktioniert' },
|
|
113
|
+
{
|
|
114
|
+
type: 'paragraph',
|
|
115
|
+
html: 'Die Methode <code>ctx.measureText()</code> der Canvas-API gibt ein <code>TextMetrics</code>-Objekt mit einer <code>width</code>-Eigenschaft zurück, die die CSS-Pixelbreite unter Verwendung der aktuell aktiven Schriftart widerspiegelt. Dieses Tool konfiguriert den Kontext mit Ihrer Schriftart, Größe, Gewicht und Ihrem Stil vor der Messung.',
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
type: 'code',
|
|
119
|
+
ariaLabel: 'Canvas measureText Beispiel',
|
|
120
|
+
code: "const ctx = document.createElement('canvas').getContext('2d');\nctx.font = '700 16px Inter, system-ui, sans-serif';\nconst width = ctx.measureText('Hallo Welt').width; // z.B. 74.5",
|
|
121
|
+
},
|
|
122
|
+
{ type: 'title', level: 3, text: 'Datenschutz und lokale Verarbeitung' },
|
|
123
|
+
{
|
|
124
|
+
type: 'paragraph',
|
|
125
|
+
html: 'Die gesamte Berechnung findet in Ihrem Browser statt. Kein Text, Code-Snippet oder private Daten verlassen Ihr Gerät.',
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
type: 'tip',
|
|
129
|
+
title: 'Google Fonts Schriftarten',
|
|
130
|
+
html: 'Um eine Google Fonts Schriftart genau zu messen, stellen Sie zunächst sicher, dass sie auf der Seite geladen oder auf Ihrem System installiert ist. Andernfalls greift der Browser auf eine Ersatzschriftart zurück und das Ergebnis weicht ab.',
|
|
131
|
+
},
|
|
132
|
+
],
|
|
133
|
+
};
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
3
|
+
import type { TextPixelCalculatorUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const faqData = [
|
|
6
|
+
{
|
|
7
|
+
question: 'Bagaimana cara menghitung lebar piksel teks secara online?',
|
|
8
|
+
answer: 'Tempelkan teks Anda ke dalam kotak input, konfigurasikan font dan ukurannya, dan alat ini akan secara otomatis menggunakan API Canvas browser untuk memberikan lebar tepat dalam piksel.',
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
question: 'Mengapa lebar piksel bervariasi di antara jenis huruf?',
|
|
12
|
+
answer: "Sebagian besar font bersifat proporsional, yang berarti setiap karakter memiliki lebar yang berbeda. Misalnya, huruf besar 'M' selalu lebih lebar daripada huruf kecil 'i' dalam font sans-serif standar.",
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'Apakah mengukur karakter sama dengan mengukur piksel?',
|
|
16
|
+
answer: 'Tidak. Mengukur karakter memberi Anda panjang string, sedangkan mengukur piksel memberi Anda ruang visual yang ditempatinya. Ini sangat penting untuk memastikan teks tidak meluap dari wadahnya dalam desain web.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'Dapatkah saya menggunakan jenis huruf Google Fonts apa pun?',
|
|
20
|
+
answer: 'Ya, selama font terpasang di sistem operasi Anda atau dimuat di halaman saat ini, alat ini akan mengukur dimensinya secara akurat.',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
question: 'Apakah aman untuk memproses teks pribadi atau cuplikan kode?',
|
|
24
|
+
answer: 'Ya. Kalkulator ini bekerja sepenuhnya secara lokal. Tidak ada data yang dikirim ke server eksternal, menjamin privasi lengkap untuk proyek Anda.',
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
const howToData = [
|
|
29
|
+
{ name: 'Masukkan teks', text: 'Ketik atau tempel teks yang ingin Anda ukur ke area input.' },
|
|
30
|
+
{ name: 'Konfigurasikan font', text: 'Atur keluarga font, ukuran dalam piksel, ketebalan, dan apakah miring.' },
|
|
31
|
+
{ name: 'Baca hasilnya', text: 'Lebar piksel dan jumlah karakter diperbarui secara real-time.' },
|
|
32
|
+
{ name: 'Salin nilainya', text: 'Klik "Salin Lebar" untuk menyimpan angka piksel ke papan klip.' },
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
36
|
+
'@context': 'https://schema.org',
|
|
37
|
+
'@type': 'FAQPage',
|
|
38
|
+
mainEntity: faqData.map((item) => ({
|
|
39
|
+
'@type': 'Question',
|
|
40
|
+
name: item.question,
|
|
41
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
42
|
+
})),
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const howToSchema: WithContext<HowTo> = {
|
|
46
|
+
'@context': 'https://schema.org',
|
|
47
|
+
'@type': 'HowTo',
|
|
48
|
+
name: 'Cara mengukur lebar teks dalam piksel',
|
|
49
|
+
step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
53
|
+
'@context': 'https://schema.org',
|
|
54
|
+
'@type': 'SoftwareApplication',
|
|
55
|
+
name: 'Kalkulator Lebar Piksel Teks',
|
|
56
|
+
applicationCategory: 'UtilitiesApplication',
|
|
57
|
+
operatingSystem: 'Web',
|
|
58
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
59
|
+
description: 'Hitung lebar piksel teks apa pun secara akurat berdasarkan font, ukuran, dan gaya.',
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const ui: TextPixelCalculatorUI = {
|
|
63
|
+
textLabel: 'Teks untuk diukur',
|
|
64
|
+
textPlaceholder: 'Ketik atau tempel di sini teks yang ingin Anda ukur...',
|
|
65
|
+
defaultText: 'Halo Dunia',
|
|
66
|
+
fontLabel: 'Keluarga font',
|
|
67
|
+
sizeLabel: 'Ukuran (px)',
|
|
68
|
+
weightLabel: 'Ketebalan',
|
|
69
|
+
italicLabel: 'Miring',
|
|
70
|
+
widthLabel: 'Lebar (piksel)',
|
|
71
|
+
charsLabel: 'Karakter',
|
|
72
|
+
previewLabel: 'Pratinjau visual',
|
|
73
|
+
copyBtn: 'Salin Lebar',
|
|
74
|
+
resetBtn: 'Atur Ulang',
|
|
75
|
+
copyDone: 'Lebar disalin',
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export const content: ToolLocaleContent<TextPixelCalculatorUI> = {
|
|
79
|
+
slug: 'kalkulator-lebar-piksel-teks',
|
|
80
|
+
title: 'Kalkulator Lebar Piksel Teks',
|
|
81
|
+
description: 'Hitung secara akurat seberapa lebar teks apa pun dalam piksel berdasarkan font, ukuran, dan gaya. Alat gratis untuk desainer dan pengembang.',
|
|
82
|
+
ui,
|
|
83
|
+
faqTitle: 'Pertanyaan yang Sering Diajukan',
|
|
84
|
+
faq: faqData,
|
|
85
|
+
howTo: howToData,
|
|
86
|
+
bibliographyTitle: 'Referensi',
|
|
87
|
+
bibliography: [
|
|
88
|
+
{ name: 'W3C: CSS Text Module Level 3', url: 'https://www.w3.org/TR/css-text-3/' },
|
|
89
|
+
{ name: 'Google Fonts: Understanding variable fonts', url: 'https://fonts.google.com/knowledge/glossary/variable_fonts' },
|
|
90
|
+
],
|
|
91
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
92
|
+
seo: [
|
|
93
|
+
{ type: 'title', level: 2, text: 'Ukur lebar piksel yang tepat dari teks apa pun' },
|
|
94
|
+
{
|
|
95
|
+
type: 'paragraph',
|
|
96
|
+
html: 'Apakah teks Anda meluap dari wadahnya? Perlu tahu berapa banyak ruang yang digunakan judul sebelum merendernya? <strong>API Canvas browser</strong> memungkinkan Anda mengukur lebar tepat dari string teks apa pun dengan presisi piksel, tanpa harus merendernya di DOM.',
|
|
97
|
+
},
|
|
98
|
+
{ type: 'title', level: 3, text: 'Mengapa menghitung karakter saja tidak cukup' },
|
|
99
|
+
{
|
|
100
|
+
type: 'paragraph',
|
|
101
|
+
html: 'Jenis huruf modern bersifat <strong>proporsional</strong>: setiap glif memiliki lebar yang berbeda. Huruf "W" dapat memakan ruang tiga kali lebih banyak daripada huruf "i". Jumlah karakter tidak memberi tahu Anda apa pun tentang ruang visual sebenarnya yang ditempati teks.',
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
type: 'list',
|
|
105
|
+
items: [
|
|
106
|
+
'<strong>Desain web:</strong> Mencegah luapan (overflow) pada tombol, label, dan sel tabel.',
|
|
107
|
+
'<strong>SEO:</strong> Mesin pencari memotong judul berdasarkan piksel, bukan karakter.',
|
|
108
|
+
'<strong>Canvas dan PDF:</strong> Hitung posisi tepat sebelum menggambar teks secara terprogram.',
|
|
109
|
+
'<strong>Tooltip dan gelembung:</strong> Ukur wadah secara dinamis berdasarkan teks di dalamnya.',
|
|
110
|
+
],
|
|
111
|
+
},
|
|
112
|
+
{ type: 'title', level: 3, text: 'Cara kerja pengukuran dengan Canvas' },
|
|
113
|
+
{
|
|
114
|
+
type: 'paragraph',
|
|
115
|
+
html: 'Metode <code>ctx.measureText()</code> dari API Canvas mengembalikan objek <code>TextMetrics</code> dengan properti <code>width</code> yang mencerminkan lebar piksel CSS menggunakan font yang saat ini aktif. Alat ini mengonfigurasi konteks dengan font, ukuran, ketebalan, dan gaya Anda sebelum mengukur.',
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
type: 'code',
|
|
119
|
+
ariaLabel: 'Contoh Canvas measureText',
|
|
120
|
+
code: "const ctx = document.createElement('canvas').getContext('2d');\nctx.font = '700 16px Inter, system-ui, sans-serif';\nconst width = ctx.measureText('Halo Dunia').width; // mis. 74.5",
|
|
121
|
+
},
|
|
122
|
+
{ type: 'title', level: 3, text: 'Privasi dan pemrosesan lokal' },
|
|
123
|
+
{
|
|
124
|
+
type: 'paragraph',
|
|
125
|
+
html: 'Semua perhitungan terjadi di browser Anda. Tidak ada teks, cuplikan kode, atau data pribadi yang meninggalkan perangkat Anda.',
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
type: 'tip',
|
|
129
|
+
title: 'Jenis huruf Google Fonts',
|
|
130
|
+
html: 'Untuk mengukur jenis huruf Google Fonts secara akurat, pastikan font tersebut sudah dimuat di halaman atau terpasang di sistem Anda. Jika tidak, browser akan menggunakan font pengganti dan hasilnya akan berbeda.',
|
|
131
|
+
},
|
|
132
|
+
],
|
|
133
|
+
};
|