@jjlmoya/utils-language 1.8.0 → 1.10.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 +3 -1
  3. package/src/entries.ts +3 -1
  4. package/src/index.ts +5 -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/cefr-language-skill-profile-planner/bibliography.astro +6 -0
  8. package/src/tool/cefr-language-skill-profile-planner/bibliography.ts +6 -0
  9. package/src/tool/cefr-language-skill-profile-planner/cefr-language-skill-profile-planner.css +565 -0
  10. package/src/tool/cefr-language-skill-profile-planner/component.astro +100 -0
  11. package/src/tool/cefr-language-skill-profile-planner/controller.ts +158 -0
  12. package/src/tool/cefr-language-skill-profile-planner/dom-views.ts +154 -0
  13. package/src/tool/cefr-language-skill-profile-planner/entry.ts +34 -0
  14. package/src/tool/cefr-language-skill-profile-planner/evaluator.ts +12 -0
  15. package/src/tool/cefr-language-skill-profile-planner/i18n/de.ts +26 -0
  16. package/src/tool/cefr-language-skill-profile-planner/i18n/en.ts +59 -0
  17. package/src/tool/cefr-language-skill-profile-planner/i18n/es.ts +15 -0
  18. package/src/tool/cefr-language-skill-profile-planner/i18n/fr.ts +11 -0
  19. package/src/tool/cefr-language-skill-profile-planner/i18n/id.ts +11 -0
  20. package/src/tool/cefr-language-skill-profile-planner/i18n/it.ts +11 -0
  21. package/src/tool/cefr-language-skill-profile-planner/i18n/ja.ts +11 -0
  22. package/src/tool/cefr-language-skill-profile-planner/i18n/ko.ts +11 -0
  23. package/src/tool/cefr-language-skill-profile-planner/i18n/nl.ts +11 -0
  24. package/src/tool/cefr-language-skill-profile-planner/i18n/pl.ts +11 -0
  25. package/src/tool/cefr-language-skill-profile-planner/i18n/pt.ts +11 -0
  26. package/src/tool/cefr-language-skill-profile-planner/i18n/ru.ts +11 -0
  27. package/src/tool/cefr-language-skill-profile-planner/i18n/sv.ts +11 -0
  28. package/src/tool/cefr-language-skill-profile-planner/i18n/tr.ts +11 -0
  29. package/src/tool/cefr-language-skill-profile-planner/i18n/zh.ts +11 -0
  30. package/src/tool/cefr-language-skill-profile-planner/index.ts +14 -0
  31. package/src/tool/cefr-language-skill-profile-planner/logic.test.ts +38 -0
  32. package/src/tool/cefr-language-skill-profile-planner/logic.ts +131 -0
  33. package/src/tool/cefr-language-skill-profile-planner/seo.astro +9 -0
  34. package/src/tool/cefr-language-skill-profile-planner/storage.ts +24 -0
  35. package/src/tool/cefr-language-skill-profile-planner/types.ts +45 -0
  36. package/src/tool/cefr-language-skill-profile-planner/ui.ts +43 -0
  37. package/src/tool/language-shadowing-session-planner/bibliography.astro +6 -0
  38. package/src/tool/language-shadowing-session-planner/bibliography.ts +6 -0
  39. package/src/tool/language-shadowing-session-planner/component.astro +142 -0
  40. package/src/tool/language-shadowing-session-planner/controller.ts +152 -0
  41. package/src/tool/language-shadowing-session-planner/dom-views.ts +82 -0
  42. package/src/tool/language-shadowing-session-planner/entry.ts +34 -0
  43. package/src/tool/language-shadowing-session-planner/evaluator.ts +17 -0
  44. package/src/tool/language-shadowing-session-planner/i18n/de.ts +54 -0
  45. package/src/tool/language-shadowing-session-planner/i18n/en.ts +128 -0
  46. package/src/tool/language-shadowing-session-planner/i18n/es.ts +45 -0
  47. package/src/tool/language-shadowing-session-planner/i18n/fr.ts +45 -0
  48. package/src/tool/language-shadowing-session-planner/i18n/id.ts +40 -0
  49. package/src/tool/language-shadowing-session-planner/i18n/it.ts +40 -0
  50. package/src/tool/language-shadowing-session-planner/i18n/ja.ts +40 -0
  51. package/src/tool/language-shadowing-session-planner/i18n/ko.ts +40 -0
  52. package/src/tool/language-shadowing-session-planner/i18n/nl.ts +40 -0
  53. package/src/tool/language-shadowing-session-planner/i18n/pl.ts +40 -0
  54. package/src/tool/language-shadowing-session-planner/i18n/pt.ts +40 -0
  55. package/src/tool/language-shadowing-session-planner/i18n/ru.ts +40 -0
  56. package/src/tool/language-shadowing-session-planner/i18n/sv.ts +40 -0
  57. package/src/tool/language-shadowing-session-planner/i18n/tr.ts +40 -0
  58. package/src/tool/language-shadowing-session-planner/i18n/zh.ts +40 -0
  59. package/src/tool/language-shadowing-session-planner/index.ts +14 -0
  60. package/src/tool/language-shadowing-session-planner/language-shadowing-session-planner.css +561 -0
  61. package/src/tool/language-shadowing-session-planner/logic.test.ts +53 -0
  62. package/src/tool/language-shadowing-session-planner/logic.ts +94 -0
  63. package/src/tool/language-shadowing-session-planner/seo.astro +9 -0
  64. package/src/tool/language-shadowing-session-planner/storage.ts +18 -0
  65. package/src/tool/language-shadowing-session-planner/timer-view.ts +55 -0
  66. package/src/tool/language-shadowing-session-planner/timer.test.ts +50 -0
  67. package/src/tool/language-shadowing-session-planner/timer.ts +158 -0
  68. package/src/tool/language-shadowing-session-planner/types.ts +32 -0
  69. package/src/tool/language-shadowing-session-planner/ui.ts +55 -0
  70. package/src/tools.ts +3 -1
@@ -0,0 +1,128 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { ShadowingSessionUI } from '../ui';
4
+
5
+ const ui: ShadowingSessionUI = {
6
+ quickStarts: 'Quick starts',
7
+ quickShort: '5 min loop',
8
+ quickFocused: '12 min focus',
9
+ quickLong: '25 min deep',
10
+ totalMinutes: 'Session budget',
11
+ clipSeconds: 'Clip length',
12
+ repetitions: 'Shadow passes',
13
+ pauseSeconds: 'Pause between passes',
14
+ minutesUnit: 'min',
15
+ secondsUnit: 'sec',
16
+ passesUnit: 'passes',
17
+ resetLabel: 'Reset defaults',
18
+ scheduledShadowing: 'Scheduled shadowing',
19
+ passesLabel: 'passes planned',
20
+ minutesScheduled: 'practice time',
21
+ activeSpeaking: 'Speaking time',
22
+ pauseTime: 'Pause time',
23
+ flexibleBuffer: 'Flexible buffer',
24
+ timelineLabel: 'Session timeline',
25
+ shadowBlock: 'Shadow pass',
26
+ pauseBlock: 'Pause',
27
+ bufferBlock: 'Replay or notes',
28
+ statusFits: 'Exact fit',
29
+ statusShort: 'Budget is short',
30
+ statusBuffer: 'Room to explore',
31
+ shortDetail: 'Only {planned} of {requested} requested passes fit as complete clips. Shorten the clip, lower the repetitions, or add time.',
32
+ bufferDetail: 'All requested passes fit. You have {remaining} left for a replay, a recording check, or notes.',
33
+ fitsDetail: 'Every requested pass and pause lands inside the session budget.',
34
+ budgetNote: 'Budget: {budget}',
35
+ useBuffer: 'Use the final block for a replay with less support, a quick self-recording, or one note about the sound you want to copy.',
36
+ cueTitle: 'Rehearsal cues',
37
+ cuePlay: 'Play the whole clip before changing the target.',
38
+ cueSpeak: 'Stay with the rhythm first, then sharpen one sound.',
39
+ cueNotice: 'Leave one note that changes your next pass.',
40
+ timerTitle: 'Run this rehearsal',
41
+ startTimer: 'Start countdown',
42
+ pauseTimer: 'Pause countdown',
43
+ resumeTimer: 'Resume countdown',
44
+ resetTimer: 'Reset timer',
45
+ timerSoundOn: 'Sound on',
46
+ timerSoundOff: 'Sound off',
47
+ timerIdle: 'Ready',
48
+ timerRunning: 'In progress',
49
+ timerPaused: 'Paused',
50
+ timerComplete: 'Complete',
51
+ timerCompleteDetail: 'Session complete. Reset to run it again.',
52
+ timerStartHint: 'Press start when your clip is ready.',
53
+ timerNoSchedule: 'Add enough time for one complete pass to start the timer.',
54
+ legendShadow: 'Shadow pass',
55
+ legendPause: 'Pause',
56
+ legendBuffer: 'Flexible time',
57
+ inputHelp: 'A pass is one full play-through while you speak along. Pauses happen only between complete passes.',
58
+ numberLocale: 'en-US',
59
+ };
60
+
61
+ const faq = [
62
+ { question: 'What does this shadowing planner calculate?', answer: 'It turns a session budget, clip length, number of shadow passes, and pause length into a timeline. It counts only complete passes, so the result shows exactly how many fit and how much flexible time remains.' },
63
+ { question: 'What is one shadow pass?', answer: 'One pass is a full play-through of the clip while you repeat the speech as closely and immediately as you can. The planner treats its duration as the clip length you enter.' },
64
+ { question: 'Why does the planner stop before a partial pass?', answer: 'A partial pass is not a useful appointment in a practice plan: it changes the clip you intended to repeat. The warning helps you change the budget, clip length, repetitions, or pauses before you start.' },
65
+ { question: 'How should I use the flexible buffer?', answer: 'Use it for one deliberate replay, a short recording and comparison, or notes about rhythm, linking, stress, or a sound to revisit. Do not assume that more repetitions automatically produce better pronunciation.' },
66
+ { question: 'Does this measure pronunciation or guarantee progress?', answer: 'No. It schedules time only. It does not listen to your voice, judge accuracy, estimate proficiency, or guarantee improvement. Choose a clip you understand well enough to repeat and use feedback when accuracy matters.' },
67
+ ];
68
+
69
+ const howTo = [
70
+ { name: 'Set the session budget', text: 'Enter the total minutes you can protect for this practice session.' },
71
+ { name: 'Enter the clip length', text: 'Use the duration of one complete audio or video clip.' },
72
+ { name: 'Choose passes and pauses', text: 'Set the number of complete shadow passes and the pause you need between them.' },
73
+ { name: 'Follow the timeline', text: 'Complete the numbered passes, take the marked pauses, and use the final flexible block for replay, comparison, or notes.' },
74
+ ];
75
+
76
+ const appSchema: SoftwareApplication = {
77
+ '@type': 'SoftwareApplication',
78
+ name: 'Language Shadowing Session Planner',
79
+ applicationCategory: 'EducationalApplication',
80
+ operatingSystem: 'Any',
81
+ isAccessibleForFree: true,
82
+ url: 'https://gamebob.dev/en/language-shadowing-session-planner',
83
+ };
84
+
85
+ const howToSchema: HowTo = {
86
+ '@type': 'HowTo',
87
+ name: 'Plan a language shadowing session',
88
+ step: howTo.map((step) => ({ '@type': 'HowToStep', name: step.name, text: step.text })),
89
+ };
90
+
91
+ const faqSchema: FAQPage = {
92
+ '@type': 'FAQPage',
93
+ mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })),
94
+ };
95
+
96
+ export const content: ToolLocaleContent<ShadowingSessionUI> = {
97
+ slug: 'language-shadowing-session-planner',
98
+ title: 'Language Shadowing Session Planner',
99
+ description: 'Build a timed shadowing practice session from your clip length, repetitions, pauses, and available time.',
100
+ ui,
101
+ seo: [
102
+ { type: 'title', text: 'Turn a Shadowing Clip Into a Session You Can Finish', level: 2 },
103
+ { type: 'paragraph', html: 'Shadowing is easiest to abandon when the practice block has no shape. This planner turns one clip into a finite rehearsal: complete passes are numbered, pauses are visible, and the remaining budget becomes a deliberate replay or note-taking window. You can adjust the plan before pressing play instead of discovering halfway through that the session does not fit.' },
104
+ { type: 'title', text: 'How the Timing Works', level: 2 },
105
+ { type: 'paragraph', html: 'The calculation treats each shadow pass as one full clip length. It adds the pause only between passes, never after the final pass. For example, a 30 second clip repeated four times with 10 second pauses takes 2 minutes and 10 seconds: 120 seconds of speaking plus 30 seconds of pauses. If the budget is shorter than the next complete pass, that pass is not placed on the timeline.' },
106
+ { type: 'title', text: 'Read the Rehearsal Line', level: 2 },
107
+ { type: 'table', headers: ['Mark', 'Meaning', 'Useful action'], rows: [
108
+ ['Numbered coral blocks', 'Complete shadow passes that fit the budget.', 'Speak along with the clip and keep the number as your stopping point.'],
109
+ ['Blue blocks', 'The pause between two complete passes.', 'Breathe, reset your attention, and decide what sound to listen for next.'],
110
+ ['Gold block', 'Time left after all requested passes fit.', 'Use one replay, a recording comparison, or a short note instead of automatic extra volume.'],
111
+ ] },
112
+ { type: 'title', text: 'Make Each Pass More Useful', level: 2 },
113
+ { type: 'paragraph', html: 'Use a clip short enough to repeat without losing the speaker. On an early pass, prioritize staying with the rhythm; on a later pass, listen for stress, reductions, linking, or one consonant you can describe. If the clip is still too difficult to follow, reduce the speed or choose a shorter excerpt before adding more repetitions.' },
114
+ { type: 'list', items: ['Choose audio you can replay without searching for the next segment.', 'Keep the clip length honest, including the complete ending.', 'Use pauses to name one sound feature rather than scrolling through explanations.', 'Use the final buffer for comparison or a note that changes the next session.', 'Bring in teacher or peer feedback when accuracy matters for work, study, or assessment.'] },
115
+ { type: 'tip', title: 'What the planner cannot tell you', html: 'The timeline is arithmetic, not a pronunciation assessment. It does not hear your voice, judge whether your imitation is accurate, or establish a proficiency level. Research on shadowing uses specific learners, tasks, and training conditions, so treat this schedule as a practical container for practice rather than evidence of guaranteed progress.' },
116
+ ],
117
+ faq,
118
+ bibliography: [
119
+ { name: '日本語聴解学習におけるシャドーイングの効果', url: 'https://www.jstage.jst.go.jp/article/jlem/29/1/29_26/_article/-char/ja' },
120
+ { name: 'British Council: Teaching English pronunciation online: Practical tips and benefits of shadowing', url: 'https://americas.britishcouncil.org/new-ways-of-teaching/events/teaching-english-pronunciation-online' },
121
+ ],
122
+ howTo,
123
+ schemas: [
124
+ { '@context': 'https://schema.org', ...appSchema } as unknown as Record<string, unknown>,
125
+ { '@context': 'https://schema.org', ...howToSchema } as unknown as Record<string, unknown>,
126
+ { '@context': 'https://schema.org', ...faqSchema } as unknown as Record<string, unknown>,
127
+ ],
128
+ };
@@ -0,0 +1,45 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { ShadowingSessionUI } from '../ui';
4
+
5
+ const ui: ShadowingSessionUI = {
6
+ quickStarts: 'Inicios rápidos', quickShort: 'Bucle de 5 min', quickFocused: 'Enfoque de 12 min', quickLong: 'Profundo de 25 min',
7
+ totalMinutes: 'Presupuesto de sesión', clipSeconds: 'Duración del clip', repetitions: 'Pasadas de shadowing', pauseSeconds: 'Pausa entre pasadas', minutesUnit: 'min', secondsUnit: 's', passesUnit: 'pasadas', resetLabel: 'Restablecer valores', scheduledShadowing: 'Shadowing programado', passesLabel: 'pasadas previstas', minutesScheduled: 'tiempo de práctica', activeSpeaking: 'Tiempo hablando', pauseTime: 'Tiempo de pausa', flexibleBuffer: 'Margen flexible',
8
+ timelineLabel: 'Línea temporal de la sesión', shadowBlock: 'Pasada de shadowing', pauseBlock: 'Pausa', bufferBlock: 'Repetición o notas', statusFits: 'Encaja justo', statusShort: 'Falta presupuesto', statusBuffer: 'Margen disponible',
9
+ shortDetail: 'Solo caben {planned} de las {requested} pasadas solicitadas como clips completos. Acorta el clip, reduce las repeticiones o añade tiempo.', bufferDetail: 'Caben todas las pasadas solicitadas. Te quedan {remaining} para repetir, comprobar una grabación o tomar notas.', fitsDetail: 'Cada pasada y cada pausa solicitadas caben dentro del presupuesto de la sesión.', budgetNote: 'Presupuesto: {budget}', useBuffer: 'Usa el bloque final para repetir con menos apoyo, grabarte rápidamente o anotar el sonido que quieres imitar.',
10
+ cueTitle: 'Claves de ensayo', cuePlay: 'Reproduce el clip entero antes de cambiar el objetivo.', cueSpeak: 'Sigue primero el ritmo y después afina un sonido.', cueNotice: 'Deja una nota que cambie tu próxima pasada.', timerTitle: 'Ejecuta este ensayo', startTimer: 'Iniciar cuenta atrás', pauseTimer: 'Pausar cuenta atrás', resumeTimer: 'Reanudar cuenta atrás', resetTimer: 'Reiniciar temporizador', timerSoundOn: 'Sonido activado', timerSoundOff: 'Sonido desactivado', timerIdle: 'Preparado', timerRunning: 'En curso', timerPaused: 'En pausa', timerComplete: 'Completado', timerCompleteDetail: 'Sesión completada. Reinicia el temporizador para repetirla.', timerStartHint: 'Pulsa iniciar cuando tu clip esté listo.', timerNoSchedule: 'Añade tiempo suficiente para una pasada completa para iniciar el temporizador.', legendShadow: 'Pasada de shadowing', legendPause: 'Pausa', legendBuffer: 'Tiempo flexible', inputHelp: 'Una pasada es una reproducción completa mientras hablas a la vez. Las pausas solo ocurren entre pasadas completas.', numberLocale: 'es-ES',
11
+ };
12
+
13
+ const faq = [
14
+ { question: '¿Qué calcula este planificador de shadowing?', answer: 'Convierte el presupuesto de la sesión, la duración del clip, el número de pasadas y la pausa en una línea temporal. Solo cuenta pasadas completas, para mostrar exactamente cuántas caben y cuánto tiempo flexible queda.' },
15
+ { question: '¿Qué es una pasada de shadowing?', answer: 'Es una reproducción completa del clip mientras repites el discurso con la mayor precisión e inmediatez posibles. El planificador usa la duración del clip que introduces.' },
16
+ { question: '¿Por qué el planificador se detiene antes de una pasada parcial?', answer: 'Una pasada parcial no resulta útil en un plan porque cambia el clip que querías repetir. El aviso te ayuda a cambiar el presupuesto, la duración, las repeticiones o las pausas antes de empezar.' },
17
+ { question: '¿Cómo uso el margen flexible?', answer: 'Úsalo para una repetición intencionada, una grabación breve con comparación o notas sobre ritmo, enlaces, acento o un sonido que quieras revisar. Más repeticiones no producen automáticamente mejor pronunciación.' },
18
+ { question: '¿Mide mi pronunciación o predice que mejoraré?', answer: 'No. Solo organiza el tiempo. No escucha tu voz, no juzga la precisión, no estima tu nivel ni promete una mejora. Elige un clip que entiendas lo suficiente y busca feedback cuando la exactitud sea importante.' },
19
+ ];
20
+ const howTo = [
21
+ { name: 'Define el presupuesto', text: 'Introduce los minutos totales que puedes reservar para esta sesión de práctica.' },
22
+ { name: 'Introduce la duración', text: 'Usa la duración de un clip completo de audio o vídeo.' },
23
+ { name: 'Elige pasadas y pausas', text: 'Define cuántas pasadas completas harás y qué pausa necesitas entre ellas.' },
24
+ { name: 'Sigue la línea temporal', text: 'Completa las pasadas numeradas, respeta las pausas marcadas y usa el bloque flexible final para repetir, comparar o tomar notas.' },
25
+ ];
26
+ const appSchema: SoftwareApplication = { '@type': 'SoftwareApplication', name: 'Planificador de sesiones de shadowing de idiomas', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', isAccessibleForFree: true, url: 'https://gamebob.dev/es/planificador-sesion-shadowing-idiomas' };
27
+ const howToSchema: HowTo = { '@type': 'HowTo', name: 'Planificar una sesión de shadowing', step: howTo.map((step) => ({ '@type': 'HowToStep', name: step.name, text: step.text })) };
28
+ const faqSchema: FAQPage = { '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
29
+
30
+ export const content: ToolLocaleContent<ShadowingSessionUI> = {
31
+ slug: 'planificador-sesion-shadowing-idiomas', title: 'Planificador de sesiones de shadowing de idiomas', description: 'Crea una sesión de práctica de shadowing con tiempos a partir de la duración del clip, las repeticiones, las pausas y el tiempo disponible.', ui,
32
+ seo: [
33
+ { type: 'title', text: 'Convierte un clip de shadowing en una sesión que puedas terminar', level: 2 },
34
+ { type: 'paragraph', html: 'El shadowing se abandona fácilmente cuando el bloque de práctica no tiene forma. Este planificador convierte un clip en un ensayo finito: las pasadas completas están numeradas, las pausas son visibles y el presupuesto restante se convierte en un momento deliberado para repetir o tomar notas. Puedes ajustar el plan antes de pulsar iniciar, en lugar de descubrir a mitad de camino que la sesión no cabe.' },
35
+ { type: 'title', text: 'Cómo funciona el cálculo del tiempo', level: 2 },
36
+ { type: 'paragraph', html: 'El cálculo trata cada pasada como una reproducción completa del clip. Suma la pausa solo entre pasadas, nunca después de la última. Por ejemplo, un clip de 30 segundos repetido cuatro veces con pausas de 10 segundos requiere 2 minutos y 10 segundos: 120 segundos hablando más 30 segundos de pausas. Si el presupuesto es menor que la siguiente pasada completa, esa pasada no aparece en la línea temporal.' },
37
+ { type: 'title', text: 'Cómo leer la línea de ensayo', level: 2 },
38
+ { type: 'table', headers: ['Marca', 'Significado', 'Acción útil'], rows: [['Bloques coral numerados', 'Pasadas completas que caben en el presupuesto.', 'Habla con el clip y usa el número como punto de parada.'], ['Bloques azules', 'La pausa entre dos pasadas completas.', 'Respira, recupera la atención y decide qué sonido escuchar después.'], ['Bloque dorado', 'Tiempo que queda tras encajar todas las pasadas solicitadas.', 'Haz una repetición, compara una grabación o toma una nota breve en lugar de añadir volumen automáticamente.']] },
39
+ { type: 'title', text: 'Haz que cada pasada sea más útil', level: 2 },
40
+ { type: 'paragraph', html: 'Elige un clip lo bastante corto para repetirlo sin perder al hablante. En las primeras pasadas prioriza seguir el ritmo; después escucha el acento, las reducciones, los enlaces o una consonante que puedas describir. Si el clip sigue siendo difícil, reduce la velocidad o escoge un fragmento más corto antes de añadir repeticiones.' },
41
+ { type: 'list', items: ['Elige un audio que puedas repetir sin buscar el segmento siguiente.', 'Indica la duración real del clip, incluido el final completo.', 'Usa las pausas para nombrar un rasgo de sonido en vez de recorrer explicaciones.', 'Usa el margen final para una comparación o una nota que cambie la próxima sesión.', 'Pide feedback de un profesor o compañero cuando la precisión sea importante para trabajar, estudiar o evaluar.'] },
42
+ { type: 'tip', title: 'Lo que el planificador no puede decirte', html: 'La línea temporal es aritmética, no una evaluación de pronunciación. No escucha tu voz, no juzga si tu imitación es precisa ni establece un nivel. La investigación sobre shadowing estudia alumnos, tareas y condiciones concretas, así que usa este horario como un contenedor práctico de práctica, no como una garantía de progreso.' },
43
+ ], faq, bibliography: [{ name: '日本語聴解学習におけるシャドーイングの効果', url: 'https://www.jstage.jst.go.jp/article/jlem/29/1/29_26/_article/-char/ja' }, { name: 'British Council: Teaching English pronunciation online: Practical tips and benefits of shadowing', url: 'https://americas.britishcouncil.org/new-ways-of-teaching/events/teaching-english-pronunciation-online' }], howTo,
44
+ schemas: [{ '@context': 'https://schema.org', ...appSchema } as unknown as Record<string, unknown>, { '@context': 'https://schema.org', ...howToSchema } as unknown as Record<string, unknown>, { '@context': 'https://schema.org', ...faqSchema } as unknown as Record<string, unknown>],
45
+ };
@@ -0,0 +1,45 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { ShadowingSessionUI } from '../ui';
4
+
5
+ const ui: ShadowingSessionUI = {
6
+ quickStarts: 'Démarrages rapides', quickShort: 'Boucle de 5 min', quickFocused: 'Focus de 12 min', quickLong: 'Intensif de 25 min',
7
+ totalMinutes: 'Budget de session', clipSeconds: 'Durée du clip', repetitions: 'Passages de shadowing', pauseSeconds: 'Pause entre les passages', minutesUnit: 'min', secondsUnit: 's', passesUnit: 'passages', resetLabel: 'Réinitialiser les valeurs', scheduledShadowing: 'Shadowing planifié', passesLabel: 'passages prévus', minutesScheduled: "temps d'entraînement", activeSpeaking: 'Temps de parole', pauseTime: 'Temps de pause', flexibleBuffer: 'Marge flexible',
8
+ timelineLabel: 'Chronologie de la session', shadowBlock: 'Passage de shadowing', pauseBlock: 'Pause', bufferBlock: 'Reprise ou notes', statusFits: 'Ajustement exact', statusShort: 'Budget trop court', statusBuffer: 'Marge disponible',
9
+ shortDetail: 'Seuls {planned} des {requested} passages demandés tiennent sous forme de clips complets. Raccourcissez le clip, réduisez les répétitions ou ajoutez du temps.', bufferDetail: 'Tous les passages demandés tiennent. Il vous reste {remaining} pour une reprise, une vérification de l\'enregistrement ou des notes.', fitsDetail: 'Chaque passage et chaque pause demandés tiennent dans le budget de la session.', budgetNote: 'Budget: {budget}', useBuffer: 'Utilisez le dernier bloc pour une reprise avec moins de soutien, un court enregistrement personnel ou une note sur le son à imiter.',
10
+ cueTitle: "Repères d'entraînement", cuePlay: 'Écoutez tout le clip avant de changer la cible.', cueSpeak: 'Suivez d\'abord le rythme, puis affinez un son.', cueNotice: 'Laissez une note qui modifiera votre prochain passage.', timerTitle: 'Lancer cette répétition', startTimer: 'Lancer le compte à rebours', pauseTimer: 'Mettre en pause', resumeTimer: 'Reprendre le compte à rebours', resetTimer: 'Réinitialiser le minuteur', timerSoundOn: 'Son activé', timerSoundOff: 'Son désactivé', timerIdle: 'Prêt', timerRunning: 'En cours', timerPaused: 'En pause', timerComplete: 'Terminé', timerCompleteDetail: 'Session terminée. Réinitialisez le minuteur pour recommencer.', timerStartHint: 'Lancez-le quand votre clip est prêt.', timerNoSchedule: 'Ajoutez assez de temps pour un passage complet afin de lancer le minuteur.', legendShadow: 'Passage de shadowing', legendPause: 'Pause', legendBuffer: 'Temps flexible', inputHelp: 'Un passage est une lecture complète pendant laquelle vous parlez en même temps. Les pauses ont lieu uniquement entre deux passages complets.', numberLocale: 'fr-FR',
11
+ };
12
+
13
+ const faq = [
14
+ { question: 'Que calcule ce planificateur de shadowing?', answer: 'Il transforme un budget de session, une durée de clip, un nombre de passages et une durée de pause en chronologie. Il ne compte que les passages complets afin d\'indiquer exactement combien tiennent et quelle marge reste.' },
15
+ { question: 'Qu\'est-ce qu\'un passage de shadowing?', answer: 'C\'est une lecture complète du clip pendant laquelle vous répétez la parole aussi fidèlement et immédiatement que possible. Le planificateur utilise la durée du clip saisie.' },
16
+ { question: 'Pourquoi le planificateur s\'arrête-t-il avant un passage partiel?', answer: 'Un passage partiel n\'est pas utile dans un plan d\'entraînement: il modifie le clip que vous vouliez répéter. L\'avertissement vous aide à ajuster le budget, la durée, les répétitions ou les pauses avant de commencer.' },
17
+ { question: 'Comment utiliser la marge flexible?', answer: 'Utilisez-la pour une reprise délibérée, un court enregistrement à comparer ou des notes sur le rythme, les liaisons, l\'accent ou un son à revoir. Davantage de répétitions ne donne pas automatiquement une meilleure prononciation.' },
18
+ { question: 'Le plan mesure-t-il ma prononciation ou garantit-il mes progrès?', answer: 'Non. Il organise uniquement le temps. Il n\'écoute pas votre voix, ne juge pas la précision, n\'estime pas votre niveau et ne garantit pas de progrès. Choisissez un clip que vous comprenez assez bien et demandez un retour quand la précision compte.' },
19
+ ];
20
+ const howTo = [
21
+ { name: 'Définir le budget', text: 'Saisissez le nombre total de minutes que vous pouvez réserver à cette session.' },
22
+ { name: 'Saisir la durée du clip', text: 'Utilisez la durée d\'un clip audio ou vidéo complet.' },
23
+ { name: 'Choisir passages et pauses', text: 'Définissez le nombre de passages complets et la pause nécessaire entre eux.' },
24
+ { name: 'Suivre la chronologie', text: 'Effectuez les passages numérotés, prenez les pauses indiquées et utilisez le bloc flexible final pour reprendre, comparer ou noter.' },
25
+ ];
26
+ const appSchema: SoftwareApplication = { '@type': 'SoftwareApplication', name: 'Planificateur de sessions de shadowing linguistique', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', isAccessibleForFree: true, url: 'https://gamebob.dev/fr/planificateur-session-shadowing-langue' };
27
+ const howToSchema: HowTo = { '@type': 'HowTo', name: 'Planifier une session de shadowing linguistique', step: howTo.map((step) => ({ '@type': 'HowToStep', name: step.name, text: step.text })) };
28
+ const faqSchema: FAQPage = { '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
29
+
30
+ export const content: ToolLocaleContent<ShadowingSessionUI> = {
31
+ slug: 'planificateur-session-shadowing-langue', title: 'Planificateur de sessions de shadowing linguistique', description: 'Construisez une session de shadowing chronométrée selon la durée du clip, les répétitions, les pauses et le temps disponible.', ui,
32
+ seo: [
33
+ { type: 'title', text: 'Transformez un clip de shadowing en session réalisable', level: 2 },
34
+ { type: 'paragraph', html: 'Le shadowing est facile à abandonner quand le temps de pratique n\'a pas de forme. Ce planificateur transforme un clip en répétition finie: les passages complets sont numérotés, les pauses sont visibles et le budget restant devient un temps volontaire pour reprendre ou prendre des notes. Vous pouvez ajuster le plan avant de lancer le compte à rebours au lieu de découvrir à mi-parcours que la session ne tient pas.' },
35
+ { type: 'title', text: 'Comment le calcul du temps fonctionne', level: 2 },
36
+ { type: 'paragraph', html: 'Le calcul considère chaque passage comme une lecture complète du clip. La pause est ajoutée seulement entre les passages, jamais après le dernier. Un clip de 30 secondes répété quatre fois avec des pauses de 10 secondes prend par exemple 2 minutes et 10 secondes: 120 secondes de parole et 30 secondes de pauses. Si le budget est inférieur au prochain passage complet, celui-ci n\'est pas placé sur la chronologie.' },
37
+ { type: 'title', text: 'Lire la ligne de répétition', level: 2 },
38
+ { type: 'table', headers: ['Repère', 'Signification', 'Action utile'], rows: [['Blocs corail numérotés', 'Passages complets qui tiennent dans le budget.', 'Parlez avec le clip et utilisez le numéro comme point d\'arrêt.'], ['Blocs bleus', 'Pause entre deux passages complets.', 'Respirez, recentrez votre attention et choisissez le son à écouter ensuite.'], ['Bloc doré', 'Temps restant après les passages demandés.', 'Faites une reprise, comparez un enregistrement ou écrivez une note courte plutôt que d\'ajouter automatiquement du volume.']] },
39
+ { type: 'title', text: 'Rendre chaque passage plus utile', level: 2 },
40
+ { type: 'paragraph', html: 'Choisissez un clip assez court pour le répéter sans perdre la voix du locuteur. Au début, privilégiez le rythme; ensuite, écoutez l\'accent, les réductions, les liaisons ou une consonne que vous pouvez décrire. Si le clip reste trop difficile, ralentissez-le ou choisissez un extrait plus court avant d\'ajouter des répétitions.' },
41
+ { type: 'list', items: ['Choisissez un audio que vous pouvez relancer sans chercher le segment suivant.', 'Indiquez la durée réelle du clip, y compris la fin complète.', 'Utilisez les pauses pour nommer un trait sonore plutôt que parcourir des explications.', 'Gardez la marge finale pour une comparaison ou une note qui changera la prochaine session.', 'Demandez un retour à un enseignant ou à un partenaire quand la précision est importante.'] },
42
+ { type: 'tip', title: 'Ce que le planificateur ne peut pas dire', html: 'La chronologie est une arithmétique, pas une évaluation de prononciation. Elle n\'entend pas votre voix, ne juge pas votre imitation et n\'établit pas de niveau. Les recherches sur le shadowing portent sur des apprenants, des tâches et des conditions précises. Utilisez donc ce programme comme un cadre pratique, pas comme la preuve d\'un progrès garanti.' },
43
+ ], faq, bibliography: [{ name: '日本語聴解学習におけるシャドーイングの効果', url: 'https://www.jstage.jst.go.jp/article/jlem/29/1/29_26/_article/-char/ja' }, { name: 'British Council: Teaching English pronunciation online: Practical tips and benefits of shadowing', url: 'https://americas.britishcouncil.org/new-ways-of-teaching/events/teaching-english-pronunciation-online' }], howTo,
44
+ schemas: [{ '@context': 'https://schema.org', ...appSchema } as unknown as Record<string, unknown>, { '@context': 'https://schema.org', ...howToSchema } as unknown as Record<string, unknown>, { '@context': 'https://schema.org', ...faqSchema } as unknown as Record<string, unknown>],
45
+ };
@@ -0,0 +1,40 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { ShadowingSessionUI } from '../ui';
4
+
5
+ const ui: ShadowingSessionUI = {
6
+ quickStarts: 'Mulai cepat', quickShort: 'Putaran 5 mnt', quickFocused: 'Fokus 12 mnt', quickLong: 'Mendalam 25 mnt', totalMinutes: 'Anggaran sesi', clipSeconds: 'Durasi klip', repetitions: 'Putaran shadowing', pauseSeconds: 'Jeda antar putaran', minutesUnit: 'mnt', secondsUnit: 'dtk', passesUnit: 'putaran', resetLabel: 'Atur ulang nilai awal', scheduledShadowing: 'Shadowing terjadwal', passesLabel: 'putaran direncanakan', minutesScheduled: 'waktu latihan', activeSpeaking: 'Waktu berbicara', pauseTime: 'Waktu jeda', flexibleBuffer: 'Sisa waktu fleksibel', timelineLabel: 'Linimasa sesi', shadowBlock: 'Putaran shadowing', pauseBlock: 'Jeda', bufferBlock: 'Ulangi atau catat', statusFits: 'Pas tepat', statusShort: 'Anggaran kurang', statusBuffer: 'Ada ruang', shortDetail: 'Hanya {planned} dari {requested} putaran yang diminta yang muat sebagai klip lengkap. Pendekkan klip, kurangi pengulangan, atau tambah waktu.', bufferDetail: 'Semua putaran yang diminta muat. Anda memiliki sisa {remaining} untuk mengulang, memeriksa rekaman, atau membuat catatan.', fitsDetail: 'Semua putaran dan jeda yang diminta berada dalam anggaran sesi.', budgetNote: 'Anggaran: {budget}', useBuffer: 'Gunakan blok terakhir untuk mengulang dengan lebih sedikit bantuan, merekam diri secara singkat, atau mencatat bunyi yang ingin Anda tiru.', cueTitle: 'Petunjuk latihan', cuePlay: 'Putar seluruh klip sebelum mengganti target.', cueSpeak: 'Ikuti ritmenya dahulu, lalu pertajam satu bunyi.', cueNotice: 'Tulis satu catatan yang mengubah putaran berikutnya.', timerTitle: 'Jalankan latihan ini', startTimer: 'Mulai hitung mundur', pauseTimer: 'Jeda hitung mundur', resumeTimer: 'Lanjutkan hitung mundur', resetTimer: 'Atur ulang timer', timerSoundOn: 'Suara aktif', timerSoundOff: 'Suara nonaktif', timerIdle: 'Siap', timerRunning: 'Berjalan', timerPaused: 'Dijeda', timerComplete: 'Selesai', timerCompleteDetail: 'Sesi selesai. Atur ulang timer untuk menjalankannya lagi.', timerStartHint: 'Tekan mulai saat klip siap.', timerNoSchedule: 'Tambahkan waktu yang cukup untuk satu putaran lengkap agar timer dapat dimulai.', legendShadow: 'Putaran shadowing', legendPause: 'Jeda', legendBuffer: 'Waktu fleksibel', inputHelp: 'Satu putaran adalah pemutaran penuh sambil Anda berbicara mengikuti audio. Jeda hanya terjadi di antara putaran lengkap.', numberLocale: 'id-ID',
7
+ };
8
+ const faq = [
9
+ { question: 'Apa yang dihitung oleh perencana shadowing ini?', answer: 'Perencana ini mengubah anggaran sesi, durasi klip, jumlah putaran, dan durasi jeda menjadi linimasa. Hanya putaran lengkap yang dihitung, sehingga Anda dapat melihat jumlah yang muat dan sisa waktu fleksibel.' },
10
+ { question: 'Apa itu satu putaran shadowing?', answer: 'Satu putaran adalah pemutaran klip secara penuh sambil Anda mengulangi ucapan sedekat dan secepat mungkin. Perencana menggunakan durasi klip yang Anda masukkan.' },
11
+ { question: 'Mengapa perencana berhenti sebelum putaran yang tidak lengkap?', answer: 'Putaran parsial tidak berguna untuk rencana latihan karena mengubah klip yang ingin Anda ulangi. Peringatan ini membantu Anda mengubah anggaran, durasi klip, pengulangan, atau jeda sebelum mulai.' },
12
+ { question: 'Bagaimana cara menggunakan sisa waktu fleksibel?', answer: 'Gunakan untuk satu pengulangan yang disengaja, rekaman singkat untuk dibandingkan, atau catatan tentang ritme, penghubungan, tekanan kata, atau bunyi yang ingin ditinjau. Pengulangan lebih banyak tidak otomatis menghasilkan pelafalan yang lebih baik.' },
13
+ { question: 'Apakah ini mengukur pelafalan atau menjamin kemajuan?', answer: 'Tidak. Alat ini hanya mengatur waktu. Alat ini tidak mendengar suara, menilai ketepatan, memperkirakan tingkat kemampuan, atau menjamin kemajuan. Pilih klip yang cukup Anda pahami dan gunakan masukan saat ketepatan penting.' },
14
+ ];
15
+ const howTo = [
16
+ { name: 'Atur anggaran sesi', text: 'Masukkan total menit yang dapat Anda sediakan untuk latihan ini.' },
17
+ { name: 'Masukkan durasi klip', text: 'Gunakan durasi satu klip audio atau video lengkap.' },
18
+ { name: 'Pilih putaran dan jeda', text: 'Tentukan jumlah putaran shadowing lengkap dan jeda yang diperlukan di antaranya.' },
19
+ { name: 'Ikuti linimasa', text: 'Selesaikan putaran bernomor, lakukan jeda yang ditandai, lalu gunakan blok fleksibel untuk mengulang, membandingkan, atau mencatat.' },
20
+ ];
21
+ const appSchema: SoftwareApplication = { '@type': 'SoftwareApplication', name: 'Perencana Sesi Language Shadowing', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', isAccessibleForFree: true, url: 'https://gamebob.dev/id/perencana-sesi-shadowing-bahasa' };
22
+ const howToSchema: HowTo = { '@type': 'HowTo', name: 'Merencanakan sesi shadowing bahasa', step: howTo.map((step) => ({ '@type': 'HowToStep', name: step.name, text: step.text })) };
23
+ const faqSchema: FAQPage = { '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
24
+
25
+ export const content: ToolLocaleContent<ShadowingSessionUI> = {
26
+ slug: 'perencana-sesi-shadowing-bahasa', title: 'Perencana Sesi Language Shadowing', description: 'Susun sesi latihan shadowing dengan waktu terukur berdasarkan durasi klip, pengulangan, jeda, dan waktu yang tersedia.', ui,
27
+ seo: [
28
+ { type: 'title', text: 'Ubah klip shadowing menjadi sesi yang dapat diselesaikan', level: 2 },
29
+ { type: 'paragraph', html: 'Shadowing mudah ditinggalkan ketika blok latihan tidak memiliki bentuk. Perencana ini mengubah satu klip menjadi latihan terbatas: putaran lengkap diberi nomor, jeda terlihat, dan anggaran yang tersisa menjadi waktu khusus untuk mengulang atau mencatat. Anda dapat menyesuaikan rencana sebelum menekan mulai, bukan baru menyadari di tengah sesi bahwa waktunya tidak cukup.' },
30
+ { type: 'title', text: 'Cara kerja perhitungan waktu', level: 2 },
31
+ { type: 'paragraph', html: 'Perhitungan menganggap setiap putaran sebagai satu pemutaran klip lengkap. Jeda hanya ditambahkan di antara putaran, tidak setelah putaran terakhir. Contohnya, klip 30 detik yang diulang empat kali dengan jeda 10 detik membutuhkan 2 menit 10 detik: 120 detik berbicara ditambah 30 detik jeda. Jika anggaran lebih pendek daripada putaran lengkap berikutnya, putaran itu tidak dimasukkan ke linimasa.' },
32
+ { type: 'title', text: 'Membaca jalur latihan', level: 2 },
33
+ { type: 'table', headers: ['Tanda', 'Arti', 'Tindakan berguna'], rows: [['Blok koral bernomor', 'Putaran shadowing lengkap yang muat dalam anggaran.', 'Berbicaralah mengikuti klip dan gunakan nomor sebagai titik berhenti.'], ['Blok biru', 'Jeda di antara dua putaran lengkap.', 'Tarik napas, kembalikan perhatian, dan pilih bunyi yang akan didengarkan berikutnya.'], ['Blok emas', 'Waktu yang tersisa setelah semua putaran yang diminta muat.', 'Gunakan untuk mengulang, membandingkan rekaman, atau membuat catatan singkat.']] },
34
+ { type: 'title', text: 'Membuat setiap putaran lebih berguna', level: 2 },
35
+ { type: 'paragraph', html: 'Pilih klip yang cukup singkat untuk diulang tanpa kehilangan suara pembicara. Pada putaran awal, utamakan ritme; pada putaran berikutnya, dengarkan tekanan, pengurangan bunyi, penghubungan, atau satu konsonan yang dapat Anda jelaskan. Jika klip masih terlalu sulit, perlambat atau pilih cuplikan yang lebih pendek sebelum menambah pengulangan.' },
36
+ { type: 'list', items: ['Pilih audio yang dapat Anda putar ulang tanpa mencari segmen berikutnya.', 'Gunakan durasi klip yang sebenarnya, termasuk bagian akhir yang lengkap.', 'Gunakan jeda untuk menyebutkan satu ciri bunyi, bukan membaca banyak penjelasan.', 'Gunakan sisa waktu untuk perbandingan atau catatan yang mengubah sesi berikutnya.', 'Mintalah umpan balik guru atau teman ketika ketepatan penting untuk kerja atau belajar.'] },
37
+ { type: 'tip', title: 'Hal yang tidak dapat diberitahukan perencana', html: 'Linimasa ini adalah perhitungan waktu, bukan penilaian pelafalan. Alat ini tidak mendengar suara Anda, menilai tiruan Anda, atau menetapkan tingkat kemampuan. Riset tentang shadowing melibatkan pelajar, tugas, dan kondisi tertentu, jadi gunakan jadwal ini sebagai wadah latihan praktis, bukan bukti kemajuan yang dijamin.' },
38
+ ], faq, bibliography: [{ name: '日本語聴解学習におけるシャドーイングの効果', url: 'https://www.jstage.jst.go.jp/article/jlem/29/1/29_26/_article/-char/ja' }, { name: 'British Council: Teaching English pronunciation online: Practical tips and benefits of shadowing', url: 'https://americas.britishcouncil.org/new-ways-of-teaching/events/teaching-english-pronunciation-online' }], howTo,
39
+ schemas: [{ '@context': 'https://schema.org', ...appSchema } as unknown as Record<string, unknown>, { '@context': 'https://schema.org', ...howToSchema } as unknown as Record<string, unknown>, { '@context': 'https://schema.org', ...faqSchema } as unknown as Record<string, unknown>],
40
+ };
@@ -0,0 +1,40 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { ShadowingSessionUI } from '../ui';
4
+
5
+ const ui: ShadowingSessionUI = {
6
+ quickStarts: 'Avvii rapidi', quickShort: 'Ciclo da 5 min', quickFocused: 'Focus da 12 min', quickLong: 'Intenso da 25 min', totalMinutes: 'Budget della sessione', clipSeconds: 'Durata della clip', repetitions: 'Passaggi di shadowing', pauseSeconds: 'Pausa tra i passaggi', minutesUnit: 'min', secondsUnit: 's', passesUnit: 'passaggi', resetLabel: 'Ripristina valori', scheduledShadowing: 'Shadowing programmato', passesLabel: 'passaggi previsti', minutesScheduled: 'tempo di pratica', activeSpeaking: 'Tempo di parola', pauseTime: 'Tempo di pausa', flexibleBuffer: 'Margine flessibile', timelineLabel: 'Cronologia della sessione', shadowBlock: 'Passaggio di shadowing', pauseBlock: 'Pausa', bufferBlock: 'Ripetizione o note', statusFits: 'Adattamento esatto', statusShort: 'Budget insufficiente', statusBuffer: 'Spazio disponibile', shortDetail: 'Entrano solo {planned} dei {requested} passaggi richiesti come clip complete. Accorcia la clip, riduci le ripetizioni o aggiungi tempo.', bufferDetail: 'Entrano tutti i passaggi richiesti. Restano {remaining} per una ripetizione, un controllo della registrazione o alcune note.', fitsDetail: 'Ogni passaggio e ogni pausa richiesti rientrano nel budget della sessione.', budgetNote: 'Budget: {budget}', useBuffer: 'Usa il blocco finale per una ripetizione con meno supporto, una breve registrazione personale o una nota sul suono da imitare.', cueTitle: 'Indicazioni per la prova', cuePlay: 'Riproduci tutta la clip prima di cambiare obiettivo.', cueSpeak: 'Segui prima il ritmo, poi perfeziona un suono.', cueNotice: 'Lascia una nota che cambi il prossimo passaggio.', timerTitle: 'Esegui questa prova', startTimer: 'Avvia conto alla rovescia', pauseTimer: 'Metti in pausa', resumeTimer: 'Riprendi conto alla rovescia', resetTimer: 'Azzera timer', timerSoundOn: 'Audio attivo', timerSoundOff: 'Audio disattivato', timerIdle: 'Pronto', timerRunning: 'In corso', timerPaused: 'In pausa', timerComplete: 'Completato', timerCompleteDetail: 'Sessione completata. Azzera il timer per eseguirla di nuovo.', timerStartHint: 'Premi avvia quando la clip è pronta.', timerNoSchedule: 'Aggiungi tempo sufficiente per un passaggio completo per avviare il timer.', legendShadow: 'Passaggio di shadowing', legendPause: 'Pausa', legendBuffer: 'Tempo flessibile', inputHelp: "Un passaggio è una riproduzione completa mentre parli insieme all'audio. Le pause avvengono solo tra passaggi completi.", numberLocale: 'it-IT',
7
+ };
8
+ const faq = [
9
+ { question: 'Che cosa calcola questo pianificatore di shadowing?', answer: 'Trasforma il budget della sessione, la durata della clip, il numero di passaggi e la durata delle pause in una cronologia. Conta solo i passaggi completi, così mostra quanti entrano e quanto tempo flessibile rimane.' },
10
+ { question: 'Che cos\'è un passaggio di shadowing?', answer: 'È una riproduzione completa della clip mentre ripeti il parlato nel modo più preciso e immediato possibile. Il pianificatore usa la durata inserita per la clip.' },
11
+ { question: 'Perché il pianificatore si ferma prima di un passaggio parziale?', answer: 'Un passaggio parziale è poco utile in un piano perché cambia la clip che volevi ripetere. L\'avviso ti aiuta a modificare budget, durata, ripetizioni o pause prima di iniziare.' },
12
+ { question: 'Come posso usare il margine flessibile?', answer: 'Usalo per una ripetizione intenzionale, una breve registrazione da confrontare o note su ritmo, legamenti, accento o un suono da rivedere. Più ripetizioni non producono automaticamente una pronuncia migliore.' },
13
+ { question: 'Misura la mia pronuncia o garantisce un miglioramento?', answer: 'No. Organizza solo il tempo. Non ascolta la tua voce, non giudica la precisione, non stima il livello e non garantisce progressi. Scegli una clip abbastanza comprensibile e cerca un feedback quando la precisione conta.' },
14
+ ];
15
+ const howTo = [
16
+ { name: 'Imposta il budget', text: 'Inserisci i minuti totali che puoi dedicare a questa sessione di pratica.' },
17
+ { name: 'Inserisci la durata della clip', text: 'Usa la durata di una clip audio o video completa.' },
18
+ { name: 'Scegli passaggi e pause', text: 'Imposta il numero di passaggi completi e la pausa necessaria tra loro.' },
19
+ { name: 'Segui la cronologia', text: 'Completa i passaggi numerati, rispetta le pause segnate e usa il blocco flessibile finale per ripetere, confrontare o prendere note.' },
20
+ ];
21
+ const appSchema: SoftwareApplication = { '@type': 'SoftwareApplication', name: 'Pianificatore di sessioni di shadowing linguistico', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', isAccessibleForFree: true, url: 'https://gamebob.dev/it/pianificatore-sessione-shadowing-linguistico' };
22
+ const howToSchema: HowTo = { '@type': 'HowTo', name: 'Pianificare una sessione di shadowing linguistico', step: howTo.map((step) => ({ '@type': 'HowToStep', name: step.name, text: step.text })) };
23
+ const faqSchema: FAQPage = { '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
24
+
25
+ export const content: ToolLocaleContent<ShadowingSessionUI> = {
26
+ slug: 'pianificatore-sessione-shadowing-linguistico', title: 'Pianificatore di sessioni di shadowing linguistico', description: 'Crea una sessione di pratica di shadowing a tempo usando durata della clip, ripetizioni, pause e tempo disponibile.', ui,
27
+ seo: [
28
+ { type: 'title', text: 'Trasforma una clip di shadowing in una sessione completabile', level: 2 },
29
+ { type: 'paragraph', html: 'Lo shadowing viene abbandonato facilmente quando il blocco di pratica non ha una forma. Questo pianificatore trasforma una clip in una prova finita: i passaggi completi sono numerati, le pause sono visibili e il budget rimasto diventa uno spazio intenzionale per ripetere o prendere note. Puoi modificare il piano prima di avviare il conto alla rovescia invece di scoprire a metà che la sessione non entra nel tempo disponibile.' },
30
+ { type: 'title', text: 'Come funziona il calcolo del tempo', level: 2 },
31
+ { type: 'paragraph', html: 'Il calcolo considera ogni passaggio come una riproduzione completa della clip. Aggiunge la pausa solo tra i passaggi, mai dopo l\'ultimo. Una clip di 30 secondi ripetuta quattro volte con pause di 10 secondi richiede per esempio 2 minuti e 10 secondi: 120 secondi di parola più 30 secondi di pause. Se il budget è inferiore al prossimo passaggio completo, quel passaggio non viene inserito nella cronologia.' },
32
+ { type: 'title', text: 'Leggere la linea della prova', level: 2 },
33
+ { type: 'table', headers: ['Segno', 'Significato', 'Azione utile'], rows: [['Blocchi corallo numerati', 'Passaggi completi che entrano nel budget.', 'Parla insieme alla clip e usa il numero come punto di fine.'], ['Blocchi blu', 'La pausa tra due passaggi completi.', 'Respira, riporta l\'attenzione e scegli il suono da ascoltare dopo.'], ['Blocco dorato', 'Tempo rimasto dopo i passaggi richiesti.', 'Usa una ripetizione, confronta una registrazione o scrivi una nota breve invece di aggiungere volume automaticamente.']] },
34
+ { type: 'title', text: 'Rendere utile ogni passaggio', level: 2 },
35
+ { type: 'paragraph', html: 'Scegli una clip abbastanza breve da poter ripetere senza perdere la voce. Nei primi passaggi dai priorità al ritmo; in quelli successivi ascolta accento, riduzioni, legamenti o una consonante che puoi descrivere. Se la clip è ancora troppo difficile, rallentala o scegli un estratto più breve prima di aggiungere ripetizioni.' },
36
+ { type: 'list', items: ['Scegli un audio che puoi riprodurre senza cercare il segmento successivo.', 'Inserisci la durata reale della clip, inclusa la fine completa.', 'Usa le pause per nominare un tratto sonoro invece di scorrere spiegazioni.', 'Usa il margine finale per un confronto o una nota che cambi la prossima sessione.', 'Chiedi il feedback di un insegnante o compagno quando la precisione è importante.'] },
37
+ { type: 'tip', title: 'Che cosa il pianificatore non può dire', html: "La cronologia è aritmetica, non una valutazione della pronuncia. Non ascolta la tua voce, non giudica l'imitazione e non stabilisce un livello. Le ricerche sullo shadowing riguardano studenti, compiti e condizioni specifiche: usa quindi questo programma come contenitore pratico della pratica, non come prova di un progresso garantito." },
38
+ ], faq, bibliography: [{ name: '日本語聴解学習におけるシャドーイングの効果', url: 'https://www.jstage.jst.go.jp/article/jlem/29/1/29_26/_article/-char/ja' }, { name: 'British Council: Teaching English pronunciation online: Practical tips and benefits of shadowing', url: 'https://americas.britishcouncil.org/new-ways-of-teaching/events/teaching-english-pronunciation-online' }], howTo,
39
+ schemas: [{ '@context': 'https://schema.org', ...appSchema } as unknown as Record<string, unknown>, { '@context': 'https://schema.org', ...howToSchema } as unknown as Record<string, unknown>, { '@context': 'https://schema.org', ...faqSchema } as unknown as Record<string, unknown>],
40
+ };
@@ -0,0 +1,40 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { ShadowingSessionUI } from '../ui';
4
+
5
+ const ui: ShadowingSessionUI = {
6
+ quickStarts: 'クイックスタート', quickShort: '5分ループ', quickFocused: '12分集中', quickLong: '25分じっくり', totalMinutes: 'セッション時間', clipSeconds: 'クリップの長さ', repetitions: 'シャドーイング回数', pauseSeconds: '各回の間の休憩', minutesUnit: '分', secondsUnit: '秒', passesUnit: '回', resetLabel: '初期値に戻す', scheduledShadowing: 'シャドーイング計画', passesLabel: '予定回数', minutesScheduled: '練習時間', activeSpeaking: '発話時間', pauseTime: '休憩時間', flexibleBuffer: '余白時間', timelineLabel: 'セッションの流れ', shadowBlock: 'シャドーイング', pauseBlock: '休憩', bufferBlock: '復習またはメモ', statusFits: 'ぴったり', statusShort: '時間不足', statusBuffer: '余裕あり', shortDetail: '希望した{requested}回のうち、完全なクリップとして入るのは{planned}回です。クリップを短くするか、回数を減らすか、時間を増やしてください。', bufferDetail: '希望した回数がすべて入ります。復習、録音の確認、メモに{remaining}使えます。', fitsDetail: '希望したすべての練習と休憩がセッション時間に収まります。', budgetNote: '時間: {budget}', useBuffer: '最後のブロックは、補助を減らした復習、短い録音、または真似したい音のメモに使えます。', cueTitle: '練習のポイント', cuePlay: '目標を変える前にクリップ全体を再生します。', cueSpeak: 'まずリズムを保ち、その後で一つの音を磨きます。', cueNotice: '次の練習を変えるメモを一つ残します。', timerTitle: 'この練習を実行', startTimer: 'カウントダウン開始', pauseTimer: '一時停止', resumeTimer: '再開', resetTimer: 'タイマーをリセット', timerSoundOn: '音あり', timerSoundOff: '音なし', timerIdle: '準備完了', timerRunning: '進行中', timerPaused: '一時停止中', timerComplete: '完了', timerCompleteDetail: 'セッションが完了しました。もう一度行うにはタイマーをリセットしてください。', timerStartHint: 'クリップの準備ができたら開始します。', timerNoSchedule: 'タイマーを始めるには、完全な1回分の時間を追加してください。', legendShadow: 'シャドーイング', legendPause: '休憩', legendBuffer: '余白時間', inputHelp: '1回分は、音声に合わせて話しながらクリップを最初から最後まで再生することです。休憩は完全な練習の間だけに入ります。', numberLocale: 'ja-JP',
7
+ };
8
+ const faq = [
9
+ { question: 'このシャドーイング計画ツールは何を計算しますか?', answer: 'セッション時間、クリップの長さ、練習回数、休憩時間から流れを作ります。完全な練習だけを数えるため、何回できるかと残り時間が正確に分かります。' },
10
+ { question: 'シャドーイング1回分とは何ですか?', answer: 'クリップを最初から最後まで再生し、話者の発話をできるだけ近く、すぐに繰り返すことです。計画では入力したクリップの長さを使います。' },
11
+ { question: 'なぜ途中までの練習を入れないのですか?', answer: '途中まででは、繰り返したいクリップ全体を練習できません。開始前に時間、長さ、回数、休憩を調整できるようにしています。' },
12
+ { question: '余白時間はどう使えばよいですか?', answer: '意図的な復習、短い録音との比較、リズムやアクセントなどのメモに使います。回数を増やすだけで発音が自動的に良くなるわけではありません。' },
13
+ { question: '発音を測定したり、上達を保証したりしますか?', answer: 'いいえ。時間を整理するだけです。声を聞いたり、正確さやレベルを判定したり、上達を保証したりはしません。正確さが必要なときはフィードバックを利用してください。' },
14
+ ];
15
+ const howTo = [
16
+ { name: 'セッション時間を設定', text: '練習に使える合計分数を入力します。' },
17
+ { name: 'クリップの長さを入力', text: '音声または動画を最後まで再生した長さを使います。' },
18
+ { name: '回数と休憩を選択', text: '完全な練習回数と、各回の間に必要な休憩を設定します。' },
19
+ { name: '流れに沿って練習', text: '番号の順に練習し、表示された休憩を取り、最後の余白を復習やメモに使います。' },
20
+ ];
21
+ const appSchema: SoftwareApplication = { '@type': 'SoftwareApplication', name: '言語シャドーイングセッション計画ツール', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', isAccessibleForFree: true, url: 'https://gamebob.dev/ja/language-shadowing-session-planner' };
22
+ const howToSchema: HowTo = { '@type': 'HowTo', name: '言語シャドーイングのセッションを計画する', step: howTo.map((step) => ({ '@type': 'HowToStep', name: step.name, text: step.text })) };
23
+ const faqSchema: FAQPage = { '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
24
+
25
+ export const content: ToolLocaleContent<ShadowingSessionUI> = {
26
+ slug: 'language-shadowing-session-planner', title: '言語シャドーイングセッション計画ツール', description: 'クリップの長さ、練習回数、休憩、使える時間から、時間付きのシャドーイング練習を作成します。', ui,
27
+ seo: [
28
+ { type: 'title', text: 'シャドーイングのクリップを終えられる練習に変える', level: 2 },
29
+ { type: 'paragraph', html: '練習時間の形が決まっていないと、シャドーイングは続けにくくなります。このツールは一つのクリップを有限の練習に変えます。完全な練習には番号が付き、休憩が見え、残り時間は復習やメモのための意識的な時間になります。開始してから時間不足に気づくのではなく、先に計画を調整できます。' },
30
+ { type: 'title', text: '時間の計算方法', level: 2 },
31
+ { type: 'paragraph', html: '各回はクリップ全体の長さとして計算します。休憩は回と回の間だけに加え、最後の回の後には加えません。30秒のクリップを4回、各回10秒の休憩で行う場合、発話120秒と休憩30秒で合計2分10秒です。次の完全な1回分が時間に入らない場合、その回は流れに置かれません。' },
32
+ { type: 'title', text: '練習ラインの見方', level: 2 },
33
+ { type: 'table', headers: ['表示', '意味', '使い方'], rows: [['番号付きのコーラル', '時間内に入る完全な練習。', 'クリップに合わせて話し、番号を終了地点にします。'], ['青いブロック', '完全な練習の間の休憩。', '呼吸を整え、次に聞く音を決めます。'], ['金色のブロック', '希望した練習の後に残る時間。', '復習、録音の比較、短いメモに使います。']] },
34
+ { type: 'title', text: '1回の練習を役立てる', level: 2 },
35
+ { type: 'paragraph', html: '話者を見失わずに繰り返せる短さのクリップを選びます。最初はリズムを保つことを優先し、後の回ではアクセント、音の弱化、音の連結、説明できる子音に注目します。まだ難しければ、回数を増やす前に速度を下げるか、短い部分を選びます。' },
36
+ { type: 'list', items: ['次の部分を探さずに繰り返せる音声を選ぶ。', '最後まで含めたクリップの実際の長さを入力する。', '休憩では説明を読む代わりに、一つの音の特徴を言葉にする。', '最後の余白を、次の練習を変える比較やメモに使う。', '仕事や学習で正確さが必要なら、先生や仲間のフィードバックを受ける。'] },
37
+ { type: 'tip', title: 'このツールで分からないこと', html: 'この流れは時間の計算であり、発音評価ではありません。声を聞いたり、模倣の正確さやレベルを判定したりしません。シャドーイングの研究には特定の学習者、課題、条件があります。この計画は練習の枠として使い、上達の保証とは考えないでください。' },
38
+ ], faq, bibliography: [{ name: '日本語聴解学習におけるシャドーイングの効果', url: 'https://www.jstage.jst.go.jp/article/jlem/29/1/29_26/_article/-char/ja' }, { name: 'British Council: Teaching English pronunciation online: Practical tips and benefits of shadowing', url: 'https://americas.britishcouncil.org/new-ways-of-teaching/events/teaching-english-pronunciation-online' }], howTo,
39
+ schemas: [{ '@context': 'https://schema.org', ...appSchema } as unknown as Record<string, unknown>, { '@context': 'https://schema.org', ...howToSchema } as unknown as Record<string, unknown>, { '@context': 'https://schema.org', ...faqSchema } as unknown as Record<string, unknown>],
40
+ };
@@ -0,0 +1,40 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { ShadowingSessionUI } from '../ui';
4
+
5
+ const ui: ShadowingSessionUI = {
6
+ quickStarts: '빠른 시작', quickShort: '5분 반복', quickFocused: '12분 집중', quickLong: '25분 심화', totalMinutes: '세션 시간', clipSeconds: '클립 길이', repetitions: '섀도잉 반복', pauseSeconds: '반복 사이 휴식', minutesUnit: '분', secondsUnit: '초', passesUnit: '회', resetLabel: '기본값으로 재설정', scheduledShadowing: '섀도잉 계획', passesLabel: '예정된 반복', minutesScheduled: '연습 시간', activeSpeaking: '말하기 시간', pauseTime: '휴식 시간', flexibleBuffer: '남은 여유 시간', timelineLabel: '세션 타임라인', shadowBlock: '섀도잉 반복', pauseBlock: '휴식', bufferBlock: '다시 듣기 또는 메모', statusFits: '정확히 맞음', statusShort: '시간 부족', statusBuffer: '여유 있음', shortDetail: '요청한 {requested}회 중 완전한 클립으로 가능한 반복은 {planned}회입니다. 클립을 줄이거나 반복 횟수를 낮추거나 시간을 늘리세요.', bufferDetail: '요청한 반복이 모두 들어갑니다. 다시 듣기, 녹음 확인 또는 메모에 {remaining}을 사용할 수 있습니다.', fitsDetail: '요청한 모든 반복과 휴식이 세션 시간 안에 들어갑니다.', budgetNote: '시간: {budget}', useBuffer: '마지막 블록을 덜 의존하는 다시 듣기, 짧은 자기 녹음 또는 따라 하고 싶은 소리에 대한 메모로 사용하세요.', cueTitle: '연습 포인트', cuePlay: '목표를 바꾸기 전에 클립 전체를 재생하세요.', cueSpeak: '먼저 리듬을 따라가고, 그다음 한 소리를 다듬으세요.', cueNotice: '다음 반복을 바꾸는 메모를 하나 남기세요.', timerTitle: '이 연습 실행', startTimer: '카운트다운 시작', pauseTimer: '카운트다운 일시정지', resumeTimer: '카운트다운 재개', resetTimer: '타이머 재설정', timerSoundOn: '소리 켜짐', timerSoundOff: '소리 꺼짐', timerIdle: '준비됨', timerRunning: '진행 중', timerPaused: '일시정지', timerComplete: '완료', timerCompleteDetail: '세션이 끝났습니다. 다시 실행하려면 타이머를 재설정하세요.', timerStartHint: '클립이 준비되면 시작을 누르세요.', timerNoSchedule: '타이머를 시작하려면 완전한 한 번의 반복에 필요한 시간을 추가하세요.', legendShadow: '섀도잉 반복', legendPause: '휴식', legendBuffer: '여유 시간', inputHelp: '한 번의 반복은 클립을 처음부터 끝까지 재생하며 동시에 따라 말하는 것입니다. 휴식은 완전한 반복 사이에만 들어갑니다.', numberLocale: 'ko-KR',
7
+ };
8
+ const faq = [
9
+ { question: '이 섀도잉 플래너는 무엇을 계산하나요?', answer: '세션 시간, 클립 길이, 섀도잉 반복 횟수와 휴식 시간을 타임라인으로 바꿉니다. 완전한 반복만 계산하므로 몇 회가 가능한지와 남은 시간을 정확히 볼 수 있습니다.' },
10
+ { question: '섀도잉 한 번은 무엇인가요?', answer: '클립을 끝까지 재생하면서 말하는 내용을 가능한 한 정확하고 즉시 따라 하는 것입니다. 플래너는 입력한 클립 길이를 사용합니다.' },
11
+ { question: '왜 일부 반복을 타임라인에 넣지 않나요?', answer: '부분 반복은 의도한 클립 전체를 연습하지 못하므로 계획에 유용하지 않습니다. 시작 전에 시간, 클립 길이, 반복 횟수와 휴식을 조정할 수 있도록 알려 줍니다.' },
12
+ { question: '남은 여유 시간은 어떻게 사용하나요?', answer: '의도적인 다시 듣기, 짧은 녹음 비교, 리듬과 강세 또는 다시 확인할 소리에 대한 메모에 사용하세요. 반복을 늘리는 것만으로 발음이 자동으로 좋아지지는 않습니다.' },
13
+ { question: '발음을 측정하거나 향상을 보장하나요?', answer: '아니요. 이 도구는 시간만 계획합니다. 목소리를 듣거나 정확도와 수준을 판단하거나 향상을 보장하지 않습니다. 정확도가 중요할 때는 피드백을 받으세요.' },
14
+ ];
15
+ const howTo = [
16
+ { name: '세션 시간 설정', text: '이 연습에 사용할 수 있는 총 시간을 입력하세요.' },
17
+ { name: '클립 길이 입력', text: '오디오나 비디오 클립 하나를 끝까지 재생한 시간을 사용하세요.' },
18
+ { name: '반복과 휴식 선택', text: '완전한 섀도잉 반복 횟수와 반복 사이에 필요한 휴식을 정하세요.' },
19
+ { name: '타임라인 따라가기', text: '번호가 붙은 반복을 수행하고 표시된 휴식을 취한 뒤 마지막 여유 블록을 다시 듣기, 비교 또는 메모에 사용하세요.' },
20
+ ];
21
+ const appSchema: SoftwareApplication = { '@type': 'SoftwareApplication', name: '언어 섀도잉 세션 플래너', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', isAccessibleForFree: true, url: 'https://gamebob.dev/ko/language-shadowing-session-planner' };
22
+ const howToSchema: HowTo = { '@type': 'HowTo', name: '언어 섀도잉 세션 계획하기', step: howTo.map((step) => ({ '@type': 'HowToStep', name: step.name, text: step.text })) };
23
+ const faqSchema: FAQPage = { '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
24
+
25
+ export const content: ToolLocaleContent<ShadowingSessionUI> = {
26
+ slug: 'language-shadowing-session-planner', title: '언어 섀도잉 세션 플래너', description: '클립 길이, 반복, 휴식과 사용 가능한 시간으로 시간 제한이 있는 섀도잉 연습 세션을 만드세요.', ui,
27
+ seo: [
28
+ { type: 'title', text: '섀도잉 클립을 끝낼 수 있는 연습 세션으로 바꾸기', level: 2 },
29
+ { type: 'paragraph', html: '연습 시간이 정해진 모양이 없으면 섀도잉을 쉽게 포기하게 됩니다. 이 플래너는 하나의 클립을 끝이 있는 연습으로 바꿉니다. 완전한 반복에는 번호가 붙고 휴식은 보이며 남은 시간은 다시 듣기나 메모를 위한 의도적인 시간이 됩니다. 시작한 뒤 시간이 부족하다는 것을 알기 전에 계획을 먼저 조정할 수 있습니다.' },
30
+ { type: 'title', text: '시간 계산 방식', level: 2 },
31
+ { type: 'paragraph', html: '각 섀도잉 반복은 클립 전체 길이로 계산합니다. 휴식은 반복 사이에만 더하고 마지막 반복 뒤에는 더하지 않습니다. 예를 들어 30초 클립을 10초 휴식과 함께 네 번 반복하면 말하기 120초와 휴식 30초를 합쳐 2분 10초가 걸립니다. 다음 완전한 반복이 시간 안에 들어가지 않으면 타임라인에 배치하지 않습니다.' },
32
+ { type: 'title', text: '연습 줄 읽기', level: 2 },
33
+ { type: 'table', headers: ['표시', '의미', '활용'], rows: [['번호가 있는 산호색 블록', '시간 안에 들어가는 완전한 반복입니다.', '클립에 맞춰 말하고 번호를 멈출 지점으로 사용하세요.'], ['파란 블록', '두 완전한 반복 사이의 휴식입니다.', '호흡을 고르고 집중을 되찾은 뒤 다음에 들을 소리를 정하세요.'], ['금색 블록', '요청한 반복을 모두 넣고 남은 시간입니다.', '다시 듣기, 녹음 비교 또는 짧은 메모에 사용하세요.']] },
34
+ { type: 'title', text: '각 반복을 더 유용하게 만들기', level: 2 },
35
+ { type: 'paragraph', html: '말하는 사람을 놓치지 않고 반복할 수 있을 만큼 짧은 클립을 고르세요. 처음에는 리듬을 유지하는 데 집중하고, 나중에는 강세, 소리의 약화, 연결 또는 설명할 수 있는 자음 하나를 들으세요. 아직 어렵다면 반복을 늘리기 전에 속도를 낮추거나 더 짧은 구간을 선택하세요.' },
36
+ { type: 'list', items: ['다음 구간을 찾지 않고 다시 재생할 수 있는 오디오를 고르세요.', '끝부분까지 포함한 실제 클립 길이를 입력하세요.', '휴식 중에는 설명을 읽는 대신 소리의 특징 하나를 말로 정리하세요.', '마지막 여유 시간을 다음 세션을 바꾸는 비교나 메모에 사용하세요.', '정확도가 중요하면 교사나 학습 파트너의 피드백을 받으세요.'] },
37
+ { type: 'tip', title: '플래너가 알려 줄 수 없는 것', html: '타임라인은 산술 계산이지 발음 평가가 아닙니다. 목소리를 듣거나 모방의 정확도와 능숙도를 판단하지 않습니다. 섀도잉 연구는 특정 학습자와 과제, 조건을 다루므로 이 계획을 실용적인 연습 틀로 사용하고 향상을 보장하는 증거로 여기지 마세요.' },
38
+ ], faq, bibliography: [{ name: '日本語聴解学習におけるシャドーイングの効果', url: 'https://www.jstage.jst.go.jp/article/jlem/29/1/29_26/_article/-char/ja' }, { name: 'British Council: Teaching English pronunciation online: Practical tips and benefits of shadowing', url: 'https://americas.britishcouncil.org/new-ways-of-teaching/events/teaching-english-pronunciation-online' }], howTo,
39
+ schemas: [{ '@context': 'https://schema.org', ...appSchema } as unknown as Record<string, unknown>, { '@context': 'https://schema.org', ...howToSchema } as unknown as Record<string, unknown>, { '@context': 'https://schema.org', ...faqSchema } as unknown as Record<string, unknown>],
40
+ };
@@ -0,0 +1,40 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { ShadowingSessionUI } from '../ui';
4
+
5
+ const ui: ShadowingSessionUI = {
6
+ quickStarts: 'Snel starten', quickShort: 'Lus van 5 min', quickFocused: 'Focus van 12 min', quickLong: 'Diepgaand 25 min', totalMinutes: 'Sessiebudget', clipSeconds: 'Cliplengte', repetitions: 'Shadowing-rondes', pauseSeconds: 'Pauze tussen rondes', minutesUnit: 'min', secondsUnit: 'sec', passesUnit: 'rondes', resetLabel: 'Standaardwaarden herstellen', scheduledShadowing: 'Geplande shadowing', passesLabel: 'geplande rondes', minutesScheduled: 'oefentijd', activeSpeaking: 'Spreektijd', pauseTime: 'Pauzetijd', flexibleBuffer: 'Flexibele marge', timelineLabel: 'Sessietijdlijn', shadowBlock: 'Shadowing-ronde', pauseBlock: 'Pauze', bufferBlock: 'Opnieuw luisteren of notities', statusFits: 'Past precies', statusShort: 'Budget te kort', statusBuffer: 'Ruimte over', shortDetail: 'Slechts {planned} van de {requested} aangevraagde rondes passen als volledige clips. Kort de clip in, verlaag het aantal herhalingen of voeg tijd toe.', bufferDetail: 'Alle aangevraagde rondes passen. Je hebt nog {remaining} voor opnieuw luisteren, een opnamecontrole of notities.', fitsDetail: 'Elke aangevraagde ronde en pauze valt binnen het sessiebudget.', budgetNote: 'Budget: {budget}', useBuffer: 'Gebruik het laatste blok voor opnieuw luisteren met minder ondersteuning, een korte zelfopname of een notitie over het geluid dat je wilt nadoen.', cueTitle: 'Oefenaanwijzingen', cuePlay: 'Speel de hele clip af voordat je het doel verandert.', cueSpeak: 'Volg eerst het ritme en verfijn daarna één klank.', cueNotice: 'Laat één notitie achter die je volgende ronde verandert.', timerTitle: 'Deze oefening uitvoeren', startTimer: 'Aftellen starten', pauseTimer: 'Aftellen pauzeren', resumeTimer: 'Aftellen hervatten', resetTimer: 'Timer resetten', timerSoundOn: 'Geluid aan', timerSoundOff: 'Geluid uit', timerIdle: 'Gereed', timerRunning: 'Bezig', timerPaused: 'Gepauzeerd', timerComplete: 'Voltooid', timerCompleteDetail: 'Sessie voltooid. Reset de timer om opnieuw te beginnen.', timerStartHint: 'Druk op starten wanneer je clip klaarstaat.', timerNoSchedule: 'Voeg genoeg tijd toe voor één volledige ronde om de timer te starten.', legendShadow: 'Shadowing-ronde', legendPause: 'Pauze', legendBuffer: 'Flexibele tijd', inputHelp: 'Een ronde is één volledige afspeelbeurt terwijl je meepraat. Pauzes komen alleen tussen volledige rondes.', numberLocale: 'nl-NL',
7
+ };
8
+ const faq = [
9
+ { question: 'Wat berekent deze shadowingplanner?', answer: 'De planner zet een sessiebudget, cliplengte, aantal shadowing-rondes en pauzeduur om in een tijdlijn. Alleen volledige rondes tellen mee, zodat je precies ziet hoeveel passen en hoeveel flexibele tijd overblijft.' },
10
+ { question: 'Wat is één shadowing-ronde?', answer: 'Een ronde is de volledige clip afspelen terwijl je de spraak zo nauwkeurig en direct mogelijk herhaalt. De planner gebruikt de cliplengte die je invoert.' },
11
+ { question: 'Waarom stopt de planner vóór een gedeeltelijke ronde?', answer: 'Een gedeeltelijke ronde is niet nuttig in een oefenplan, omdat je dan niet de bedoelde clip volledig herhaalt. De waarschuwing helpt je budget, cliplengte, herhalingen of pauzes aan te passen voordat je begint.' },
12
+ { question: 'Hoe gebruik ik de flexibele marge?', answer: 'Gebruik die voor één bewuste herhaling, een korte opname om te vergelijken of notities over ritme, verbindingen, klemtoon of een klank. Meer herhalingen geven niet automatisch een betere uitspraak.' },
13
+ { question: 'Meet dit mijn uitspraak of garandeert het vooruitgang?', answer: 'Nee. De tool plant alleen tijd. Hij luistert niet naar je stem, beoordeelt geen nauwkeurigheid, schat geen niveau en garandeert geen verbetering. Kies een clip die je goed genoeg begrijpt en vraag feedback als nauwkeurigheid belangrijk is.' },
14
+ ];
15
+ const howTo = [
16
+ { name: 'Stel het sessiebudget in', text: 'Voer het totale aantal minuten in dat je voor deze oefensessie kunt reserveren.' },
17
+ { name: 'Voer de cliplengte in', text: 'Gebruik de duur van één volledige audio- of videclip.' },
18
+ { name: 'Kies rondes en pauzes', text: 'Stel het aantal volledige shadowing-rondes en de nodige pauze ertussen in.' },
19
+ { name: 'Volg de tijdlijn', text: 'Voltooi de genummerde rondes, neem de gemarkeerde pauzes en gebruik het laatste flexibele blok voor opnieuw luisteren, vergelijken of notities.' },
20
+ ];
21
+ const appSchema: SoftwareApplication = { '@type': 'SoftwareApplication', name: 'Planner voor taalschadowing-sessies', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', isAccessibleForFree: true, url: 'https://gamebob.dev/nl/planner-taal-shadowing-sessie' };
22
+ const howToSchema: HowTo = { '@type': 'HowTo', name: 'Een taalschadowing-sessie plannen', step: howTo.map((step) => ({ '@type': 'HowToStep', name: step.name, text: step.text })) };
23
+ const faqSchema: FAQPage = { '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
24
+
25
+ export const content: ToolLocaleContent<ShadowingSessionUI> = {
26
+ slug: 'planner-taal-shadowing-sessie', title: 'Planner voor sessies met taalshadowing', description: 'Bouw een getimede shadowing-oefensessie op basis van cliplengte, herhalingen, pauzes en beschikbare tijd.', ui,
27
+ seo: [
28
+ { type: 'title', text: 'Maak van een shadowingclip een sessie die je kunt afronden', level: 2 },
29
+ { type: 'paragraph', html: 'Shadowing wordt makkelijk opgegeven wanneer een oefenblok geen duidelijke vorm heeft. Deze planner maakt van één clip een eindige repetitie: volledige rondes krijgen nummers, pauzes zijn zichtbaar en het resterende budget wordt een bewuste ruimte voor opnieuw luisteren of notities. Je kunt het plan aanpassen voordat je start, in plaats van halverwege te ontdekken dat de sessie niet past.' },
30
+ { type: 'title', text: 'Zo werkt de tijdsberekening', level: 2 },
31
+ { type: 'paragraph', html: 'De berekening behandelt elke ronde als één volledige cliplengte. De pauze wordt alleen tussen rondes opgeteld, nooit na de laatste ronde. Een clip van 30 seconden die vier keer wordt herhaald met pauzes van 10 seconden duurt bijvoorbeeld 2 minuten en 10 seconden: 120 seconden spreken plus 30 seconden pauze. Als het budget korter is dan de volgende volledige ronde, wordt die niet op de tijdlijn gezet.' },
32
+ { type: 'title', text: 'De oefenlijn lezen', level: 2 },
33
+ { type: 'table', headers: ['Markering', 'Betekenis', 'Nuttige actie'], rows: [['Genummerde koraalkleurige blokken', 'Volledige shadowing-rondes die binnen het budget passen.', 'Praat mee met de clip en gebruik het nummer als eindpunt.'], ['Blauwe blokken', 'De pauze tussen twee volledige rondes.', 'Adem, richt je aandacht opnieuw en kies naar welke klank je hierna luistert.'], ['Gouden blok', 'Tijd die overblijft nadat alle aangevraagde rondes passen.', 'Gebruik één herhaling, vergelijk een opname of maak een korte notitie in plaats van automatisch meer volume toe te voegen.']] },
34
+ { type: 'title', text: 'Maak elke ronde nuttiger', level: 2 },
35
+ { type: 'paragraph', html: 'Kies een clip die kort genoeg is om te herhalen zonder de spreker kwijt te raken. Richt je in een vroege ronde op het ritme; luister later naar klemtoon, reducties, verbindingen of één medeklinker die je kunt beschrijven. Is de clip nog te moeilijk, vertraag hem dan of kies een korter fragment voordat je meer herhalingen toevoegt.' },
36
+ { type: 'list', items: ['Kies audio die je opnieuw kunt afspelen zonder het volgende segment te zoeken.', 'Gebruik de echte cliplengte, inclusief het volledige einde.', 'Gebruik pauzes om één klankeigenschap te benoemen in plaats van uitleg door te nemen.', 'Gebruik de laatste marge voor een vergelijking of notitie die je volgende sessie verandert.', 'Vraag een leraar of oefenpartner om feedback wanneer nauwkeurigheid belangrijk is.'] },
37
+ { type: 'tip', title: 'Wat de planner niet kan vertellen', html: 'De tijdlijn is rekenwerk, geen uitspraakbeoordeling. Hij hoort je stem niet, beoordeelt je imitatie niet en stelt geen niveau vast. Onderzoek naar shadowing gaat over specifieke leerlingen, taken en trainingsvoorwaarden. Gebruik dit schema daarom als praktisch kader voor oefening, niet als bewijs van gegarandeerde vooruitgang.' },
38
+ ], faq, bibliography: [{ name: '日本語聴解学習におけるシャドーイングの効果', url: 'https://www.jstage.jst.go.jp/article/jlem/29/1/29_26/_article/-char/ja' }, { name: 'British Council: Teaching English pronunciation online: Practical tips and benefits of shadowing', url: 'https://americas.britishcouncil.org/new-ways-of-teaching/events/teaching-english-pronunciation-online' }], howTo,
39
+ schemas: [{ '@context': 'https://schema.org', ...appSchema } as unknown as Record<string, unknown>, { '@context': 'https://schema.org', ...howToSchema } as unknown as Record<string, unknown>, { '@context': 'https://schema.org', ...faqSchema } as unknown as Record<string, unknown>],
40
+ };
@@ -0,0 +1,40 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { ShadowingSessionUI } from '../ui';
4
+
5
+ const ui: ShadowingSessionUI = {
6
+ quickStarts: 'Szybki start', quickShort: 'Pętla 5 min', quickFocused: 'Skupienie 12 min', quickLong: 'Głęboka sesja 25 min', totalMinutes: 'Budżet sesji', clipSeconds: 'Długość klipu', repetitions: 'Powtórzenia shadowingu', pauseSeconds: 'Przerwa między powtórzeniami', minutesUnit: 'min', secondsUnit: 's', passesUnit: 'powtórzeń', resetLabel: 'Przywróć wartości domyślne', scheduledShadowing: 'Zaplanowany shadowing', passesLabel: 'zaplanowanych powtórzeń', minutesScheduled: 'czas ćwiczeń', activeSpeaking: 'Czas mówienia', pauseTime: 'Czas przerw', flexibleBuffer: 'Elastyczny zapas', timelineLabel: 'Oś czasu sesji', shadowBlock: 'Powtórzenie shadowingu', pauseBlock: 'Przerwa', bufferBlock: 'Powtórka lub notatki', statusFits: 'Pasuje dokładnie', statusShort: 'Za mało czasu', statusBuffer: 'Jest zapas', shortDetail: 'Mieszczą się tylko {planned} z {requested} żądanych powtórzeń w formie pełnych klipów. Skróć klip, zmniejsz liczbę powtórzeń lub dodaj czas.', bufferDetail: 'Wszystkie żądane powtórzenia się mieszczą. Pozostaje {remaining} na powtórkę, sprawdzenie nagrania lub notatki.', fitsDetail: 'Wszystkie żądane powtórzenia i przerwy mieszczą się w budżecie sesji.', budgetNote: 'Budżet: {budget}', useBuffer: 'Wykorzystaj ostatni blok na powtórkę z mniejszym wsparciem, krótkie własne nagranie albo notatkę o dźwięku, który chcesz naśladować.', cueTitle: 'Wskazówki do ćwiczenia', cuePlay: 'Odtwórz cały klip, zanim zmienisz cel.', cueSpeak: 'Najpierw trzymaj rytm, a potem dopracuj jeden dźwięk.', cueNotice: 'Zostaw notatkę, która zmieni następne powtórzenie.', timerTitle: 'Uruchom tę próbę', startTimer: 'Rozpocznij odliczanie', pauseTimer: 'Wstrzymaj odliczanie', resumeTimer: 'Wznów odliczanie', resetTimer: 'Zresetuj minutnik', timerSoundOn: 'Dźwięk włączony', timerSoundOff: 'Dźwięk wyłączony', timerIdle: 'Gotowe', timerRunning: 'W toku', timerPaused: 'Wstrzymano', timerComplete: 'Ukończono', timerCompleteDetail: 'Sesja ukończona. Zresetuj minutnik, aby uruchomić ją ponownie.', timerStartHint: 'Naciśnij start, gdy klip będzie gotowy.', timerNoSchedule: 'Dodaj dość czasu na jedno pełne powtórzenie, aby uruchomić minutnik.', legendShadow: 'Powtórzenie shadowingu', legendPause: 'Przerwa', legendBuffer: 'Elastyczny czas', inputHelp: 'Powtórzenie to pełne odtworzenie, podczas którego mówisz razem z nagraniem. Przerwy pojawiają się tylko między pełnymi powtórzeniami.', numberLocale: 'pl-PL',
7
+ };
8
+ const faq = [
9
+ { question: 'Co oblicza ten planer shadowingu?', answer: 'Zamienia budżet sesji, długość klipu, liczbę powtórzeń i długość przerw na oś czasu. Liczy tylko pełne powtórzenia, więc pokazuje dokładnie, ile się mieści i ile elastycznego czasu zostaje.' },
10
+ { question: 'Czym jest jedno powtórzenie shadowingu?', answer: 'To pełne odtworzenie klipu, podczas którego powtarzasz mowę możliwie dokładnie i bezpośrednio. Planer korzysta z podanej długości klipu.' },
11
+ { question: 'Dlaczego planer zatrzymuje się przed częściowym powtórzeniem?', answer: 'Częściowe powtórzenie nie jest użyteczne w planie, bo zmienia klip, który miał być powtarzany. Ostrzeżenie pomaga zmienić budżet, długość, liczbę powtórzeń lub przerwy przed rozpoczęciem.' },
12
+ { question: 'Jak wykorzystać elastyczny zapas?', answer: 'Użyj go na jedną celową powtórkę, krótkie nagranie do porównania albo notatki o rytmie, łączeniu, akcencie lub dźwięku do ponownego sprawdzenia. Więcej powtórzeń nie oznacza automatycznie lepszej wymowy.' },
13
+ { question: 'Czy narzędzie mierzy wymowę albo gwarantuje postęp?', answer: 'Nie. Planuje tylko czas. Nie słucha głosu, nie ocenia dokładności, nie szacuje poziomu i nie gwarantuje poprawy. Wybierz klip, który rozumiesz wystarczająco dobrze, i korzystaj z informacji zwrotnej, gdy dokładność ma znaczenie.' },
14
+ ];
15
+ const howTo = [
16
+ { name: 'Ustaw budżet sesji', text: 'Wpisz łączną liczbę minut, które możesz przeznaczyć na te ćwiczenia.' },
17
+ { name: 'Wpisz długość klipu', text: 'Użyj czasu trwania jednego pełnego klipu audio lub wideo.' },
18
+ { name: 'Wybierz powtórzenia i przerwy', text: 'Ustaw liczbę pełnych powtórzeń oraz potrzebną przerwę między nimi.' },
19
+ { name: 'Postępuj według osi czasu', text: 'Wykonuj ponumerowane powtórzenia, rób zaznaczone przerwy i użyj ostatniego bloku na powtórkę, porównanie lub notatki.' },
20
+ ];
21
+ const appSchema: SoftwareApplication = { '@type': 'SoftwareApplication', name: 'Planer sesji shadowingu językowego', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', isAccessibleForFree: true, url: 'https://gamebob.dev/pl/planer-sesji-shadowingu-jezykowego' };
22
+ const howToSchema: HowTo = { '@type': 'HowTo', name: 'Planowanie sesji shadowingu językowego', step: howTo.map((step) => ({ '@type': 'HowToStep', name: step.name, text: step.text })) };
23
+ const faqSchema: FAQPage = { '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
24
+
25
+ export const content: ToolLocaleContent<ShadowingSessionUI> = {
26
+ slug: 'planer-sesji-shadowingu-jezykowego', title: 'Planer sesji shadowingu językowego', description: 'Zbuduj zaplanowaną czasowo sesję shadowingu na podstawie długości klipu, powtórzeń, przerw i dostępnego czasu.', ui,
27
+ seo: [
28
+ { type: 'title', text: 'Zamień klip shadowingu w sesję, którą ukończysz', level: 2 },
29
+ { type: 'paragraph', html: 'Shadowing łatwo porzucić, gdy blok ćwiczeń nie ma wyraźnej formy. Ten planer zmienia jeden klip w skończoną próbę: pełne powtórzenia są numerowane, przerwy widoczne, a pozostały budżet staje się świadomym czasem na powtórkę lub notatki. Możesz dopasować plan przed startem, zamiast w połowie odkryć, że sesja nie mieści się w czasie.' },
30
+ { type: 'title', text: 'Jak działa obliczanie czasu', level: 2 },
31
+ { type: 'paragraph', html: 'Obliczenie traktuje każde powtórzenie jako pełną długość klipu. Przerwę dodaje tylko między powtórzeniami, nigdy po ostatnim. Klip trwający 30 sekund, powtórzony cztery razy z przerwami po 10 sekund, zajmuje na przykład 2 minuty i 10 sekund: 120 sekund mówienia oraz 30 sekund przerw. Jeśli budżet jest krótszy od kolejnego pełnego powtórzenia, nie zostanie ono dodane do osi czasu.' },
32
+ { type: 'title', text: 'Jak czytać linię ćwiczeń', level: 2 },
33
+ { type: 'table', headers: ['Oznaczenie', 'Znaczenie', 'Dobre działanie'], rows: [['Ponumerowane koralowe bloki', 'Pełne powtórzenia, które mieszczą się w budżecie.', 'Mów razem z klipem i potraktuj numer jako punkt zakończenia.'], ['Niebieskie bloki', 'Przerwa między dwoma pełnymi powtórzeniami.', 'Oddychaj, skup uwagę i wybierz dźwięk, którego posłuchasz dalej.'], ['Złoty blok', 'Czas pozostały po wszystkich żądanych powtórzeniach.', 'Zrób jedną powtórkę, porównaj nagranie albo zapisz krótką notatkę zamiast automatycznie dodawać więcej.']] },
34
+ { type: 'title', text: 'Spraw, by każde powtórzenie było użyteczne', level: 2 },
35
+ { type: 'paragraph', html: 'Wybierz klip na tyle krótki, aby dało się go powtarzać bez zgubienia mówcy. Na początku skup się na rytmie, a później słuchaj akcentu, redukcji, łączenia lub jednej spółgłoski, którą potrafisz opisać. Jeśli klip nadal jest za trudny, zwolnij go albo wybierz krótszy fragment, zanim dodasz kolejne powtórzenia.' },
36
+ { type: 'list', items: ['Wybierz nagranie, które możesz odtworzyć bez szukania następnego fragmentu.', 'Wpisz prawdziwą długość klipu razem z pełnym zakończeniem.', 'Wykorzystaj przerwy, by nazwać jedną cechę dźwięku, zamiast czytać kolejne objaśnienia.', 'Przeznacz końcowy zapas na porównanie albo notatkę, która zmieni następną sesję.', 'Poproś nauczyciela lub partnera o informację zwrotną, gdy dokładność jest ważna.'] },
37
+ { type: 'tip', title: 'Czego planer nie potrafi powiedzieć', html: 'Oś czasu to arytmetyka, a nie ocena wymowy. Nie słyszy głosu, nie ocenia naśladowania i nie ustala poziomu. Badania nad shadowingiem dotyczą konkretnych uczniów, zadań i warunków, dlatego traktuj ten plan jako praktyczne ramy ćwiczeń, a nie dowód gwarantowanego postępu.' },
38
+ ], faq, bibliography: [{ name: '日本語聴解学習におけるシャドーイングの効果', url: 'https://www.jstage.jst.go.jp/article/jlem/29/1/29_26/_article/-char/ja' }, { name: 'British Council: Teaching English pronunciation online: Practical tips and benefits of shadowing', url: 'https://americas.britishcouncil.org/new-ways-of-teaching/events/teaching-english-pronunciation-online' }], howTo,
39
+ schemas: [{ '@context': 'https://schema.org', ...appSchema } as unknown as Record<string, unknown>, { '@context': 'https://schema.org', ...howToSchema } as unknown as Record<string, unknown>, { '@context': 'https://schema.org', ...faqSchema } as unknown as Record<string, unknown>],
40
+ };