@jjlmoya/utils-books 1.7.0 → 1.9.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.
Files changed (70) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -1
  3. package/src/entries.ts +7 -1
  4. package/src/index.ts +1 -0
  5. package/src/tests/locale_completeness.test.ts +1 -1
  6. package/src/tests/tool_validation.test.ts +1 -1
  7. package/src/tool/book-index-page-budget-calculator/bibliography.astro +6 -0
  8. package/src/tool/book-index-page-budget-calculator/bibliography.ts +17 -0
  9. package/src/tool/book-index-page-budget-calculator/book-index-page-budget-calculator.css +478 -0
  10. package/src/tool/book-index-page-budget-calculator/component.astro +134 -0
  11. package/src/tool/book-index-page-budget-calculator/controller.ts +114 -0
  12. package/src/tool/book-index-page-budget-calculator/dom-views.ts +89 -0
  13. package/src/tool/book-index-page-budget-calculator/entry.ts +39 -0
  14. package/src/tool/book-index-page-budget-calculator/evaluator.ts +26 -0
  15. package/src/tool/book-index-page-budget-calculator/i18n/de.ts +35 -0
  16. package/src/tool/book-index-page-budget-calculator/i18n/en.ts +113 -0
  17. package/src/tool/book-index-page-budget-calculator/i18n/es.ts +35 -0
  18. package/src/tool/book-index-page-budget-calculator/i18n/fr.ts +8 -0
  19. package/src/tool/book-index-page-budget-calculator/i18n/id.ts +35 -0
  20. package/src/tool/book-index-page-budget-calculator/i18n/it.ts +8 -0
  21. package/src/tool/book-index-page-budget-calculator/i18n/ja.ts +8 -0
  22. package/src/tool/book-index-page-budget-calculator/i18n/ko.ts +8 -0
  23. package/src/tool/book-index-page-budget-calculator/i18n/nl.ts +8 -0
  24. package/src/tool/book-index-page-budget-calculator/i18n/pl.ts +8 -0
  25. package/src/tool/book-index-page-budget-calculator/i18n/pt.ts +8 -0
  26. package/src/tool/book-index-page-budget-calculator/i18n/ru.ts +8 -0
  27. package/src/tool/book-index-page-budget-calculator/i18n/sv.ts +8 -0
  28. package/src/tool/book-index-page-budget-calculator/i18n/tr.ts +8 -0
  29. package/src/tool/book-index-page-budget-calculator/i18n/zh.ts +8 -0
  30. package/src/tool/book-index-page-budget-calculator/index.ts +11 -0
  31. package/src/tool/book-index-page-budget-calculator/logic.test.ts +52 -0
  32. package/src/tool/book-index-page-budget-calculator/logic.ts +86 -0
  33. package/src/tool/book-index-page-budget-calculator/seo.astro +15 -0
  34. package/src/tool/book-index-page-budget-calculator/storage.ts +17 -0
  35. package/src/tool/book-index-page-budget-calculator/ui.ts +41 -0
  36. package/src/tool/book-reading-time-deadline-planner/bibliography.astro +16 -0
  37. package/src/tool/book-reading-time-deadline-planner/bibliography.ts +31 -0
  38. package/src/tool/book-reading-time-deadline-planner/book-reading-time-deadline-planner.css +449 -0
  39. package/src/tool/book-reading-time-deadline-planner/calendar.test.ts +18 -0
  40. package/src/tool/book-reading-time-deadline-planner/calendar.ts +56 -0
  41. package/src/tool/book-reading-time-deadline-planner/component.astro +91 -0
  42. package/src/tool/book-reading-time-deadline-planner/controller.ts +253 -0
  43. package/src/tool/book-reading-time-deadline-planner/dom-views.ts +60 -0
  44. package/src/tool/book-reading-time-deadline-planner/entry.ts +27 -0
  45. package/src/tool/book-reading-time-deadline-planner/evaluator.ts +17 -0
  46. package/src/tool/book-reading-time-deadline-planner/i18n/de.ts +45 -0
  47. package/src/tool/book-reading-time-deadline-planner/i18n/en.ts +51 -0
  48. package/src/tool/book-reading-time-deadline-planner/i18n/es.ts +45 -0
  49. package/src/tool/book-reading-time-deadline-planner/i18n/fr.ts +45 -0
  50. package/src/tool/book-reading-time-deadline-planner/i18n/id.ts +45 -0
  51. package/src/tool/book-reading-time-deadline-planner/i18n/it.ts +45 -0
  52. package/src/tool/book-reading-time-deadline-planner/i18n/ja.ts +45 -0
  53. package/src/tool/book-reading-time-deadline-planner/i18n/ko.ts +45 -0
  54. package/src/tool/book-reading-time-deadline-planner/i18n/nl.ts +45 -0
  55. package/src/tool/book-reading-time-deadline-planner/i18n/pl.ts +45 -0
  56. package/src/tool/book-reading-time-deadline-planner/i18n/pt.ts +45 -0
  57. package/src/tool/book-reading-time-deadline-planner/i18n/ru.ts +45 -0
  58. package/src/tool/book-reading-time-deadline-planner/i18n/sv.ts +45 -0
  59. package/src/tool/book-reading-time-deadline-planner/i18n/tr.ts +45 -0
  60. package/src/tool/book-reading-time-deadline-planner/i18n/zh.ts +45 -0
  61. package/src/tool/book-reading-time-deadline-planner/index.ts +11 -0
  62. package/src/tool/book-reading-time-deadline-planner/logic.test.ts +61 -0
  63. package/src/tool/book-reading-time-deadline-planner/logic.ts +129 -0
  64. package/src/tool/book-reading-time-deadline-planner/seo.astro +15 -0
  65. package/src/tool/book-reading-time-deadline-planner/speed-test.test.ts +15 -0
  66. package/src/tool/book-reading-time-deadline-planner/speed-test.ts +9 -0
  67. package/src/tool/book-reading-time-deadline-planner/storage.ts +24 -0
  68. package/src/tool/book-reading-time-deadline-planner/ui.ts +76 -0
  69. package/src/tool/book-reading-time-deadline-planner/validation.ts +19 -0
  70. package/src/tools.ts +3 -1
@@ -0,0 +1,45 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { BookReadingUI } from '../ui';
3
+ import { bibliography } from '../bibliography';
4
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
5
+
6
+ const ui: BookReadingUI = {
7
+ setupLabel: 'Buat rencana membaca', modeLabel: 'Hitung dengan', pagesModeLabel: 'Halaman', wordsModeLabel: 'Kata', amountLabel: 'Total yang dibaca', speedLabel: 'Kecepatan membaca Anda', difficultyLabel: 'Kesulitan teks', difficultyLightLabel: 'Ringan · 1.2x', difficultyStandardLabel: 'Standar · 1.0x', difficultyDenseLabel: 'Padat · 0.8x', wordsPerPageLabel: 'Perkiraan kata per halaman', wordsPerPageHint: 'Kisaran umum: 100 sampai 500', pagesPerHourLabel: 'halaman per jam', wordsPerMinuteLabel: 'kata per menit', startDateLabel: 'Tanggal mulai', deadlineLabel: 'Batas waktu', daysPerWeekLabel: 'Hari membaca per minggu', sessionsPerDayLabel: 'Sesi per hari membaca', sessionMinutesLabel: 'Menit per sesi', minutesRangeLabel: '5 sampai 240 menit', hourShortLabel: 'jam', minuteShortLabel: 'mnt', bufferShortLabel: 'kurang', bufferExtraLabel: 'ekstra', speedTestLabel: 'Ukur kecepatan membaca', speedTestHint: 'Gunakan bacaan pendek yang mewakili', speedTestPromptLabel: 'Bacaan yang akan dibaca', speedTestPlaceholder: 'Tempel atau ketik satu kalimat atau bacaan pendek di sini...', speedTestStartLabel: 'Mulai timer', speedTestFinishLabel: 'Saya selesai', speedTestElapsedLabel: 'Waktu berlalu', speedTestRateLabel: 'Kecepatan perkiraan', speedTestSecondsLabel: 'dtk', speedTestWpmLabel: 'KPM', speedTestUseLabel: 'Gunakan KPM ini dalam mode Kata', speedTestIdle: 'Masukkan bacaan, lalu mulai saat Anda siap.', speedTestRunning: 'Timer berjalan. Bacalah dengan kecepatan alami Anda.', speedTestFinished: 'Tes selesai. Ini perkiraan awal, bukan patokan tetap.', speedTestNeedsText: 'Tambahkan bacaan sebelum memulai timer.', speedTestNoWords: 'Tidak ada kata yang diukur', presetLabel: 'Irama cepat', presetSteadyLabel: 'Minggu teratur', presetWeekendLabel: 'Fokus akhir pekan', presetAcademicLabel: 'Ritme akademik', planLabel: 'Peta membaca Anda', timeNeededLabel: 'Waktu yang dibutuhkan', readingDaysLabel: 'Hari membaca yang dibutuhkan', capacityLabel: 'Hari membaca yang tersedia', dailyPaceLabel: 'Kecepatan sampai batas waktu', estimatedWordsLabel: 'Perkiraan kata', wordsShortLabel: 'kata', sessionTargetLabel: 'Target per sesi', catchUpLabel: 'Cadangan untuk mengejar', finishDateLabel: 'Selesai diperkirakan', milestoneLabel: 'Tonggak', timelineLabel: 'Linimasa tonggak membaca', calendarHint: 'Tonggak adalah penanda rencana. Ubah batas waktu atau irama ketika kehidupan nyata mengganggu jadwal.', exportCalendarLabel: 'Unduh tonggak (.ics)', exportCalendarTitle: 'Tonggak membaca', milestoneStart: 'Mulai', milestoneQuarter: '25%', milestoneHalf: 'Setengah', milestoneThreeQuarter: '75%', milestoneFinish: 'Selesai', statusOnTrack: 'Masih ada ruang', statusTight: 'Pas', statusLate: 'Melewati batas waktu', statusInvalid: 'Periksa tanggal', statusOnTrackDetail: 'Sesi yang tersedia menyisakan cadangan untuk hari yang terlewat atau bab yang lebih lambat.', statusTightDetail: 'Rencana ini muat, tetapi cadangannya sedikit. Sisakan satu sesi untuk mengejar ketertinggalan.', statusLateDetail: 'Irama saat ini tidak cukup sampai batas waktu. Tambah sesi, perpanjang tanggal, atau kurangi target.', statusInvalidDetail: 'Pilih tanggal mulai yang valid dan batas waktu yang sama atau setelahnya.', sourceLabel: 'Ini adalah perkiraan irama, bukan jaminan pemahaman atau kecepatan membaca tetap. Ukur kecepatan Anda sendiri dengan bacaan yang mewakili.',
8
+ };
9
+
10
+ const faq = [
11
+ { question: 'Bagaimana memilih kecepatan membaca?', answer: 'Ukur waktu untuk bacaan yang mewakili, hitung halaman atau katanya, lalu gunakan kecepatan yang terukur. Buku padat, teknis, baru, atau penuh anotasi biasanya membutuhkan waktu lebih lama.' },
12
+ { question: 'Apakah rencana ini menjamin saya memahami buku?', answer: 'Tidak. Rencana ini mengubah kecepatan dan jadwal Anda menjadi perkiraan kalender. Kelancaran membaca tidak sama dengan pemahaman, jadi perlambat saat teks membutuhkan telaah mendalam.' },
13
+ { question: 'Apa arti cadangan untuk mengejar?', answer: 'Ini adalah jumlah sesi yang tersisa setelah waktu membaca yang diperkirakan ditempatkan sebelum batas waktu. Nilai negatif berarti kapasitas irama saat ini tidak mencukupi.' },
14
+ { question: 'Mengapa bisa merencanakan dengan halaman atau kata?', answer: 'Halaman praktis untuk buku cetak, sedangkan kata lebih mudah dibandingkan pada teks digital atau bacaan tugas. Pilih satuan yang dapat Anda lacak secara konsisten.' },
15
+ ];
16
+
17
+ const howTo = [
18
+ { name: 'Pilih satuan membaca', text: 'Hitung buku dengan halaman atau kata, lalu masukkan jumlah totalnya.' },
19
+ { name: 'Ukur irama Anda', text: 'Gunakan kecepatan pribadi yang diukur, bukan janji umum tentang membaca cepat.' },
20
+ { name: 'Atur irama mingguan', text: 'Tentukan menit per sesi, sesi per hari membaca, dan hari membaca per minggu.' },
21
+ { name: 'Periksa batas waktu', text: 'Tinjau tanggal selesai, kecepatan harian, dan tonggak, lalu simpan cadangan untuk gangguan nyata.' },
22
+ ];
23
+
24
+ const seo: ToolLocaleContent<BookReadingUI>['seo'] = [
25
+ { type: 'title', text: 'Rencanakan kecepatan membaca dan batas waktu buku', level: 2 },
26
+ { type: 'paragraph', html: 'Ubah target halaman atau kata menjadi kalender membaca yang realistis. Masukkan jumlah bacaan, kecepatan terukur, durasi dan frekuensi sesi, serta tanggal selesai yang diinginkan.' },
27
+ { type: 'title', text: 'Gunakan kecepatan membaca Anda sendiri', level: 2 },
28
+ { type: 'paragraph', html: 'Tes waktu pribadi lebih berguna daripada janji membaca cepat yang berlaku umum. Ukur bacaan yang mewakili dan turunkan kecepatannya jika buku padat, baru, atau perlu dibaca dengan teliti.' },
29
+ { type: 'list', items: ['Pilih Halaman untuk buku cetak atau Kata untuk teks digital dan bacaan tugas.', 'Ukur bacaan yang mewakili dan gunakan kecepatan yang dapat dipertahankan dengan pemahaman yang diperlukan.', 'Atur durasi sesi, sesi per hari, dan hari membaca per minggu.', 'Gunakan cadangan untuk hari yang terlewat, bukan menjadikan setiap sesi sebagai kewajiban.', 'Bandingkan rencana dengan kemajuan nyata setelah beberapa sesi pertama.'] },
30
+ { type: 'title', text: 'Baca peta batas waktu', level: 2 },
31
+ { type: 'paragraph', html: 'Waktu yang dibutuhkan adalah usaha perkiraan pada kecepatan Anda. Hari membaca yang dibutuhkan mengubahnya menjadi sesi. Hari tersedia memperkirakan kapasitas antara awal dan batas waktu berdasarkan hari membaca mingguan.' },
32
+ { type: 'table', headers: ['Hasil', 'Artinya'], rows: [['Kecepatan sampai batas waktu', 'Jumlah bacaan untuk setiap hari membaca yang tersedia'], ['Target per sesi', 'Jumlah bacaan untuk satu sesi yang direncanakan'], ['Cadangan untuk mengejar', 'Sesi tersisa setelah usaha dipasang dalam jadwal'], ['Selesai diperkirakan', 'Tanggal selesai jika irama mingguan tetap']] },
33
+ { type: 'tip', title: 'Kalender bukan pemahaman', html: 'Rencana ini tidak mengukur pemahaman, kesulitan, kelelahan, membaca ulang, atau gangguan. Gunakan sebagai komitmen awal dan perbarui dengan kecepatan nyata Anda.' },
34
+ { type: 'title', text: 'Saat rencana terlalu ketat atau terlambat', level: 2 },
35
+ { type: 'paragraph', html: 'Masih ada ruang jika sesi perkiraan muat dengan cadangan. Rencana yang pas sebaiknya memiliki satu sesi fleksibel. Jika selesai melewati batas waktu, perpanjang tanggal, tambah sesi, tambah hari membaca, atau kurangi target.' },
36
+ { type: 'tip', title: 'Ukur sebelum mengoptimalkan', html: 'Setelah dua atau tiga sesi, bandingkan kemajuan yang direncanakan dengan kemajuan nyata. Jika selisih bertahan, ubah kecepatan, bukan memaksa kalender mengikuti perkiraan yang terlalu optimistis.' },
37
+ ];
38
+
39
+ const schemas: [WithContext<SoftwareApplication>, WithContext<FAQPage>, WithContext<HowTo>] = [
40
+ { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: 'Rencanakan kecepatan membaca dan batas waktu buku', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' } },
41
+ { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) },
42
+ { '@context': 'https://schema.org', '@type': 'HowTo', name: 'Merencanakan batas waktu membaca', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) },
43
+ ];
44
+
45
+ export const content: ToolLocaleContent<BookReadingUI> = { slug: 'perencana-waktu-baca-dan-tenggat-buku', title: 'Rencanakan kecepatan membaca dan batas waktu buku', description: 'Rencanakan irama membaca, jadwal sesi, dan tanggal selesai berdasarkan target halaman atau kata.', ui, seo, faq, bibliography, howTo, schemas: schemas as unknown as Record<string, unknown>[] };
@@ -0,0 +1,45 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { BookReadingUI } from '../ui';
3
+ import { bibliography } from '../bibliography';
4
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
5
+
6
+ const ui: BookReadingUI = {
7
+ setupLabel: 'Crea il tuo piano di lettura', modeLabel: 'Conta per', pagesModeLabel: 'Pagine', wordsModeLabel: 'Parole', amountLabel: 'Totale da leggere', speedLabel: 'La tua velocità di lettura', difficultyLabel: 'Difficoltà del testo', difficultyLightLabel: 'Leggero · 1.2x', difficultyStandardLabel: 'Standard · 1.0x', difficultyDenseLabel: 'Denso · 0.8x', wordsPerPageLabel: 'Parole stimate per pagina', wordsPerPageHint: 'Intervallo tipico: da 100 a 500', pagesPerHourLabel: 'pagine all ora', wordsPerMinuteLabel: 'parole al minuto', startDateLabel: 'Data di inizio', deadlineLabel: 'Scadenza', daysPerWeekLabel: 'Giorni di lettura a settimana', sessionsPerDayLabel: 'Sessioni per giorno di lettura', sessionMinutesLabel: 'Minuti per sessione', minutesRangeLabel: 'Da 5 a 240 min', hourShortLabel: 'h', minuteShortLabel: 'min', bufferShortLabel: 'mancanti', bufferExtraLabel: 'extra', speedTestLabel: 'Misura la tua velocità di lettura', speedTestHint: 'Usa un brano breve e rappresentativo', speedTestPromptLabel: 'Brano da leggere', speedTestPlaceholder: 'Incolla o scrivi qui una frase o un breve brano...', speedTestStartLabel: 'Avvia timer', speedTestFinishLabel: 'Ho finito', speedTestElapsedLabel: 'Tempo trascorso', speedTestRateLabel: 'Ritmo stimato', speedTestSecondsLabel: 's', speedTestWpmLabel: 'PPM', speedTestUseLabel: 'Usa questi PPM nella modalità Parole', speedTestIdle: 'Inserisci un brano e avvia il timer quando sei pronto.', speedTestRunning: 'Timer attivo. Leggi al tuo ritmo naturale.', speedTestFinished: 'Test completato. È una prima stima, non un riferimento fisso.', speedTestNeedsText: 'Aggiungi un brano prima di avviare il timer.', speedTestNoWords: 'Nessuna parola misurata', presetLabel: 'Ritmo rapido', presetSteadyLabel: 'Settimana regolare', presetWeekendLabel: 'Focus del weekend', presetAcademicLabel: 'Ritmo di studio', planLabel: 'La tua mappa di lettura', timeNeededLabel: 'Tempo necessario', readingDaysLabel: 'Giorni di lettura necessari', capacityLabel: 'Giorni di lettura disponibili', dailyPaceLabel: 'Ritmo entro la scadenza', estimatedWordsLabel: 'Parole stimate', wordsShortLabel: 'parole', sessionTargetLabel: 'Obiettivo per sessione', catchUpLabel: 'Margine di recupero', finishDateLabel: 'Fine prevista', milestoneLabel: 'Tappe', timelineLabel: 'Cronologia delle tappe di lettura', calendarHint: 'Le tappe sono riferimenti di pianificazione. Sposta la scadenza o adatta il ritmo quando la vita reale interrompe il programma.', exportCalendarLabel: 'Scarica le tappe (.ics)', exportCalendarTitle: 'Tappe di lettura', milestoneStart: 'Inizio', milestoneQuarter: '25%', milestoneHalf: 'Metà', milestoneThreeQuarter: '75%', milestoneFinish: 'Fine', statusOnTrack: 'C è margine', statusTight: 'A misura', statusLate: 'Oltre la scadenza', statusInvalid: 'Controlla le date', statusOnTrackDetail: 'Le sessioni disponibili lasciano margine per i giorni persi o per un capitolo più lento.', statusTightDetail: 'Il piano è possibile, ma la riserva è ridotta. Lascia una sessione flessibile per recuperare.', statusLateDetail: 'Il ritmo attuale non consente di rispettare la scadenza. Aggiungi sessioni, prolunga il periodo o riduci l obiettivo.', statusInvalidDetail: 'Scegli una data di inizio valida e una scadenza uguale o successiva.', sourceLabel: 'Questa è una stima del ritmo, non una promessa di comprensione né una velocità di lettura fissa. Misura il tuo ritmo su un brano rappresentativo.',
8
+ };
9
+
10
+ const faq = [
11
+ { question: 'Come scelgo la mia velocità di lettura?', answer: 'Cronometra un brano rappresentativo, conta le pagine o le parole e usa il ritmo osservato. I libri densi, tecnici, nuovi o ricchi di annotazioni richiedono spesso più tempo.' },
12
+ { question: 'Il piano garantisce che capirò il libro?', answer: 'No. Trasforma il tuo ritmo e il tuo calendario in una stima. Fluidità e comprensione non sono la stessa cosa, quindi rallenta quando il testo richiede uno studio attento.' },
13
+ { question: 'Che cosa significa il margine di recupero?', answer: 'Indica le sessioni che restano dopo aver collocato il tempo stimato prima della scadenza. Un valore negativo significa che il ritmo scelto non offre capacità sufficiente.' },
14
+ { question: 'Perché posso pianificare per pagine o parole?', answer: 'Le pagine sono pratiche per un libro stampato, mentre le parole sono più confrontabili nei testi digitali o assegnati. Scegli l unità che puoi seguire con costanza.' },
15
+ ];
16
+
17
+ const howTo = [
18
+ { name: 'Scegli l unità di lettura', text: 'Conta il libro in pagine o parole e inserisci il totale.' },
19
+ { name: 'Misura il tuo ritmo', text: 'Usa un ritmo personale misurato invece di una promessa generica di lettura veloce.' },
20
+ { name: 'Definisci il ritmo settimanale', text: 'Imposta minuti per sessione, sessioni per giorno di lettura e giorni di lettura a settimana.' },
21
+ { name: 'Controlla la scadenza', text: 'Esamina la fine prevista, il ritmo giornaliero e le tappe, poi conserva il margine per le interruzioni reali.' },
22
+ ];
23
+
24
+ const seo: ToolLocaleContent<BookReadingUI>['seo'] = [
25
+ { type: 'title', text: 'Pianificare il ritmo di lettura e la scadenza di un libro', level: 2 },
26
+ { type: 'paragraph', html: 'Trasforma un obiettivo di pagine o parole in un calendario di lettura realistico. Inserisci il volume, la velocità misurata, la durata e la frequenza delle sessioni e la data desiderata.' },
27
+ { type: 'title', text: 'Usa il tuo ritmo di lettura', level: 2 },
28
+ { type: 'paragraph', html: 'Un test personale a tempo è più utile di una promessa universale di lettura veloce. Prova un brano rappresentativo e rallenta quando il libro è denso, nuovo o richiede una lettura approfondita.' },
29
+ { type: 'list', items: ['Scegli Pagine per un libro stampato o Parole per un testo digitale o assegnato.', 'Cronometra un brano rappresentativo e usa un ritmo compatibile con la comprensione necessaria.', 'Imposta la durata delle sessioni, le sessioni giornaliere e i giorni di lettura settimanali.', 'Usa il margine per i giorni persi invece di rendere obbligatoria ogni sessione.', 'Confronta il piano con i progressi reali dopo le prime sessioni.'] },
30
+ { type: 'title', text: 'Leggi la mappa della scadenza', level: 2 },
31
+ { type: 'paragraph', html: 'Il tempo necessario è lo sforzo stimato al ritmo scelto. I giorni necessari lo trasformano in sessioni. I giorni disponibili stimano la capacità tra inizio e scadenza in base ai giorni di lettura settimanali.' },
32
+ { type: 'table', headers: ['Risultato', 'Che cosa indica'], rows: [['Ritmo entro la scadenza', 'Quantità da coprire ogni giorno disponibile'], ['Obiettivo per sessione', 'Quantità da raggiungere in una sessione'], ['Margine di recupero', 'Sessioni rimaste dopo aver inserito lo sforzo'], ['Fine prevista', 'Data di fine mantenendo il ritmo settimanale']] },
33
+ { type: 'tip', title: 'Un calendario non misura la comprensione', html: 'Il piano non misura comprensione, difficoltà, stanchezza, riletture o interruzioni. Usalo come primo impegno e aggiornalo con il tuo ritmo reale.' },
34
+ { type: 'title', text: 'Quando il piano è stretto o in ritardo', level: 2 },
35
+ { type: 'paragraph', html: 'C è margine quando le sessioni stimate entrano con una riserva. Un piano a misura merita almeno una sessione flessibile. Se superi la scadenza, prolunga il periodo, aggiungi sessioni o riduci l obiettivo.' },
36
+ { type: 'tip', title: 'Misura prima di ottimizzare', html: 'Dopo due o tre sessioni, confronta il progresso previsto con quello reale. Se la differenza persiste, modifica la velocità invece di forzare un calendario troppo ottimista.' },
37
+ ];
38
+
39
+ const schemas: [WithContext<SoftwareApplication>, WithContext<FAQPage>, WithContext<HowTo>] = [
40
+ { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: 'Pianificare il ritmo di lettura e la scadenza di un libro', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' } },
41
+ { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) },
42
+ { '@context': 'https://schema.org', '@type': 'HowTo', name: 'Pianificare una scadenza di lettura', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) },
43
+ ];
44
+
45
+ export const content: ToolLocaleContent<BookReadingUI> = { slug: 'pianificatore-tempo-lettura-e-scadenza-libro', title: 'Pianificare il ritmo di lettura e la scadenza di un libro', description: 'Pianifica un ritmo di lettura realistico, un calendario di sessioni e una data di fine dal tuo obiettivo di pagine o parole.', ui, seo, faq, bibliography, howTo, schemas: schemas as unknown as Record<string, unknown>[] };
@@ -0,0 +1,45 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { BookReadingUI } from '../ui';
3
+ import { bibliography } from '../bibliography';
4
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
5
+
6
+ const ui: BookReadingUI = {
7
+ setupLabel: '読書プランを作る', modeLabel: '数え方', pagesModeLabel: 'ページ', wordsModeLabel: '単語', amountLabel: '読む量', speedLabel: '読書速度', difficultyLabel: '文章の難しさ', difficultyLightLabel: '読みやすい · 1.2x', difficultyStandardLabel: '標準 · 1.0x', difficultyDenseLabel: '難しい · 0.8x', wordsPerPageLabel: '1ページあたりの推定単語数', wordsPerPageHint: '一般的な範囲: 100から500', pagesPerHourLabel: 'ページ/時', wordsPerMinuteLabel: '単語/分', startDateLabel: '開始日', deadlineLabel: '期限', daysPerWeekLabel: '週の読書日数', sessionsPerDayLabel: '読書日のセッション数', sessionMinutesLabel: '1セッションの分数', minutesRangeLabel: '5から240分', hourShortLabel: '時間', minuteShortLabel: '分', bufferShortLabel: '不足', bufferExtraLabel: '余裕', speedTestLabel: '読書速度を測る', speedTestHint: '短く代表的な文章を使ってください', speedTestPromptLabel: '読む文章', speedTestPlaceholder: 'ここに一文または短い文章を貼り付けてください...', speedTestStartLabel: 'タイマーを開始', speedTestFinishLabel: '読み終えた', speedTestElapsedLabel: '経過時間', speedTestRateLabel: '推定ペース', speedTestSecondsLabel: '秒', speedTestWpmLabel: '単語/分', speedTestUseLabel: 'この速度を単語モードで使う', speedTestIdle: '文章を入力し、準備ができたら開始してください。', speedTestRunning: 'タイマーが動作中です。自然なペースで読んでください。', speedTestFinished: 'テスト完了。これは最初の目安であり、固定値ではありません。', speedTestNeedsText: 'タイマーを開始する前に文章を追加してください。', speedTestNoWords: '測定できる単語がありません', presetLabel: 'クイック設定', presetSteadyLabel: '安定した週', presetWeekendLabel: '週末集中', presetAcademicLabel: '学習用ペース', planLabel: '読書マップ', timeNeededLabel: '必要な時間', readingDaysLabel: '必要な読書日数', capacityLabel: '利用できる読書日数', dailyPaceLabel: '期限までのペース', estimatedWordsLabel: '推定単語数', wordsShortLabel: '単語', sessionTargetLabel: 'セッションごとの目標', catchUpLabel: '遅れを取り戻す余裕', finishDateLabel: '終了予定日', milestoneLabel: '節目', timelineLabel: '読書の節目タイムライン', calendarHint: '節目は計画上の目印です。現実の予定で中断したら、期限やペースを調整してください。', exportCalendarLabel: '節目をダウンロード (.ics)', exportCalendarTitle: '読書の節目', milestoneStart: '開始', milestoneQuarter: '25%', milestoneHalf: '半分', milestoneThreeQuarter: '75%', milestoneFinish: '終了', statusOnTrack: '余裕あり', statusTight: 'ぎりぎり', statusLate: '期限超過', statusInvalid: '日付を確認', statusOnTrackDetail: '利用できるセッションに、休んだ日や遅い章のための余裕があります。', statusTightDetail: '計画は収まりますが、余裕は少なめです。遅れを取り戻すためのセッションを一つ空けておきましょう。', statusLateDetail: '現在のペースでは期限に間に合いません。セッションや読書日を増やすか、目標を減らしてください。', statusInvalidDetail: '有効な開始日と、開始日以降の期限を選んでください。', sourceLabel: 'これはペースの推定であり、理解度の保証や固定された読書速度ではありません。代表的な文章で自分の速度を測ってください。',
8
+ };
9
+
10
+ const faq = [
11
+ { question: '読書速度はどう選べばよいですか?', answer: '代表的な文章を読む時間を測り、ページ数または単語数から実際のペースを出してください。難しい本、専門書、初めて読む内容、注釈の多い本は時間がかかります。' },
12
+ { question: 'このプランで本の内容を理解できると保証されますか?', answer: 'いいえ。速度と予定をカレンダーの目安に変換するだけです。読む速さと理解度は同じではないため、詳しく読む必要がある箇所では速度を下げてください。' },
13
+ { question: '遅れを取り戻す余裕とは何ですか?', answer: '推定した読書時間を期限までに配置したあとに残るセッション数です。負の値なら、現在のペースでは必要な量を収められません。' },
14
+ { question: 'ページと単語の両方で計画できるのはなぜですか?', answer: '紙の本ではページが便利で、電子書籍や課題文では単語数のほうが比較しやすい場合があります。継続して記録できる単位を選んでください。' },
15
+ ];
16
+
17
+ const howTo = [
18
+ { name: '読む単位を選ぶ', text: '本をページまたは単語で数え、合計量を入力します。' },
19
+ { name: '自分の速度を測る', text: '一般的な速読の宣伝ではなく、実際に測った自分のペースを使います。' },
20
+ { name: '週のリズムを決める', text: '1回の分数、読書日のセッション数、週の読書日数を設定します。' },
21
+ { name: '期限を確認する', text: '終了予定、1日あたりの量、節目を確認し、現実の中断のために余裕を残します。' },
22
+ ];
23
+
24
+ const seo: ToolLocaleContent<BookReadingUI>['seo'] = [
25
+ { type: 'title', text: '読書ペースと本の期限を計画する', level: 2 },
26
+ { type: 'paragraph', html: 'ページ数または単語数の目標を、現実的な読書カレンダーに変換します。読む量、測定した速度、セッションの長さと頻度、読み終えたい日を入力してください。' },
27
+ { type: 'title', text: '自分の読書速度を使う', level: 2 },
28
+ { type: 'paragraph', html: '個人で時間を測った結果は、一般的な速読の目安より役立ちます。代表的な文章で測定し、内容が難しい、未知である、精読が必要である場合は速度を下げてください。' },
29
+ { type: 'list', items: ['紙の本ならページ、電子文書や課題文なら単語を選びます。', '代表的な文章を測り、必要な理解度を保てる速度を使います。', 'セッションの長さ、1日の回数、週の読書日数を設定します。', 'すべてのセッションを義務にせず、休んだ日のために余裕を使います。', '数回読んだあと、計画と実際の進み方を比べます。'] },
30
+ { type: 'title', text: '期限のマップを読む', level: 2 },
31
+ { type: 'paragraph', html: '必要な時間は、設定した速度での推定作業量です。必要な読書日数は、それをセッションに変換したものです。利用できる読書日数は、週の読書日数を使って開始日から期限までの容量を見積もります。' },
32
+ { type: 'table', headers: ['結果', '意味'], rows: [['期限までのペース', '利用できる各読書日に進める量'], ['セッションごとの目標', '1回のセッションで目指す量'], ['遅れを取り戻す余裕', '推定作業量を配置したあとに残るセッション'], ['終了予定日', '週のリズムを保った場合の終了日']] },
33
+ { type: 'tip', title: 'カレンダーは理解度を測りません', html: 'この計画は理解度、難しさ、疲れ、読み返し、中断を測定しません。最初の約束として使い、実際のペースで更新してください。' },
34
+ { type: 'title', text: '計画が厳しい、または遅れている場合', level: 2 },
35
+ { type: 'paragraph', html: '余裕ありは、推定セッションが予備を残して収まる状態です。ぎりぎりの計画には、柔軟に使えるセッションを一つ用意しましょう。期限を超えるなら、期間を延ばす、回数を増やす、読書日を増やす、目標を減らす方法があります。' },
36
+ { type: 'tip', title: '最適化する前に測る', html: '2、3回読んだら、予定した進み方と実際の進み方を比べてください。差が続くなら、楽観的すぎる予定を無理に守らず速度を修正します。' },
37
+ ];
38
+
39
+ const schemas: [WithContext<SoftwareApplication>, WithContext<FAQPage>, WithContext<HowTo>] = [
40
+ { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: '読書ペースと本の期限を計画する', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', offers: { '@type': 'Offer', price: '0', priceCurrency: 'JPY' } },
41
+ { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) },
42
+ { '@context': 'https://schema.org', '@type': 'HowTo', name: '読書の期限を計画する', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) },
43
+ ];
44
+
45
+ export const content: ToolLocaleContent<BookReadingUI> = { slug: 'book-reading-time-deadline-planner', title: '読書ペースと本の期限を計画する', description: 'ページ数または単語数から、現実的な読書ペース、セッション、終了日を計画します。', ui, seo, faq, bibliography, howTo, schemas: schemas as unknown as Record<string, unknown>[] };
@@ -0,0 +1,45 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { BookReadingUI } from '../ui';
3
+ import { bibliography } from '../bibliography';
4
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
5
+
6
+ const ui: BookReadingUI = {
7
+ setupLabel: '독서 계획 만들기', modeLabel: '계산 기준', pagesModeLabel: '페이지', wordsModeLabel: '단어', amountLabel: '읽을 총량', speedLabel: '읽기 속도', difficultyLabel: '텍스트 난이도', difficultyLightLabel: '쉬움 · 1.2x', difficultyStandardLabel: '표준 · 1.0x', difficultyDenseLabel: '어려움 · 0.8x', wordsPerPageLabel: '페이지당 예상 단어 수', wordsPerPageHint: '일반 범위: 100에서 500', pagesPerHourLabel: '페이지/시간', wordsPerMinuteLabel: '단어/분', startDateLabel: '시작일', deadlineLabel: '마감일', daysPerWeekLabel: '주간 독서 일수', sessionsPerDayLabel: '독서일당 세션 수', sessionMinutesLabel: '세션당 시간', minutesRangeLabel: '5에서 240분', hourShortLabel: '시간', minuteShortLabel: '분', bufferShortLabel: '부족', bufferExtraLabel: '여유', speedTestLabel: '읽기 속도 측정', speedTestHint: '짧고 대표적인 글을 사용하세요', speedTestPromptLabel: '읽을 글', speedTestPlaceholder: '여기에 한 문장이나 짧은 글을 붙여 넣으세요...', speedTestStartLabel: '타이머 시작', speedTestFinishLabel: '다 읽었습니다', speedTestElapsedLabel: '경과 시간', speedTestRateLabel: '예상 속도', speedTestSecondsLabel: '초', speedTestWpmLabel: '단어/분', speedTestUseLabel: '이 속도를 단어 모드에 사용', speedTestIdle: '글을 입력하고 준비되면 시작하세요.', speedTestRunning: '타이머가 실행 중입니다. 평소 속도로 읽으세요.', speedTestFinished: '테스트 완료. 첫 번째 추정치이며 고정된 기준은 아닙니다.', speedTestNeedsText: '타이머를 시작하기 전에 글을 추가하세요.', speedTestNoWords: '측정된 단어가 없습니다', presetLabel: '빠른 리듬', presetSteadyLabel: '규칙적인 주간 계획', presetWeekendLabel: '주말 집중', presetAcademicLabel: '학습 집중', planLabel: '독서 지도', timeNeededLabel: '필요한 시간', readingDaysLabel: '필요한 독서일', capacityLabel: '가능한 독서일', dailyPaceLabel: '마감일까지의 속도', estimatedWordsLabel: '예상 단어 수', wordsShortLabel: '단어', sessionTargetLabel: '세션별 목표', catchUpLabel: '따라잡기 여유', finishDateLabel: '예상 완료일', milestoneLabel: '이정표', timelineLabel: '독서 이정표 일정', calendarHint: '이정표는 계획을 위한 기준점입니다. 실제 일정으로 중단되면 마감일이나 속도를 조정하세요.', exportCalendarLabel: '이정표 다운로드 (.ics)', exportCalendarTitle: '독서 이정표', milestoneStart: '시작', milestoneQuarter: '25%', milestoneHalf: '절반', milestoneThreeQuarter: '75%', milestoneFinish: '완료', statusOnTrack: '여유 있음', statusTight: '빠듯함', statusLate: '마감일 초과', statusInvalid: '날짜 확인', statusOnTrackDetail: '가능한 세션에 빠진 날이나 느린 장을 위한 여유가 있습니다.', statusTightDetail: '계획은 맞지만 여유가 적습니다. 따라잡을 수 있도록 한 세션을 유연하게 남겨 두세요.', statusLateDetail: '현재 속도로는 마감일까지 끝낼 수 없습니다. 세션이나 독서일을 늘리거나 목표를 줄이세요.', statusInvalidDetail: '유효한 시작일과 시작일 이후의 마감일을 선택하세요.', sourceLabel: '이 도구는 속도를 추정할 뿐 이해도를 보장하거나 고정된 읽기 속도를 제시하지 않습니다. 대표적인 글로 자신의 속도를 측정하세요.',
8
+ };
9
+
10
+ const faq = [
11
+ { question: '읽기 속도는 어떻게 정하나요?', answer: '대표적인 글을 읽는 시간을 재고 페이지나 단어 수를 세어 실제 속도를 구하세요. 어렵거나 기술적이거나 익숙하지 않거나 주석이 많은 책은 시간이 더 걸립니다.' },
12
+ { question: '이 계획이 책을 이해한다고 보장하나요?', answer: '아니요. 읽기 속도와 일정으로 달력상의 추정치를 만들 뿐입니다. 읽는 유창함과 이해도는 같지 않으므로 깊이 읽어야 할 부분에서는 속도를 낮추세요.' },
13
+ { question: '따라잡기 여유는 무엇인가요?', answer: '추정한 독서 시간을 마감일까지 배치한 뒤 남는 세션 수입니다. 음수라면 현재 리듬으로는 필요한 양을 담을 수 없습니다.' },
14
+ { question: '왜 페이지와 단어 중에서 고를 수 있나요?', answer: '인쇄본에는 페이지가 편리하고 디지털 글이나 과제에는 단어 수가 더 비교하기 쉽습니다. 꾸준히 기록할 수 있는 단위를 선택하세요.' },
15
+ ];
16
+
17
+ const howTo = [
18
+ { name: '독서 단위 선택', text: '책을 페이지나 단어로 세고 전체 양을 입력하세요.' },
19
+ { name: '실제 속도 측정', text: '일반적인 속독 홍보가 아니라 직접 측정한 개인 속도를 사용하세요.' },
20
+ { name: '주간 리듬 설정', text: '세션 시간, 독서일당 세션 수, 주간 독서 일수를 정하세요.' },
21
+ { name: '마감일 확인', text: '예상 완료일과 이정표를 확인하고 실제 중단을 위한 여유를 남기세요.' },
22
+ ];
23
+
24
+ const seo: ToolLocaleContent<BookReadingUI>['seo'] = [
25
+ { type: 'title', text: '독서 속도와 책 마감일 계획하기', level: 2 },
26
+ { type: 'paragraph', html: '페이지 또는 단어 목표를 현실적인 독서 일정으로 바꿉니다. 읽을 양, 측정한 속도, 세션의 길이와 빈도, 끝내고 싶은 날짜를 입력하세요.' },
27
+ { type: 'title', text: '자신의 독서 속도 사용하기', level: 2 },
28
+ { type: 'paragraph', html: '직접 시간을 잰 결과가 일반적인 속독 약속보다 유용합니다. 대표적인 글로 측정하고 내용이 어렵거나 낯설거나 자세한 읽기가 필요하면 속도를 낮추세요.' },
29
+ { type: 'list', items: ['인쇄된 책에는 페이지, 디지털 글이나 과제에는 단어를 선택하세요.', '대표적인 글을 측정하고 필요한 이해도를 유지할 수 있는 속도를 사용하세요.', '세션 시간, 하루 세션 수, 주간 독서 일수를 설정하세요.', '모든 세션을 의무로 만들지 말고 빠진 날을 위한 여유를 사용하세요.', '처음 몇 세션 뒤 계획과 실제 진도를 비교하세요.'] },
30
+ { type: 'title', text: '마감일 지도를 읽는 법', level: 2 },
31
+ { type: 'paragraph', html: '필요한 시간은 선택한 속도로 계산한 추정 작업량입니다. 필요한 독서일은 이를 세션으로 바꿉니다. 가능한 독서일은 주간 독서 일수를 기준으로 시작일부터 마감일까지의 용량을 추정합니다.' },
32
+ { type: 'table', headers: ['결과', '의미'], rows: [['마감일까지의 속도', '가능한 각 독서일에 읽을 양'], ['세션별 목표', '한 세션에서 목표로 할 양'], ['따라잡기 여유', '추정 작업량을 배치한 뒤 남는 세션'], ['예상 완료일', '주간 리듬을 유지했을 때의 종료일']] },
33
+ { type: 'tip', title: '달력은 이해도를 측정하지 않습니다', html: '이 계획은 이해도, 난이도, 피로, 다시 읽기, 중단을 측정하지 않습니다. 첫 약속으로 사용하고 실제 속도로 업데이트하세요.' },
34
+ { type: 'title', text: '계획이 빠듯하거나 늦어지는 경우', level: 2 },
35
+ { type: 'paragraph', html: '여유 있음은 추정 세션이 예비 시간을 남기고 들어가는 상태입니다. 빠듯한 계획에는 유연한 세션을 하나 남겨 두는 것이 좋습니다. 마감일을 넘는다면 기간을 늘리거나 세션과 독서일을 추가하거나 목표를 줄이세요.' },
36
+ { type: 'tip', title: '최적화하기 전에 측정하세요', html: '두세 번 읽은 뒤 계획한 진도와 실제 진도를 비교하세요. 차이가 계속되면 지나치게 낙관적인 달력을 강요하지 말고 속도를 수정하세요.' },
37
+ ];
38
+
39
+ const schemas: [WithContext<SoftwareApplication>, WithContext<FAQPage>, WithContext<HowTo>] = [
40
+ { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: '독서 속도와 책 마감일 계획하기', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', offers: { '@type': 'Offer', price: '0', priceCurrency: 'KRW' } },
41
+ { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) },
42
+ { '@context': 'https://schema.org', '@type': 'HowTo', name: '독서 마감일 계획하기', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) },
43
+ ];
44
+
45
+ export const content: ToolLocaleContent<BookReadingUI> = { slug: 'book-reading-time-deadline-planner', title: '독서 속도와 책 마감일 계획하기', description: '페이지 또는 단어 목표를 바탕으로 현실적인 독서 속도와 세션, 완료일을 계획하세요.', ui, seo, faq, bibliography, howTo, schemas: schemas as unknown as Record<string, unknown>[] };
@@ -0,0 +1,45 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { BookReadingUI } from '../ui';
3
+ import { bibliography } from '../bibliography';
4
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
5
+
6
+ const ui: BookReadingUI = {
7
+ setupLabel: 'Maak je leesplan', modeLabel: 'Tellen in', pagesModeLabel: 'Pagina s', wordsModeLabel: 'Woorden', amountLabel: 'Totaal te lezen', speedLabel: 'Je leessnelheid', difficultyLabel: 'Moeilijkheid van de tekst', difficultyLightLabel: 'Licht · 1.2x', difficultyStandardLabel: 'Standaard · 1.0x', difficultyDenseLabel: 'Dicht · 0.8x', wordsPerPageLabel: 'Geschat aantal woorden per pagina', wordsPerPageHint: 'Gebruikelijk bereik: 100 tot 500', pagesPerHourLabel: 'pagina s per uur', wordsPerMinuteLabel: 'woorden per minuut', startDateLabel: 'Startdatum', deadlineLabel: 'Deadline', daysPerWeekLabel: 'Leesdagen per week', sessionsPerDayLabel: 'Sessies per leesdag', sessionMinutesLabel: 'Minuten per sessie', minutesRangeLabel: '5 tot 240 min.', hourShortLabel: 'uur', minuteShortLabel: 'min.', bufferShortLabel: 'tekort', bufferExtraLabel: 'extra', speedTestLabel: 'Meet je leessnelheid', speedTestHint: 'Gebruik een korte, representatieve tekst', speedTestPromptLabel: 'Te lezen tekst', speedTestPlaceholder: 'Plak of typ hier een zin of korte tekst...', speedTestStartLabel: 'Timer starten', speedTestFinishLabel: 'Ik ben klaar', speedTestElapsedLabel: 'Verstreken', speedTestRateLabel: 'Geschat tempo', speedTestSecondsLabel: 'sec.', speedTestWpmLabel: 'WPM', speedTestUseLabel: 'Gebruik deze WPM in de woordenmodus', speedTestIdle: 'Voer een tekst in en start wanneer je klaar bent.', speedTestRunning: 'Timer loopt. Lees in je natuurlijke tempo.', speedTestFinished: 'Test voltooid. Dit is een eerste schatting, geen vaste norm.', speedTestNeedsText: 'Voeg tekst toe voordat je de timer start.', speedTestNoWords: 'Geen woorden gemeten', presetLabel: 'Snel ritme', presetSteadyLabel: 'Gelijkmatige week', presetWeekendLabel: 'Weekendfocus', presetAcademicLabel: 'Studieritme', planLabel: 'Je leeskaart', timeNeededLabel: 'Benodigde tijd', readingDaysLabel: 'Benodigde leesdagen', capacityLabel: 'Beschikbare leesdagen', dailyPaceLabel: 'Tempo tot de deadline', estimatedWordsLabel: 'Geschatte woorden', wordsShortLabel: 'woorden', sessionTargetLabel: 'Doel per sessie', catchUpLabel: 'Inhaalruimte', finishDateLabel: 'Verwachte einddatum', milestoneLabel: 'Mijlpalen', timelineLabel: 'Tijdlijn van leesmijlpalen', calendarHint: 'Mijlpalen zijn planningspunten. Verplaats de deadline of pas je ritme aan wanneer het echte leven je plan onderbreekt.', exportCalendarLabel: 'Mijlpalen downloaden (.ics)', exportCalendarTitle: 'Leesmijlpalen', milestoneStart: 'Start', milestoneQuarter: '25%', milestoneHalf: 'Half', milestoneThreeQuarter: '75%', milestoneFinish: 'Einde', statusOnTrack: 'Ruimte in het plan', statusTight: 'Krap passend', statusLate: 'Na de deadline', statusInvalid: 'Controleer de datums', statusOnTrackDetail: 'Je beschikbare sessies laten ruimte voor gemiste dagen of een trager hoofdstuk.', statusTightDetail: 'Het plan past, maar er is weinig reserve. Houd een sessie flexibel om achterstand in te halen.', statusLateDetail: 'Het huidige ritme haalt de deadline niet. Voeg sessies toe, verleng de periode of verlaag het doel.', statusInvalidDetail: 'Kies een geldige startdatum en een deadline op of na die datum.', sourceLabel: 'Dit is een schatting van je tempo, geen belofte over begrip en geen vaste leessnelheid. Meet je eigen tempo met een representatieve tekst.',
8
+ };
9
+
10
+ const faq = [
11
+ { question: 'Hoe kies ik mijn leessnelheid?', answer: 'Meet de tijd voor een representatieve tekst, tel de pagina s of woorden en gebruik het gemeten tempo. Dichte, technische, onbekende of sterk geannoteerde boeken kosten meestal meer tijd.' },
12
+ { question: 'Garandeert het plan dat ik het boek begrijp?', answer: 'Nee. Het zet je eigen tempo en planning om in een kalenderinschatting. Leesvaardigheid en begrip zijn niet hetzelfde, dus vertraag bij tekst die aandachtige studie vraagt.' },
13
+ { question: 'Wat betekent de inhaalruimte?', answer: 'Dit is het aantal sessies dat overblijft nadat de geschatte leestijd voor de deadline is ingepland. Een negatieve waarde betekent dat je huidige ritme niet genoeg capaciteit heeft.' },
14
+ { question: 'Waarom kan ik per pagina of woord plannen?', answer: 'Pagina s zijn handig voor een gedrukt boek, terwijl woorden beter vergelijkbaar zijn in digitale teksten of opdrachten. Kies de eenheid die je consequent kunt volgen.' },
15
+ ];
16
+
17
+ const howTo = [
18
+ { name: 'Kies de leeseenheid', text: 'Tel het boek in pagina s of woorden en voer het totaal in.' },
19
+ { name: 'Meet je eigen tempo', text: 'Gebruik een persoonlijk gemeten tempo in plaats van een algemene belofte over snel lezen.' },
20
+ { name: 'Stel het weekritme in', text: 'Kies minuten per sessie, sessies per leesdag en leesdagen per week.' },
21
+ { name: 'Controleer de deadline', text: 'Bekijk de einddatum, het dagtempo en de mijlpalen en houd ruimte voor echte onderbrekingen.' },
22
+ ];
23
+
24
+ const seo: ToolLocaleContent<BookReadingUI>['seo'] = [
25
+ { type: 'title', text: 'Plan je leestempo en de deadline van een boek', level: 2 },
26
+ { type: 'paragraph', html: 'Zet een doel in pagina s of woorden om in een realistische leeskalender. Vul de omvang, je gemeten leessnelheid, de duur en frequentie van sessies en je gewenste einddatum in.' },
27
+ { type: 'title', text: 'Gebruik je eigen leessnelheid', level: 2 },
28
+ { type: 'paragraph', html: 'Een persoonlijke tijdmeting is nuttiger dan een algemene belofte over snel lezen. Test een representatief fragment en verlaag het tempo bij dichte, onbekende of grondig te lezen tekst.' },
29
+ { type: 'list', items: ['Kies Pagina s voor een gedrukt boek of Woorden voor digitale tekst en opdrachten.', 'Meet een representatief fragment en gebruik een tempo dat je met het gewenste begrip kunt volhouden.', 'Stel sessieduur, sessies per dag en leesdagen per week in.', 'Gebruik de inhaalruimte voor gemiste dagen in plaats van elke sessie verplicht te maken.', 'Vergelijk het plan na de eerste sessies met je werkelijke voortgang.'] },
30
+ { type: 'title', text: 'Lees de deadlinekaart', level: 2 },
31
+ { type: 'paragraph', html: 'Benodigde tijd is de geschatte inspanning bij je gekozen tempo. Benodigde leesdagen zetten die inspanning om in sessies. Beschikbare leesdagen schatten de capaciteit tussen start en deadline op basis van je leesdagen per week.' },
32
+ { type: 'table', headers: ['Resultaat', 'Betekenis'], rows: [['Tempo tot de deadline', 'Hoeveelheid voor elke beschikbare leesdag'], ['Doel per sessie', 'Hoeveelheid voor een geplande sessie'], ['Inhaalruimte', 'Sessies die overblijven na het inplannen'], ['Verwachte einddatum', 'Einddatum bij een constant weekritme']] },
33
+ { type: 'tip', title: 'Een kalender meet geen begrip', html: 'Het plan meet geen begrip, moeilijkheid, vermoeidheid, herlezen of onderbrekingen. Gebruik het als eerste afspraak met jezelf en werk het bij met je echte tempo.' },
34
+ { type: 'title', text: 'Wanneer het plan krap of te laat is', level: 2 },
35
+ { type: 'paragraph', html: 'Er is ruimte als de geschatte sessies met reserve passen. Een krap plan heeft minstens een flexibele inhaalsessie nodig. Als je na de deadline uitkomt, verleng je de periode, voeg je sessies toe of verlaag je het doel.' },
36
+ { type: 'tip', title: 'Meet voordat je optimaliseert', html: 'Vergelijk na twee of drie sessies je geplande en werkelijke voortgang. Blijft het verschil bestaan, pas dan je snelheid aan in plaats van een te optimistische kalender te forceren.' },
37
+ ];
38
+
39
+ const schemas: [WithContext<SoftwareApplication>, WithContext<FAQPage>, WithContext<HowTo>] = [
40
+ { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: 'Plan je leestempo en de deadline van een boek', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' } },
41
+ { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) },
42
+ { '@context': 'https://schema.org', '@type': 'HowTo', name: 'Een leesdeadline plannen', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) },
43
+ ];
44
+
45
+ export const content: ToolLocaleContent<BookReadingUI> = { slug: 'planner-leestijd-en-deadline-voor-boek', title: 'Plan je leestempo en de deadline van een boek', description: 'Plan een realistisch leestempo, sessieritme en einddatum op basis van je doel in pagina s of woorden.', ui, seo, faq, bibliography, howTo, schemas: schemas as unknown as Record<string, unknown>[] };
@@ -0,0 +1,45 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { BookReadingUI } from '../ui';
3
+ import { bibliography } from '../bibliography';
4
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
5
+
6
+ const ui: BookReadingUI = {
7
+ setupLabel: 'Utwórz plan czytania', modeLabel: 'Jednostka', pagesModeLabel: 'Strony', wordsModeLabel: 'Słowa', amountLabel: 'Łącznie do przeczytania', speedLabel: 'Twoje tempo czytania', difficultyLabel: 'Trudność tekstu', difficultyLightLabel: 'Łatwy · 1.2x', difficultyStandardLabel: 'Standardowy · 1.0x', difficultyDenseLabel: 'Gęsty · 0.8x', wordsPerPageLabel: 'Szacunkowa liczba słów na stronę', wordsPerPageHint: 'Typowy zakres: od 100 do 500', pagesPerHourLabel: 'stron na godzinę', wordsPerMinuteLabel: 'słów na minutę', startDateLabel: 'Data rozpoczęcia', deadlineLabel: 'Termin', daysPerWeekLabel: 'Dni czytania w tygodniu', sessionsPerDayLabel: 'Sesje w dzień czytania', sessionMinutesLabel: 'Minuty na sesję', minutesRangeLabel: 'Od 5 do 240 min', hourShortLabel: 'godz.', minuteShortLabel: 'min', bufferShortLabel: 'brakuje', bufferExtraLabel: 'zapas', speedTestLabel: 'Zmierz swoje tempo czytania', speedTestHint: 'Użyj krótkiego, reprezentatywnego fragmentu', speedTestPromptLabel: 'Fragment do przeczytania', speedTestPlaceholder: 'Wklej lub wpisz tutaj zdanie albo krótki fragment...', speedTestStartLabel: 'Uruchom timer', speedTestFinishLabel: 'Skończyłem', speedTestElapsedLabel: 'Czas', speedTestRateLabel: 'Szacowane tempo', speedTestSecondsLabel: 's', speedTestWpmLabel: 'SŁM', speedTestUseLabel: 'Użyj tego tempa w trybie Słowa', speedTestIdle: 'Wpisz fragment i uruchom timer, gdy będziesz gotowy.', speedTestRunning: 'Timer działa. Czytaj w swoim naturalnym tempie.', speedTestFinished: 'Test zakończony. To pierwsze przybliżenie, nie stały wzorzec.', speedTestNeedsText: 'Dodaj fragment przed uruchomieniem timera.', speedTestNoWords: 'Nie zmierzono słów', presetLabel: 'Szybki rytm', presetSteadyLabel: 'Równy tydzień', presetWeekendLabel: 'Skupienie w weekend', presetAcademicLabel: 'Rytm nauki', planLabel: 'Twoja mapa czytania', timeNeededLabel: 'Potrzebny czas', readingDaysLabel: 'Potrzebne dni czytania', capacityLabel: 'Dostępne dni czytania', dailyPaceLabel: 'Tempo do terminu', estimatedWordsLabel: 'Szacowane słowa', wordsShortLabel: 'słów', sessionTargetLabel: 'Cel na sesję', catchUpLabel: 'Zapas na nadrobienie', finishDateLabel: 'Przewidywane zakończenie', milestoneLabel: 'Kamienie milowe', timelineLabel: 'Oś kamieni milowych czytania', calendarHint: 'Kamienie milowe są punktami planu. Przesuń termin lub zmień rytm, gdy codzienne sprawy przerwą plan.', exportCalendarLabel: 'Pobierz kamienie milowe (.ics)', exportCalendarTitle: 'Kamienie milowe czytania', milestoneStart: 'Start', milestoneQuarter: '25%', milestoneHalf: 'Połowa', milestoneThreeQuarter: '75%', milestoneFinish: 'Koniec', statusOnTrack: 'Jest zapas', statusTight: 'Plan na styk', statusLate: 'Po terminie', statusInvalid: 'Sprawdź daty', statusOnTrackDetail: 'Dostępne sesje zostawiają zapas na opuszczone dni lub wolniejszy rozdział.', statusTightDetail: 'Plan się mieści, ale zapas jest mały. Zostaw jedną elastyczną sesję na nadrobienie.', statusLateDetail: 'Obecny rytm nie mieści się przed terminem. Dodaj sesje, wydłuż okres albo zmniejsz cel.', statusInvalidDetail: 'Wybierz prawidłową datę rozpoczęcia i termin nie wcześniejszy od niej.', sourceLabel: 'To szacunkowe tempo, a nie obietnica zrozumienia ani stała szybkość czytania. Zmierz własne tempo na reprezentatywnym fragmencie.',
8
+ };
9
+
10
+ const faq = [
11
+ { question: 'Jak wybrać tempo czytania?', answer: 'Zmierz czas czytania reprezentatywnego fragmentu, policz strony lub słowa i użyj uzyskanego tempa. Gęste, techniczne, nieznane albo mocno komentowane książki zwykle wymagają więcej czasu.' },
12
+ { question: 'Czy plan gwarantuje zrozumienie książki?', answer: 'Nie. Zamienia Twoje tempo i harmonogram na przybliżenie kalendarza. Płynność i zrozumienie to nie to samo, więc zwolnij przy tekście wymagającym dokładnej nauki.' },
13
+ { question: 'Co oznacza zapas na nadrobienie?', answer: 'To liczba sesji pozostałych po rozłożeniu szacowanego czasu czytania przed terminem. Wartość ujemna oznacza, że obecny rytm nie zapewnia wystarczającej pojemności.' },
14
+ { question: 'Dlaczego można planować według stron lub słów?', answer: 'Strony są wygodne dla książki drukowanej, a słowa lepiej nadają się do porównywania tekstów cyfrowych i zadań. Wybierz jednostkę, którą możesz regularnie śledzić.' },
15
+ ];
16
+
17
+ const howTo = [
18
+ { name: 'Wybierz jednostkę czytania', text: 'Policz książkę w stronach lub słowach i wpisz łączną liczbę.' },
19
+ { name: 'Zmierz własne tempo', text: 'Użyj zmierzonego tempa zamiast ogólnej obietnicy szybkiego czytania.' },
20
+ { name: 'Ustaw rytm tygodnia', text: 'Wybierz minuty na sesję, sesje w dzień czytania i dni czytania w tygodniu.' },
21
+ { name: 'Sprawdź termin', text: 'Zobacz przewidywane zakończenie, tempo dzienne i kamienie milowe, zostawiając zapas na prawdziwe przerwy.' },
22
+ ];
23
+
24
+ const seo: ToolLocaleContent<BookReadingUI>['seo'] = [
25
+ { type: 'title', text: 'Zaplanuj tempo czytania i termin ukończenia książki', level: 2 },
26
+ { type: 'paragraph', html: 'Zamień cel wyrażony w stronach lub słowach na realistyczny kalendarz czytania. Wpisz objętość, zmierzone tempo, długość i częstotliwość sesji oraz planowaną datę zakończenia.' },
27
+ { type: 'title', text: 'Użyj własnego tempa czytania', level: 2 },
28
+ { type: 'paragraph', html: 'Osobisty pomiar czasu jest bardziej użyteczny niż ogólna obietnica szybkiego czytania. Zmierz reprezentatywny fragment i zwolnij, gdy książka jest gęsta, nieznana lub wymaga dokładnego czytania.' },
29
+ { type: 'list', items: ['Wybierz Strony dla książki drukowanej lub Słowa dla tekstu cyfrowego i zadania.', 'Zmierz reprezentatywny fragment i użyj tempa, które utrzymasz przy potrzebnym poziomie zrozumienia.', 'Ustaw długość sesji, sesje dziennie i dni czytania w tygodniu.', 'Wykorzystaj zapas na opuszczone dni zamiast traktować każdą sesję jako obowiązkową.', 'Po kilku pierwszych sesjach porównaj plan z rzeczywistym postępem.'] },
30
+ { type: 'title', text: 'Jak czytać mapę terminu', level: 2 },
31
+ { type: 'paragraph', html: 'Potrzebny czas to szacowany wysiłek przy wybranym tempie. Potrzebne dni czytania zamieniają go na sesje. Dostępne dni czytania szacują pojemność między początkiem a terminem na podstawie dni czytania w tygodniu.' },
32
+ { type: 'table', headers: ['Wynik', 'Znaczenie'], rows: [['Tempo do terminu', 'Ilość do przeczytania w każdym dostępnym dniu'], ['Cel na sesję', 'Ilość do osiągnięcia podczas jednej sesji'], ['Zapas na nadrobienie', 'Sesje pozostałe po rozłożeniu wysiłku'], ['Przewidywane zakończenie', 'Data końca przy stałym rytmie tygodnia']] },
33
+ { type: 'tip', title: 'Kalendarz nie mierzy zrozumienia', html: 'Plan nie mierzy zrozumienia, trudności, zmęczenia, powtórek ani przerw. Potraktuj go jako pierwsze zobowiązanie i aktualizuj na podstawie rzeczywistego tempa.' },
34
+ { type: 'title', text: 'Gdy plan jest napięty albo spóźniony', level: 2 },
35
+ { type: 'paragraph', html: 'Zapas oznacza, że szacowane sesje mieszczą się z rezerwą. Przy planie na styk warto zostawić jedną elastyczną sesję. Jeśli koniec wypada po terminie, wydłuż okres, dodaj sesje albo zmniejsz cel.' },
36
+ { type: 'tip', title: 'Najpierw mierz, potem optymalizuj', html: 'Po dwóch lub trzech sesjach porównaj planowany i rzeczywisty postęp. Jeśli różnica pozostaje, zmień tempo zamiast wymuszać zbyt optymistyczny kalendarz.' },
37
+ ];
38
+
39
+ const schemas: [WithContext<SoftwareApplication>, WithContext<FAQPage>, WithContext<HowTo>] = [
40
+ { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: 'Zaplanuj tempo czytania i termin ukończenia książki', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', offers: { '@type': 'Offer', price: '0', priceCurrency: 'PLN' } },
41
+ { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) },
42
+ { '@context': 'https://schema.org', '@type': 'HowTo', name: 'Zaplanować termin czytania', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) },
43
+ ];
44
+
45
+ export const content: ToolLocaleContent<BookReadingUI> = { slug: 'planer-czasu-czytania-i-terminu-ksiazki', title: 'Zaplanuj tempo czytania i termin ukończenia książki', description: 'Zaplanuj realistyczne tempo czytania, rytm sesji i datę zakończenia na podstawie liczby stron lub słów.', ui, seo, faq, bibliography, howTo, schemas: schemas as unknown as Record<string, unknown>[] };
@@ -0,0 +1,45 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { BookReadingUI } from '../ui';
3
+ import { bibliography } from '../bibliography';
4
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
5
+
6
+ const ui: BookReadingUI = {
7
+ setupLabel: 'Crie o seu plano de leitura', modeLabel: 'Contar por', pagesModeLabel: 'Páginas', wordsModeLabel: 'Palavras', amountLabel: 'Total para ler', speedLabel: 'A sua velocidade de leitura', difficultyLabel: 'Dificuldade do texto', difficultyLightLabel: 'Leve · 1.2x', difficultyStandardLabel: 'Padrão · 1.0x', difficultyDenseLabel: 'Denso · 0.8x', wordsPerPageLabel: 'Palavras estimadas por página', wordsPerPageHint: 'Intervalo habitual: 100 a 500', pagesPerHourLabel: 'páginas por hora', wordsPerMinuteLabel: 'palavras por minuto', startDateLabel: 'Data de início', deadlineLabel: 'Prazo', daysPerWeekLabel: 'Dias de leitura por semana', sessionsPerDayLabel: 'Sessões por dia de leitura', sessionMinutesLabel: 'Minutos por sessão', minutesRangeLabel: 'De 5 a 240 min', hourShortLabel: 'h', minuteShortLabel: 'min', bufferShortLabel: 'em falta', bufferExtraLabel: 'extra', speedTestLabel: 'Meça a sua velocidade de leitura', speedTestHint: 'Use um trecho curto e representativo', speedTestPromptLabel: 'Trecho para ler', speedTestPlaceholder: 'Cole ou escreva aqui uma frase ou um trecho curto...', speedTestStartLabel: 'Iniciar temporizador', speedTestFinishLabel: 'Terminei', speedTestElapsedLabel: 'Tempo decorrido', speedTestRateLabel: 'Ritmo estimado', speedTestSecondsLabel: 's', speedTestWpmLabel: 'PPM', speedTestUseLabel: 'Usar estas PPM no modo Palavras', speedTestIdle: 'Introduza um trecho e comece quando estiver preparado.', speedTestRunning: 'Temporizador ativo. Leia ao seu ritmo natural.', speedTestFinished: 'Teste concluído. É uma primeira estimativa, não uma referência fixa.', speedTestNeedsText: 'Adicione um trecho antes de iniciar o temporizador.', speedTestNoWords: 'Nenhuma palavra medida', presetLabel: 'Ritmo rápido', presetSteadyLabel: 'Semana regular', presetWeekendLabel: 'Foco no fim de semana', presetAcademicLabel: 'Ritmo de estudo', planLabel: 'O seu mapa de leitura', timeNeededLabel: 'Tempo necessário', readingDaysLabel: 'Dias de leitura necessários', capacityLabel: 'Dias de leitura disponíveis', dailyPaceLabel: 'Ritmo até ao prazo', estimatedWordsLabel: 'Palavras estimadas', wordsShortLabel: 'palavras', sessionTargetLabel: 'Objetivo por sessão', catchUpLabel: 'Margem para recuperar', finishDateLabel: 'Fim previsto', milestoneLabel: 'Marcos', timelineLabel: 'Linha temporal dos marcos de leitura', calendarHint: 'Os marcos são referências de planeamento. Altere o prazo ou adapte o ritmo quando a vida real interromper o plano.', exportCalendarLabel: 'Descarregar marcos (.ics)', exportCalendarTitle: 'Marcos de leitura', milestoneStart: 'Início', milestoneQuarter: '25%', milestoneHalf: 'Metade', milestoneThreeQuarter: '75%', milestoneFinish: 'Fim', statusOnTrack: 'Há margem', statusTight: 'Ajuste apertado', statusLate: 'Depois do prazo', statusInvalid: 'Verifique as datas', statusOnTrackDetail: 'As sessões disponíveis deixam margem para dias perdidos ou capítulos mais lentos.', statusTightDetail: 'O plano cabe, mas tem pouca reserva. Deixe uma sessão flexível para recuperar.', statusLateDetail: 'O ritmo atual não permite cumprir o prazo. Adicione sessões, prolongue o período ou reduza o objetivo.', statusInvalidDetail: 'Escolha uma data de início válida e um prazo igual ou posterior.', sourceLabel: 'Esta é uma estimativa de ritmo, não uma promessa de compreensão nem uma velocidade de leitura fixa. Meça o seu próprio ritmo num trecho representativo.',
8
+ };
9
+
10
+ const faq = [
11
+ { question: 'Como escolho a minha velocidade de leitura?', answer: 'Cronometre um trecho representativo, conte as páginas ou palavras e use o ritmo observado. Livros densos, técnicos, desconhecidos ou muito anotados costumam exigir mais tempo.' },
12
+ { question: 'O plano garante que vou compreender o livro?', answer: 'Não. Converte o seu ritmo e calendário numa estimativa. Fluência e compreensão não são a mesma coisa, por isso abrande quando o texto exigir estudo atento.' },
13
+ { question: 'O que significa a margem para recuperar?', answer: 'É o número de sessões que sobra depois de colocar o tempo estimado antes do prazo. Um valor negativo significa que o ritmo atual não tem capacidade suficiente.' },
14
+ { question: 'Por que posso planear por páginas ou palavras?', answer: 'As páginas são práticas para um livro impresso, enquanto as palavras são mais comparáveis em textos digitais ou tarefas. Escolha a unidade que consegue acompanhar de forma consistente.' },
15
+ ];
16
+
17
+ const howTo = [
18
+ { name: 'Escolha a unidade de leitura', text: 'Conte o livro por páginas ou palavras e introduza o total.' },
19
+ { name: 'Meça o seu ritmo', text: 'Use um ritmo pessoal medido em vez de uma promessa genérica de leitura rápida.' },
20
+ { name: 'Defina o ritmo semanal', text: 'Configure minutos por sessão, sessões por dia de leitura e dias de leitura por semana.' },
21
+ { name: 'Verifique o prazo', text: 'Consulte o fim previsto, o ritmo diário e os marcos, reservando margem para interrupções reais.' },
22
+ ];
23
+
24
+ const seo: ToolLocaleContent<BookReadingUI>['seo'] = [
25
+ { type: 'title', text: 'Planear o ritmo de leitura e o prazo de um livro', level: 2 },
26
+ { type: 'paragraph', html: 'Transforme um objetivo de páginas ou palavras num calendário de leitura realista. Introduza o volume, a velocidade medida, a duração e frequência das sessões e a data em que quer terminar.' },
27
+ { type: 'title', text: 'Use o seu próprio ritmo de leitura', level: 2 },
28
+ { type: 'paragraph', html: 'Uma medição pessoal com cronómetro é mais útil do que uma promessa universal de leitura rápida. Teste um trecho representativo e abrande quando o livro for denso, desconhecido ou exigir leitura atenta.' },
29
+ { type: 'list', items: ['Escolha Páginas para um livro impresso ou Palavras para um texto digital ou atribuído.', 'Cronometre um trecho representativo e use um ritmo que consiga manter com a compreensão necessária.', 'Defina a duração das sessões, as sessões diárias e os dias de leitura por semana.', 'Use a margem para dias perdidos em vez de tratar cada sessão como obrigatória.', 'Compare o plano com o progresso real depois das primeiras sessões.'] },
30
+ { type: 'title', text: 'Leia o mapa do prazo', level: 2 },
31
+ { type: 'paragraph', html: 'O tempo necessário é o esforço estimado ao ritmo escolhido. Os dias necessários convertem esse esforço em sessões. Os dias disponíveis estimam a capacidade entre o início e o prazo com base nos dias de leitura semanais.' },
32
+ { type: 'table', headers: ['Resultado', 'O que indica'], rows: [['Ritmo até ao prazo', 'Quantidade a cobrir em cada dia disponível'], ['Objetivo por sessão', 'Quantidade a atingir numa sessão planeada'], ['Margem para recuperar', 'Sessões restantes depois de distribuir o esforço'], ['Fim previsto', 'Data de conclusão mantendo o ritmo semanal']] },
33
+ { type: 'tip', title: 'Um calendário não mede a compreensão', html: 'O plano não mede compreensão, dificuldade, cansaço, releituras ou interrupções. Use-o como primeiro compromisso e atualize-o com o seu ritmo real.' },
34
+ { type: 'title', text: 'Quando o plano fica apertado ou atrasado', level: 2 },
35
+ { type: 'paragraph', html: 'Há margem quando as sessões estimadas cabem com reserva. Um plano apertado merece uma sessão flexível. Se o fim ultrapassar o prazo, prolongue o período, adicione sessões ou reduza o objetivo.' },
36
+ { type: 'tip', title: 'Meça antes de otimizar', html: 'Depois de duas ou três sessões, compare o progresso previsto com o real. Se a diferença persistir, altere a velocidade em vez de forçar um calendário demasiado otimista.' },
37
+ ];
38
+
39
+ const schemas: [WithContext<SoftwareApplication>, WithContext<FAQPage>, WithContext<HowTo>] = [
40
+ { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: 'Planear o ritmo de leitura e o prazo de um livro', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' } },
41
+ { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) },
42
+ { '@context': 'https://schema.org', '@type': 'HowTo', name: 'Planear um prazo de leitura', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) },
43
+ ];
44
+
45
+ export const content: ToolLocaleContent<BookReadingUI> = { slug: 'planejador-tempo-leitura-e-prazo-livro', title: 'Planear o ritmo de leitura e o prazo de um livro', description: 'Planeie um ritmo de leitura realista, um calendário de sessões e uma data de fim a partir do seu objetivo de páginas ou palavras.', ui, seo, faq, bibliography, howTo, schemas: schemas as unknown as Record<string, unknown>[] };
@@ -0,0 +1,45 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { BookReadingUI } from '../ui';
3
+ import { bibliography } from '../bibliography';
4
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
5
+
6
+ const ui: BookReadingUI = {
7
+ setupLabel: 'Составьте план чтения', modeLabel: 'Считать по', pagesModeLabel: 'Страницам', wordsModeLabel: 'Словам', amountLabel: 'Всего прочитать', speedLabel: 'Ваша скорость чтения', difficultyLabel: 'Сложность текста', difficultyLightLabel: 'Легкий · 1.2x', difficultyStandardLabel: 'Стандартный · 1.0x', difficultyDenseLabel: 'Плотный · 0.8x', wordsPerPageLabel: 'Примерное число слов на странице', wordsPerPageHint: 'Обычно: от 100 до 500', pagesPerHourLabel: 'страниц в час', wordsPerMinuteLabel: 'слов в минуту', startDateLabel: 'Дата начала', deadlineLabel: 'Срок', daysPerWeekLabel: 'Дней чтения в неделю', sessionsPerDayLabel: 'Сеансов в день чтения', sessionMinutesLabel: 'Минут на сеанс', minutesRangeLabel: 'От 5 до 240 минут', hourShortLabel: 'ч', minuteShortLabel: 'мин', bufferShortLabel: 'не хватает', bufferExtraLabel: 'запас', speedTestLabel: 'Измерьте скорость чтения', speedTestHint: 'Возьмите короткий показательный фрагмент', speedTestPromptLabel: 'Текст для чтения', speedTestPlaceholder: 'Вставьте или введите предложение или короткий фрагмент...', speedTestStartLabel: 'Запустить таймер', speedTestFinishLabel: 'Я закончил', speedTestElapsedLabel: 'Прошло', speedTestRateLabel: 'Расчетный темп', speedTestSecondsLabel: 'с', speedTestWpmLabel: 'СЛМ', speedTestUseLabel: 'Использовать этот темп в режиме Слова', speedTestIdle: 'Введите фрагмент и запустите таймер, когда будете готовы.', speedTestRunning: 'Таймер запущен. Читайте в естественном темпе.', speedTestFinished: 'Тест завершен. Это первая оценка, а не постоянная норма.', speedTestNeedsText: 'Добавьте текст перед запуском таймера.', speedTestNoWords: 'Слова не измерены', presetLabel: 'Быстрый ритм', presetSteadyLabel: 'Ровная неделя', presetWeekendLabel: 'Чтение на выходных', presetAcademicLabel: 'Учебный ритм', planLabel: 'Карта чтения', timeNeededLabel: 'Нужно времени', readingDaysLabel: 'Нужно дней чтения', capacityLabel: 'Доступно дней чтения', dailyPaceLabel: 'Темп до срока', estimatedWordsLabel: 'Примерное число слов', wordsShortLabel: 'слов', sessionTargetLabel: 'Цель на сеанс', catchUpLabel: 'Запас для наверстывания', finishDateLabel: 'Ожидаемая дата окончания', milestoneLabel: 'Этапы', timelineLabel: 'Шкала этапов чтения', calendarHint: 'Этапы служат ориентирами для плана. Перенесите срок или измените ритм, если реальные дела прервут чтение.', exportCalendarLabel: 'Скачать этапы (.ics)', exportCalendarTitle: 'Этапы чтения', milestoneStart: 'Начало', milestoneQuarter: '25%', milestoneHalf: 'Половина', milestoneThreeQuarter: '75%', milestoneFinish: 'Конец', statusOnTrack: 'Есть запас', statusTight: 'Впритык', statusLate: 'После срока', statusInvalid: 'Проверьте даты', statusOnTrackDetail: 'Доступные сеансы оставляют запас на пропущенные дни или медленную главу.', statusTightDetail: 'План помещается, но запас небольшой. Оставьте один гибкий сеанс для наверстывания.', statusLateDetail: 'При текущем ритме цель не помещается до срока. Добавьте сеансы, продлите период или уменьшите цель.', statusInvalidDetail: 'Выберите правильную дату начала и срок не раньше нее.', sourceLabel: 'Это оценка темпа, а не гарантия понимания и не фиксированная скорость чтения. Измерьте свой темп на показательном фрагменте.',
8
+ };
9
+
10
+ const faq = [
11
+ { question: 'Как выбрать скорость чтения?', answer: 'Засеките время на показательный фрагмент, посчитайте страницы или слова и используйте полученный темп. Плотные, технические, незнакомые или хорошо аннотированные книги обычно требуют больше времени.' },
12
+ { question: 'Гарантирует ли план понимание книги?', answer: 'Нет. Он превращает ваш темп и расписание в оценку по календарю. Беглость чтения и понимание не одно и то же, поэтому замедляйтесь там, где нужен подробный разбор.' },
13
+ { question: 'Что означает запас для наверстывания?', answer: 'Это число сеансов, оставшихся после размещения расчетного времени до срока. Отрицательное значение означает, что текущего ритма недостаточно.' },
14
+ { question: 'Зачем планировать по страницам или словам?', answer: 'Страницы удобны для печатной книги, а слова проще сравнивать в цифровом тексте или задании. Выберите единицу, которую сможете регулярно отслеживать.' },
15
+ ];
16
+
17
+ const howTo = [
18
+ { name: 'Выберите единицу чтения', text: 'Посчитайте книгу в страницах или словах и введите общий объем.' },
19
+ { name: 'Измерьте свой темп', text: 'Используйте измеренную личную скорость, а не общее обещание быстрого чтения.' },
20
+ { name: 'Настройте недельный ритм', text: 'Задайте минуты на сеанс, число сеансов за день чтения и дни чтения в неделю.' },
21
+ { name: 'Проверьте срок', text: 'Посмотрите дату окончания, дневной темп и этапы, оставив запас на реальные перерывы.' },
22
+ ];
23
+
24
+ const seo: ToolLocaleContent<BookReadingUI>['seo'] = [
25
+ { type: 'title', text: 'Спланируйте темп чтения и срок окончания книги', level: 2 },
26
+ { type: 'paragraph', html: 'Превратите цель в страницах или словах в реалистичный календарь чтения. Укажите объем, измеренную скорость, длительность и частоту сеансов и желаемую дату окончания.' },
27
+ { type: 'title', text: 'Используйте собственный темп чтения', level: 2 },
28
+ { type: 'paragraph', html: 'Личная проверка по времени полезнее универсального обещания быстрого чтения. Измерьте показательный фрагмент и снизьте темп, если книга плотная, незнакомая или требует внимательного изучения.' },
29
+ { type: 'list', items: ['Выберите Страницы для печатной книги или Слова для цифрового текста и задания.', 'Измерьте показательный фрагмент и используйте темп, который сохраняет нужное понимание.', 'Задайте длительность сеансов, число сеансов в день и дни чтения в неделю.', 'Оставьте запас на пропущенные дни, а не превращайте каждый сеанс в обязательство.', 'После первых сеансов сравните план с реальным прогрессом.'] },
30
+ { type: 'title', text: 'Как читать карту срока', level: 2 },
31
+ { type: 'paragraph', html: 'Нужное время показывает расчетные усилия при выбранном темпе. Нужные дни чтения переводят их в сеансы. Доступные дни чтения оценивают вместимость между началом и сроком по числу дней чтения в неделю.' },
32
+ { type: 'table', headers: ['Результат', 'Что он означает'], rows: [['Темп до срока', 'Объем для каждого доступного дня чтения'], ['Цель на сеанс', 'Объем для одного запланированного сеанса'], ['Запас для наверстывания', 'Оставшиеся сеансы после распределения усилий'], ['Ожидаемая дата окончания', 'Дата конца при сохранении недельного ритма']] },
33
+ { type: 'tip', title: 'Календарь не измеряет понимание', html: 'План не измеряет понимание, сложность, усталость, перечитывание или перерывы. Используйте его как первое обязательство и обновляйте по реальному темпу.' },
34
+ { type: 'title', text: 'Если план слишком плотный или опаздывает', level: 2 },
35
+ { type: 'paragraph', html: 'Запас есть, когда расчетные сеансы помещаются с резервом. Для плотного плана оставьте один гибкий сеанс. Если окончание выходит за срок, продлите период, добавьте сеансы или уменьшите цель.' },
36
+ { type: 'tip', title: 'Сначала измерьте, потом улучшайте', html: 'Через два или три сеанса сравните ожидаемый и реальный прогресс. Если разница сохраняется, измените скорость, а не пытайтесь удержать слишком оптимистичный календарь.' },
37
+ ];
38
+
39
+ const schemas: [WithContext<SoftwareApplication>, WithContext<FAQPage>, WithContext<HowTo>] = [
40
+ { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: 'Спланируйте темп чтения и срок окончания книги', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', offers: { '@type': 'Offer', price: '0', priceCurrency: 'RUB' } },
41
+ { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) },
42
+ { '@context': 'https://schema.org', '@type': 'HowTo', name: 'Спланировать срок чтения', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) },
43
+ ];
44
+
45
+ export const content: ToolLocaleContent<BookReadingUI> = { slug: 'planirovshchik-vremeni-chteniya-i-sroka-knigi', title: 'Спланируйте темп чтения и срок окончания книги', description: 'Рассчитайте реалистичный темп чтения, ритм сеансов и дату окончания по количеству страниц или слов.', ui, seo, faq, bibliography, howTo, schemas: schemas as unknown as Record<string, unknown>[] };
@@ -0,0 +1,45 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { BookReadingUI } from '../ui';
3
+ import { bibliography } from '../bibliography';
4
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
5
+
6
+ const ui: BookReadingUI = {
7
+ setupLabel: 'Skapa din läsplan', modeLabel: 'Räkna i', pagesModeLabel: 'Sidor', wordsModeLabel: 'Ord', amountLabel: 'Totalt att läsa', speedLabel: 'Din läshastighet', difficultyLabel: 'Textens svårighetsgrad', difficultyLightLabel: 'Lätt · 1.2x', difficultyStandardLabel: 'Standard · 1.0x', difficultyDenseLabel: 'Tät · 0.8x', wordsPerPageLabel: 'Uppskattade ord per sida', wordsPerPageHint: 'Vanligt intervall: 100 till 500', pagesPerHourLabel: 'sidor per timme', wordsPerMinuteLabel: 'ord per minut', startDateLabel: 'Startdatum', deadlineLabel: 'Deadline', daysPerWeekLabel: 'Läsdagar per vecka', sessionsPerDayLabel: 'Sessioner per läsdag', sessionMinutesLabel: 'Minuter per session', minutesRangeLabel: '5 till 240 min', hourShortLabel: 'tim', minuteShortLabel: 'min', bufferShortLabel: 'korta', bufferExtraLabel: 'extra', speedTestLabel: 'Mät din läshastighet', speedTestHint: 'Använd ett kort och representativt stycke', speedTestPromptLabel: 'Text att läsa', speedTestPlaceholder: 'Klistra in eller skriv en mening eller ett kort stycke här...', speedTestStartLabel: 'Starta timer', speedTestFinishLabel: 'Jag är klar', speedTestElapsedLabel: 'Förfluten tid', speedTestRateLabel: 'Uppskattat tempo', speedTestSecondsLabel: 'sek', speedTestWpmLabel: 'OPM', speedTestUseLabel: 'Använd detta OPM i läget Ord', speedTestIdle: 'Skriv in ett stycke och starta när du är redo.', speedTestRunning: 'Timern körs. Läs i ditt naturliga tempo.', speedTestFinished: 'Testet är klart. Detta är en första uppskattning, inte en fast norm.', speedTestNeedsText: 'Lägg till text innan du startar timern.', speedTestNoWords: 'Inga ord mättes', presetLabel: 'Snabb rytm', presetSteadyLabel: 'Jämn vecka', presetWeekendLabel: 'Helgfokus', presetAcademicLabel: 'Studietempo', planLabel: 'Din läskarta', timeNeededLabel: 'Tid som behövs', readingDaysLabel: 'Nödvändiga läsdagar', capacityLabel: 'Tillgängliga läsdagar', dailyPaceLabel: 'Tempo till deadline', estimatedWordsLabel: 'Uppskattade ord', wordsShortLabel: 'ord', sessionTargetLabel: 'Mål per session', catchUpLabel: 'Utrymme för att komma ikapp', finishDateLabel: 'Beräknat slut', milestoneLabel: 'Milstolpar', timelineLabel: 'Tidslinje för läsmilstolpar', calendarHint: 'Milstolparna är planeringspunkter. Flytta deadlinen eller ändra rytmen när verkligheten avbryter planen.', exportCalendarLabel: 'Ladda ner milstolpar (.ics)', exportCalendarTitle: 'Läsmilstolpar', milestoneStart: 'Start', milestoneQuarter: '25%', milestoneHalf: 'Halvvägs', milestoneThreeQuarter: '75%', milestoneFinish: 'Slut', statusOnTrack: 'Det finns marginal', statusTight: 'Precis lagom', statusLate: 'Efter deadline', statusInvalid: 'Kontrollera datumen', statusOnTrackDetail: 'Dina tillgängliga sessioner lämnar marginal för missade dagar eller ett långsammare kapitel.', statusTightDetail: 'Planen går ihop, men marginalen är liten. Spara en flexibel session för att komma ikapp.', statusLateDetail: 'Den nuvarande rytmen räcker inte före deadlinen. Lägg till sessioner, förläng perioden eller minska målet.', statusInvalidDetail: 'Välj ett giltigt startdatum och en deadline på eller efter startdatumet.', sourceLabel: 'Detta är en uppskattning av tempo, inte ett löfte om förståelse eller en fast läshastighet. Mät ditt eget tempo med ett representativt stycke.',
8
+ };
9
+
10
+ const faq = [
11
+ { question: 'Hur väljer jag min läshastighet?', answer: 'Ta tiden på ett representativt stycke, räkna sidor eller ord och använd det uppmätta tempot. Täta, tekniska, obekanta eller hårt kommenterade böcker kräver ofta mer tid.' },
12
+ { question: 'Garanterar planen att jag förstår boken?', answer: 'Nej. Den omvandlar ditt tempo och ditt schema till en kalenderuppskattning. Läsflyt och förståelse är inte samma sak, så sänk tempot när texten kräver noggrann läsning.' },
13
+ { question: 'Vad betyder utrymme för att komma ikapp?', answer: 'Det är antalet sessioner som återstår när den uppskattade lästiden har placerats före deadlinen. Ett negativt värde betyder att den nuvarande rytmen inte räcker.' },
14
+ { question: 'Varför kan jag planera i sidor eller ord?', answer: 'Sidor är praktiskt för tryckta böcker, medan ord är lättare att jämföra i digital text eller uppgifter. Välj den enhet du kan följa konsekvent.' },
15
+ ];
16
+
17
+ const howTo = [
18
+ { name: 'Välj läsenhet', text: 'Räkna boken i sidor eller ord och skriv in totalen.' },
19
+ { name: 'Mät ditt tempo', text: 'Använd ett personligt uppmätt tempo i stället för ett generellt löfte om snabbläsning.' },
20
+ { name: 'Ställ in veckorytmen', text: 'Ange minuter per session, sessioner per läsdag och läsdagar per vecka.' },
21
+ { name: 'Kontrollera deadlinen', text: 'Se det beräknade slutet, dagstempot och milstolparna och spara marginal för verkliga avbrott.' },
22
+ ];
23
+
24
+ const seo: ToolLocaleContent<BookReadingUI>['seo'] = [
25
+ { type: 'title', text: 'Planera lästempo och deadline för en bok', level: 2 },
26
+ { type: 'paragraph', html: 'Förvandla ett mål i sidor eller ord till en realistisk läskalender. Ange mängden, din uppmätta hastighet, sessionernas längd och frekvens samt datumet då du vill vara klar.' },
27
+ { type: 'title', text: 'Använd din egen läshastighet', level: 2 },
28
+ { type: 'paragraph', html: 'Ett personligt tidstest är mer användbart än ett allmänt löfte om snabbläsning. Testa ett representativt stycke och sänk tempot när boken är tät, obekant eller kräver noggrann läsning.' },
29
+ { type: 'list', items: ['Välj Sidor för en tryckt bok eller Ord för digital text och uppgifter.', 'Ta tiden på ett representativt stycke och använd ett tempo som du kan hålla med önskad förståelse.', 'Ställ in sessionernas längd, sessioner per dag och läsdagar per vecka.', 'Använd marginalen för missade dagar i stället för att göra varje session obligatorisk.', 'Jämför planen med dina faktiska framsteg efter de första sessionerna.'] },
30
+ { type: 'title', text: 'Läs deadlinekartan', level: 2 },
31
+ { type: 'paragraph', html: 'Tid som behövs är den uppskattade arbetsmängden i ditt valda tempo. Nödvändiga läsdagar omvandlar den till sessioner. Tillgängliga läsdagar uppskattar kapaciteten mellan start och deadline utifrån läsdagar per vecka.' },
32
+ { type: 'table', headers: ['Resultat', 'Vad det visar'], rows: [['Tempo till deadline', 'Mängd för varje tillgänglig läsdag'], ['Mål per session', 'Mängd att sikta på i en planerad session'], ['Utrymme för att komma ikapp', 'Sessioner som återstår efter planeringen'], ['Beräknat slut', 'Slutdatum om veckorytmen förblir konstant']] },
33
+ { type: 'tip', title: 'En kalender mäter inte förståelse', html: 'Planen mäter inte förståelse, svårighet, trötthet, omläsning eller avbrott. Använd den som ett första åtagande och uppdatera den med ditt verkliga tempo.' },
34
+ { type: 'title', text: 'När planen är knapp eller för sen', level: 2 },
35
+ { type: 'paragraph', html: 'Det finns marginal när de uppskattade sessionerna ryms med reserv. En knapp plan behöver en flexibel ikappsession. Om slutet hamnar efter deadlinen kan du förlänga perioden, lägga till sessioner eller minska målet.' },
36
+ { type: 'tip', title: 'Mät innan du optimerar', html: 'Efter två eller tre sessioner jämför du planerade och faktiska framsteg. Om skillnaden består, ändra hastigheten i stället för att tvinga fram en alltför optimistisk kalender.' },
37
+ ];
38
+
39
+ const schemas: [WithContext<SoftwareApplication>, WithContext<FAQPage>, WithContext<HowTo>] = [
40
+ { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: 'Planera lästempo och deadline för en bok', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', offers: { '@type': 'Offer', price: '0', priceCurrency: 'SEK' } },
41
+ { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) },
42
+ { '@context': 'https://schema.org', '@type': 'HowTo', name: 'Planera en läsdeadline', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) },
43
+ ];
44
+
45
+ export const content: ToolLocaleContent<BookReadingUI> = { slug: 'planerare-for-lasningstid-och-bokdeadline', title: 'Planera lästempo och deadline för en bok', description: 'Planera ett realistiskt lästempo, ett sessionschema och ett slutdatum utifrån ditt mål i sidor eller ord.', ui, seo, faq, bibliography, howTo, schemas: schemas as unknown as Record<string, unknown>[] };