@jjlmoya/utils-language 1.1.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 (109) hide show
  1. package/.github/workflows/npm-publish.yml +40 -0
  2. package/.gitignore +6 -0
  3. package/.stylelintrc.json +98 -0
  4. package/astro.config.mjs +19 -0
  5. package/eslint.config.js +201 -0
  6. package/package.json +79 -0
  7. package/prompts/create_tool.md +98 -0
  8. package/prompts/i18n/de.md +16 -0
  9. package/prompts/i18n/en.md +16 -0
  10. package/prompts/i18n/es.md +16 -0
  11. package/prompts/i18n/fr.md +16 -0
  12. package/prompts/i18n/id.md +16 -0
  13. package/prompts/i18n/it.md +16 -0
  14. package/prompts/i18n/ja.md +16 -0
  15. package/prompts/i18n/ko.md +16 -0
  16. package/prompts/i18n/nl.md +16 -0
  17. package/prompts/i18n/pl.md +16 -0
  18. package/prompts/i18n/pt.md +16 -0
  19. package/prompts/i18n/ru.md +16 -0
  20. package/prompts/i18n/sv.md +16 -0
  21. package/prompts/i18n/tr.md +16 -0
  22. package/prompts/i18n/zh.md +16 -0
  23. package/prompts/seo.md +58 -0
  24. package/prompts/translations/french.md +33 -0
  25. package/scripts/postinstall.mjs +27 -0
  26. package/src/category/LanguageCategorySEO.astro +9 -0
  27. package/src/category/i18n/de.ts +15 -0
  28. package/src/category/i18n/en.ts +23 -0
  29. package/src/category/i18n/es.ts +15 -0
  30. package/src/category/i18n/fr.ts +15 -0
  31. package/src/category/i18n/id.ts +15 -0
  32. package/src/category/i18n/it.ts +15 -0
  33. package/src/category/i18n/ja.ts +15 -0
  34. package/src/category/i18n/ko.ts +15 -0
  35. package/src/category/i18n/nl.ts +15 -0
  36. package/src/category/i18n/pl.ts +15 -0
  37. package/src/category/i18n/pt.ts +15 -0
  38. package/src/category/i18n/ru.ts +15 -0
  39. package/src/category/i18n/shared.ts +11 -0
  40. package/src/category/i18n/sv.ts +15 -0
  41. package/src/category/i18n/tr.ts +15 -0
  42. package/src/category/i18n/zh.ts +15 -0
  43. package/src/category/index.ts +24 -0
  44. package/src/components/PreviewNavSidebar.astro +116 -0
  45. package/src/components/PreviewToolbar.astro +143 -0
  46. package/src/data.ts +10 -0
  47. package/src/entries.ts +3 -0
  48. package/src/env.d.ts +5 -0
  49. package/src/index.ts +23 -0
  50. package/src/layouts/PreviewLayout.astro +118 -0
  51. package/src/pages/[locale]/[slug].astro +163 -0
  52. package/src/pages/[locale].astro +251 -0
  53. package/src/pages/index.astro +3 -0
  54. package/src/tests/bibliography_wellformed_export.test.ts +46 -0
  55. package/src/tests/diacritics_density.test.ts +118 -0
  56. package/src/tests/faq_count.test.ts +18 -0
  57. package/src/tests/i18n_coverage.test.ts +34 -0
  58. package/src/tests/inverted_punctuation.test.ts +84 -0
  59. package/src/tests/locale_completeness.test.ts +23 -0
  60. package/src/tests/mocks/astro_mock.js +2 -0
  61. package/src/tests/no_em_dash.test.ts +47 -0
  62. package/src/tests/no_en_dash.test.ts +70 -0
  63. package/src/tests/no_h1_in_components.test.ts +48 -0
  64. package/src/tests/pagespeed_best_practices.test.ts +198 -0
  65. package/src/tests/schemas_fulfillment.test.ts +23 -0
  66. package/src/tests/script_density.test.ts +94 -0
  67. package/src/tests/seo_length.test.ts +23 -0
  68. package/src/tests/seo_parity.test.ts +60 -0
  69. package/src/tests/seo_translation_completeness.test.ts +69 -0
  70. package/src/tests/seo_wellformed_export.test.ts +65 -0
  71. package/src/tests/shared-test-helpers.ts +56 -0
  72. package/src/tests/slug_language_code_format.test.ts +23 -0
  73. package/src/tests/slug_uniqueness.test.ts +81 -0
  74. package/src/tests/spanish_leakage.test.ts +175 -0
  75. package/src/tests/title_quality.test.ts +55 -0
  76. package/src/tests/tool_exports.test.ts +34 -0
  77. package/src/tests/tool_validation.test.ts +16 -0
  78. package/src/tests/translation_copy.test.ts +122 -0
  79. package/src/tool/language-learning-study-plan-planner/bibliography.astro +6 -0
  80. package/src/tool/language-learning-study-plan-planner/bibliography.ts +6 -0
  81. package/src/tool/language-learning-study-plan-planner/component.astro +274 -0
  82. package/src/tool/language-learning-study-plan-planner/entry.ts +34 -0
  83. package/src/tool/language-learning-study-plan-planner/i18n/de.ts +22 -0
  84. package/src/tool/language-learning-study-plan-planner/i18n/en.ts +103 -0
  85. package/src/tool/language-learning-study-plan-planner/i18n/es.ts +21 -0
  86. package/src/tool/language-learning-study-plan-planner/i18n/fr.ts +21 -0
  87. package/src/tool/language-learning-study-plan-planner/i18n/id.ts +21 -0
  88. package/src/tool/language-learning-study-plan-planner/i18n/it.ts +21 -0
  89. package/src/tool/language-learning-study-plan-planner/i18n/ja.ts +21 -0
  90. package/src/tool/language-learning-study-plan-planner/i18n/ko.ts +21 -0
  91. package/src/tool/language-learning-study-plan-planner/i18n/nl.ts +21 -0
  92. package/src/tool/language-learning-study-plan-planner/i18n/pl.ts +21 -0
  93. package/src/tool/language-learning-study-plan-planner/i18n/pt.ts +21 -0
  94. package/src/tool/language-learning-study-plan-planner/i18n/ru.ts +21 -0
  95. package/src/tool/language-learning-study-plan-planner/i18n/shared.ts +70 -0
  96. package/src/tool/language-learning-study-plan-planner/i18n/sv.ts +21 -0
  97. package/src/tool/language-learning-study-plan-planner/i18n/tr.ts +21 -0
  98. package/src/tool/language-learning-study-plan-planner/i18n/zh.ts +21 -0
  99. package/src/tool/language-learning-study-plan-planner/index.ts +4 -0
  100. package/src/tool/language-learning-study-plan-planner/language-learning-study-plan-planner.css +403 -0
  101. package/src/tool/language-learning-study-plan-planner/logic.test.ts +59 -0
  102. package/src/tool/language-learning-study-plan-planner/logic.ts +157 -0
  103. package/src/tool/language-learning-study-plan-planner/seo.astro +9 -0
  104. package/src/tool/language-learning-study-plan-planner/types.ts +42 -0
  105. package/src/tool/language-learning-study-plan-planner/ui.ts +46 -0
  106. package/src/tools.ts +6 -0
  107. package/src/types.ts +68 -0
  108. package/tsconfig.json +15 -0
  109. package/vitest.config.ts +20 -0
@@ -0,0 +1,21 @@
1
+ import type { LanguagePlannerUI } from '../ui';
2
+ import { createPlannerLocale, makePlannerSeo } from './shared';
3
+
4
+ const ui: LanguagePlannerUI = {
5
+ plannerKicker: '언어 학습 플래너', plannerHeading: '다음 언어 목표를 한눈에 확인하세요.', sourceLanguage: '시작 언어', targetLanguage: '배우려는 언어', currentLevel: '현재 CEFR 수준', targetLevel: '목표 CEFR 수준', targetDate: '목표 날짜', weeklyHours: '주간 학습 시간', priority: '기능 우선순위', balanced: '균형', comprehension: '이해', production: '말하기와 쓰기', planButton: '학습 계획 만들기', resetButton: '초기화', presetsLabel: '속도를 선택해 시작', casualPreset: '하루 30분', steadyPreset: '주 5시간', sprintPreset: '시험 대비 집중 학습', plannerNote: '이 도구는 안내 학습 시간의 넓은 범위를 바탕으로 한 계획용 추정치입니다. 수준을 평가하거나 유창함을 보장하지 않습니다.', resultTitle: '학습 계획', liveLabel: '현재', hoursRange: '예상 필요 시간', weeksAvailable: '목표 날짜까지 남은 주', hoursAvailable: '이 속도에서 가능한 시간', recommendedTime: '권장 주간 범위', onTrack: '현재 일정이 상위 추정치를 충족합니다.', tight: '현재 일정이 하위 추정치를 충족합니다. 복습 시간을 남겨 두세요.', insufficient: '기한이 하위 추정치보다 짧습니다. 시간을 늘리거나 날짜를 미루세요.', statusLabel: '계획 상태', weeklyAllocation: '주간 기능 배분', milestones: '중간 목표', skillListening: '듣기', skillSpeaking: '말하기', skillReading: '읽기', skillWriting: '쓰기', milestoneTarget: '도달', milestoneWeek: '주차 전후', errorPrefix: '입력값을 확인하세요', languageOptions: '영어|스페인어|프랑스어|독일어|이탈리아어|포르투갈어|일본어|한국어|중국어|아랍어', emptyResultDescription: '속도와 날짜를 선택하면 현재 수준에서 다음 수준까지의 경로가 표시됩니다.', guidedLearningDetail: '안내 학습 범위', targetDateDetail: '목표 날짜까지', weeklyPaceDetail: '선택한 주간 속도로', recommendedRangeDetail: '이 범위에 필요한 주당',
6
+ };
7
+
8
+ const faq = [
9
+ { question: '언어 학습 플래너는 무엇을 계산하나요?', answer: '현재 CEFR 수준에서 목표 수준까지 필요한 시간 범위를 추정하고, 목표 날짜 전까지 가능한 주와 시간을 비교한 뒤 기능별 주간 배분을 제안합니다.' },
10
+ { question: '학습 시간은 보장되나요?', answer: '아니요. 안내 학습 추정치를 바탕으로 한 넓은 계획 범위입니다. 언어 조합, 이전 경험, 노출 정도, 학습의 질과 연습 기회에 따라 실제 시간은 크게 달라질 수 있습니다.' },
11
+ { question: '이해와 산출 우선순위는 어떻게 다른가요?', answer: '이해는 듣기와 읽기에 더 많은 시간을 배분합니다. 산출은 말하기와 쓰기에 더 많은 시간을 배분합니다. 균형은 네 기능에 시간을 고르게 나눕니다.' },
12
+ { question: '어떤 언어 조합에도 사용할 수 있나요?', answer: '어떤 언어 조합의 출발점으로 사용할 수 있지만 언어 간 거리나 문자 체계의 복잡성은 계산하지 않습니다. 계획의 기준으로 활용하고 실제 진도에 따라 조정하세요.' },
13
+ { question: '플래너가 언어 선택을 저장하나요?', answer: '플래너는 브라우저에서 실행되며 입력값을 서버로 보내지 않습니다. 계정이나 로그인이 필요하지 않습니다.' },
14
+ ];
15
+
16
+ export const content = createPlannerLocale({
17
+ slug: 'language-learning-study-plan-planner', title: '언어 학습 계획 계산기', description: 'CEFR 학습 시간을 추정하고 목표 날짜를 확인해 주간 학습 가능 시간을 실용적인 언어 학습 계획으로 바꿔 보세요.', ui, faq,
18
+ seo: makePlannerSeo({ titles: ['목표 날짜에 맞는 언어 학습 계획 만들기', '추정치는 어떻게 계산되나요', '결정하기 전에 계획 상태 읽기', '숫자를 출발점으로 사용하기'], paragraphs: ['분명한 언어 목표가 있지만 목표 날짜가 현실적인지 확인하고 싶을 때 이 계산기를 사용하세요. 현재 CEFR 수준, 목표 수준, 날짜와 매주 실제로 확보할 수 있는 시간을 선택하면 됩니다. 필요한 시간 범위, 권장 주간 속도와 진행 상황을 확인할 중간 목표가 표시됩니다.', '플래너는 각 CEFR 수준의 누적 안내 학습 시간 범위를 사용합니다. 현재 수준의 범위를 목표 수준의 범위에서 빼고 남은 주와 비교합니다. 이 모델에서 A1에서 B1로 올라가는 데는 약 260에서 300시간이 필요합니다. 주 5시간을 공부하면 빠진 학습이나 추가 복습을 제외하고 약 52에서 60주가 걸립니다.', 'CEFR은 능력을 설명하는 기준이지 보장된 일정이 아닙니다. 언어 간 거리, 이전 노출, 학습의 질과 실제 사용은 속도를 크게 바꿀 수 있습니다. 중간 목표를 실제 결과와 비교하세요. 느리다면 날짜를 미루거나 목표를 낮추고, 빠르다면 남는 시간을 대화와 복습에 사용하세요.'], tableHeaders: ['상태', '의미', '할 일'], tableRows: [['순조로움', '가능한 시간이 상위 추정치에 도달합니다.', '루틴을 유지하고 중간 목표를 확인 지점으로 사용하세요.'], ['빠듯함', '가능한 시간이 하위 추정치에는 도달하지만 상위에는 미치지 못합니다.', '목표 날짜를 도전적인 일정으로 보고 복습 시간을 확보하세요.'], ['부족함', '가능한 시간이 하위 추정치보다 적습니다.', '주간 시간을 늘리거나 날짜를 미루거나 더 가까운 목표를 선택하세요.']] }),
19
+ bibliography: [{ name: '유럽 평의회: CEFR Companion Volume 스페인어판', url: 'https://rm.coe.int/marco-comun-europeo-de-referencia-para-las-lenguas-aprendizaje-ensenan/1680a52d53' }, { name: 'Cambridge English: 안내 학습 시간', url: 'https://support.cambridgeenglish.org/hc/en-gb/articles/202838506-Guided-learning-hours' }],
20
+ howToName: '언어 학습 계획 만들기', howTo: [{ name: '언어 선택하기', text: '이미 편하게 사용하는 언어와 배우고 싶은 언어를 선택하세요.' }, { name: 'CEFR 진행 설정하기', text: '현재 수준과 도달하려는 수준을 선택하세요. 목표는 현재 수준보다 높아야 합니다.' }, { name: '주간 루틴 확보하기', text: '미래의 목표 날짜를 정하고 매주 현실적으로 공부할 수 있는 시간을 입력하세요.' }, { name: '검토하고 조정하기', text: '상태, 기능 배분과 중간 목표를 시작 계획으로 사용한 뒤 날짜나 주간 시간을 조정하세요.' }],
21
+ });
@@ -0,0 +1,21 @@
1
+ import type { LanguagePlannerUI } from '../ui';
2
+ import { createPlannerLocale, makePlannerSeo } from './shared';
3
+
4
+ const ui: LanguagePlannerUI = {
5
+ plannerKicker: 'Planner voor taalstudie', plannerHeading: 'Maak je volgende taaldoel zichtbaar.', sourceLanguage: 'Starttaal', targetLanguage: 'Taal die je wilt leren', currentLevel: 'Huidig ERK niveau', targetLevel: 'Doelniveau volgens ERK', targetDate: 'Doeldatum', weeklyHours: 'Studietijd per week', priority: 'Prioriteit voor vaardigheden', balanced: 'Evenwichtig', comprehension: 'Begrip', production: 'Spreken en schrijven', planButton: 'Mijn studieplan maken', resetButton: 'Opnieuw instellen', presetsLabel: 'Start met een tempo', casualPreset: '30 min per dag', steadyPreset: '5 uur per week', sprintPreset: 'Examensprint', plannerNote: 'Dit is een planningsschatting op basis van brede bereiken voor begeleid leren. De tool test je niveau niet en garandeert geen vloeiendheid.', resultTitle: 'Je studieplan', liveLabel: 'Live', hoursRange: 'Geschat aantal benodigde uren', weeksAvailable: 'Weken tot je datum', hoursAvailable: 'Beschikbare uren in dit tempo', recommendedTime: 'Aanbevolen bereik per week', onTrack: 'Je planning dekt de hoogste schatting.', tight: 'Je planning dekt de laagste schatting. Houd tijd vrij voor herhaling.', insufficient: 'Je deadline is korter dan de laagste schatting. Voeg tijd toe of verplaats de datum.', statusLabel: 'Status van het plan', weeklyAllocation: 'Wekelijkse verdeling per vaardigheid', milestones: 'Mijlpalen', skillListening: 'Luisteren', skillSpeaking: 'Spreken', skillReading: 'Lezen', skillWriting: 'Schrijven', milestoneTarget: 'Bereik', milestoneWeek: 'rond week', errorPrefix: 'Controleer je invoer', languageOptions: 'Engels|Spaans|Frans|Duits|Italiaans|Portugees|Japans|Koreaans|Chinees|Arabisch', emptyResultDescription: 'Kies een tempo en datum om je route van het ene niveau naar het volgende te zien.', guidedLearningDetail: 'bereik voor begeleid leren', targetDateDetail: 'tot je doeldatum', weeklyPaceDetail: 'bij jouw gekozen weektempo', recommendedRangeDetail: 'per week voor dit bereik',
6
+ };
7
+
8
+ const faq = [
9
+ { question: 'Wat berekent de planner voor taalstudie?', answer: 'De planner schat het aantal uren tussen je huidige en gewenste ERK niveau, vergelijkt dat bereik met de beschikbare weken en uren tot je datum en stelt een wekelijkse verdeling over vaardigheden voor.' },
10
+ { question: 'Zijn de studie uren een garantie?', answer: 'Nee. Het zijn brede planningsbereiken op basis van schattingen voor begeleid leren. Je taalcombinatie, ervaring, blootstelling, studiekwaliteit en oefenkansen kunnen de werkelijke duur sterk veranderen.' },
11
+ { question: 'Wat is het verschil tussen begrip en productie?', answer: 'Begrip geeft meer tijd aan luisteren en lezen. Productie geeft meer tijd aan spreken en schrijven. Evenwichtig verdeelt de tijd gelijk over de vier vaardigheden.' },
12
+ { question: 'Kan ik dit voor elke taalcombinatie gebruiken?', answer: 'Je kunt het als startpunt voor elke taalcombinatie gebruiken, maar de schatting houdt geen rekening met taalafstand of schriftcomplexiteit. Zie het bereik als een planningskader en pas het aan met je eigen voortgang.' },
13
+ { question: 'Slaat de planner mijn taalkeuzes op?', answer: 'De planner werkt in je browser en verstuurt je invoer niet naar een server. Deze pagina heeft geen account of aanmelding nodig.' },
14
+ ];
15
+
16
+ export const content = createPlannerLocale({
17
+ slug: 'taalstudieplan-calculator', title: 'Calculator voor een taalstudieplan', description: 'Schat ERK studie uren, test een deadline en zet je beschikbare tijd per week om in een praktisch plan voor taal leren.', ui, faq,
18
+ seo: makePlannerSeo({ titles: ['Maak een taalstudieplan dat bij je deadline past', 'Zo wordt de schatting berekend', 'Lees de planstatus voordat je je vastlegt', 'Gebruik het getal als uitgangspunt'], paragraphs: ['Gebruik deze calculator wanneer je een duidelijk taaldoel hebt maar wilt weten of je deadline realistisch is. Kies je huidige ERK niveau, een doelniveau, een datum en de wekelijkse tijd die je echt kunt vrijhouden. Je krijgt een werkbelasting, een voorgesteld tempo per week en mijlpalen om je voortgang te controleren.', 'De planner gebruikt cumulatieve bereiken van uren begeleid leren voor elk ERK niveau. Het bereik van je huidige niveau wordt afgetrokken van dat van je doel en de uitkomst wordt vergeleken met de resterende weken. In dit model staat de stap van A1 naar B1 voor ongeveer 260 tot 300 begeleide uren. Bij 5 uur per week zijn dat ongeveer 52 tot 60 weken, nog zonder gemiste sessies of extra herhaling.', 'Het ERK beschrijft vaardigheden en geen gegarandeerd tijdschema. Taalafstand, eerdere blootstelling, studiekwaliteit en echte oefening kunnen het tempo sterk veranderen. Vergelijk de mijlpalen met echte signalen: verplaats de datum of verlaag het doel als je trager gaat; gebruik extra tijd voor gesprekken en herhaling als je sneller gaat.'], tableHeaders: ['Status', 'Betekenis', 'Wat te doen'], tableRows: [['Op schema', 'Je beschikbare uren bereiken de hoogste schatting.', 'Houd de routine vast en gebruik mijlpalen als controlepunten.'], ['Krap', 'Je uren bereiken de laagste maar niet de hoogste schatting.', 'Zie de datum als ambitieus en houd tijd vrij voor herhaling.'], ['Onvoldoende', 'Je beschikbare uren blijven onder de laagste schatting.', 'Voeg wekelijkse tijd toe, verplaats de datum of kies een dichterbij liggend doel.']] }),
19
+ bibliography: [{ name: 'Raad van Europa: CEFR Companion Volume, Spaanse editie', url: 'https://rm.coe.int/marco-comun-europeo-de-referencia-para-las-lenguas-aprendizaje-ensenan/1680a52d53' }, { name: 'Cambridge English: Uren begeleid leren', url: 'https://support.cambridgeenglish.org/hc/en-gb/articles/202838506-Guided-learning-hours' }],
20
+ howToName: 'Een taalstudieplan maken', howTo: [{ name: 'Kies je talen', text: 'Selecteer de taal die je al gemakkelijk gebruikt en de taal die je wilt leren.' }, { name: 'Stel de ERK voortgang in', text: 'Kies je huidige niveau en het niveau dat je wilt bereiken. Het doel moet boven je huidige niveau liggen.' }, { name: 'Houd een wekelijkse routine vrij', text: 'Stel een toekomstige doeldatum in en vul de uren in die je elke week realistisch kunt studeren.' }, { name: 'Bekijk en pas aan', text: 'Gebruik status, verdeling en mijlpalen als startplan en verander daarna de datum of wekelijkse tijd wanneer dat nodig is.' }],
21
+ });
@@ -0,0 +1,21 @@
1
+ import type { LanguagePlannerUI } from '../ui';
2
+ import { createPlannerLocale, makePlannerSeo } from './shared';
3
+
4
+ const ui: LanguagePlannerUI = {
5
+ plannerKicker: 'Plan nauki języka', plannerHeading: 'Zobacz swój kolejny cel językowy.', sourceLanguage: 'Język wyjściowy', targetLanguage: 'Język do nauki', currentLevel: 'Obecny poziom CEFR', targetLevel: 'Docelowy poziom CEFR', targetDate: 'Data docelowa', weeklyHours: 'Czas nauki tygodniowo', priority: 'Priorytet umiejętności', balanced: 'Równowaga', comprehension: 'Rozumienie', production: 'Mówienie i pisanie', planButton: 'Utwórz mój plan nauki', resetButton: 'Resetuj', presetsLabel: 'Zacznij od tempa', casualPreset: '30 min dziennie', steadyPreset: '5 godzin tygodniowo', sprintPreset: 'Sprint przed egzaminem', plannerNote: 'To szacunek planistyczny oparty na szerokich zakresach nauki prowadzonej. Narzędzie nie sprawdza poziomu i nie gwarantuje płynności.', resultTitle: 'Twój plan nauki', liveLabel: 'Na żywo', hoursRange: 'Szacowane potrzebne godziny', weeksAvailable: 'Tygodnie do wybranej daty', hoursAvailable: 'Godziny dostępne w tym tempie', recommendedTime: 'Sugerowany zakres tygodniowy', onTrack: 'Twój harmonogram obejmuje górny szacunek.', tight: 'Twój harmonogram obejmuje dolny szacunek. Zostaw czas na powtórki.', insufficient: 'Termin jest krótszy niż dolny szacunek. Dodaj czas albo przesuń datę.', statusLabel: 'Status planu', weeklyAllocation: 'Tygodniowy podział umiejętności', milestones: 'Kamienie milowe', skillListening: 'Słuchanie', skillSpeaking: 'Mówienie', skillReading: 'Czytanie', skillWriting: 'Pisanie', milestoneTarget: 'Osiągnij', milestoneWeek: 'około tygodnia', errorPrefix: 'Sprawdź dane', languageOptions: 'angielski|hiszpański|francuski|niemiecki|włoski|portugalski|japoński|koreański|chiński|arabski', emptyResultDescription: 'Wybierz tempo i datę, aby zobaczyć drogę od jednego poziomu do następnego.', guidedLearningDetail: 'zakres nauki prowadzonej', targetDateDetail: 'do daty docelowej', weeklyPaceDetail: 'przy wybranym tempie tygodniowym', recommendedRangeDetail: 'tygodniowo dla tego zakresu',
6
+ };
7
+
8
+ const faq = [
9
+ { question: 'Co oblicza planer nauki języka?', answer: 'Szacuje zakres godzin między obecnym i docelowym poziomem CEFR, porównuje go z liczbą tygodni i godzin dostępnych do wybranej daty oraz proponuje tygodniowy podział umiejętności.' },
10
+ { question: 'Czy podane godziny nauki są gwarancją?', answer: 'Nie. To szerokie zakresy planistyczne oparte na szacunkach nauki prowadzonej. Para języków, wcześniejsze doświadczenie, kontakt z językiem, jakość nauki i możliwości ćwiczeń mogą znacznie zmienić rzeczywisty wynik.' },
11
+ { question: 'Czym różni się rozumienie od produkcji?', answer: 'Rozumienie przeznacza więcej czasu na słuchanie i czytanie. Produkcja przeznacza więcej czasu na mówienie i pisanie. Równowaga dzieli czas równo między cztery umiejętności.' },
12
+ { question: 'Czy mogę użyć tego dla dowolnej pary języków?', answer: 'Możesz potraktować narzędzie jako punkt wyjścia dla dowolnej pary, ale szacunek nie uwzględnia odległości językowej ani złożoności pisma. Traktuj zakres jako ramę i koryguj go na podstawie postępów.' },
13
+ { question: 'Czy planer zapisuje moje wybory językowe?', answer: 'Planer działa w przeglądarce i nie wysyła danych na serwer. Ta strona nie wymaga konta ani logowania.' },
14
+ ];
15
+
16
+ export const content = createPlannerLocale({
17
+ slug: 'kalkulator-planu-nauki-jezyka', title: 'Kalkulator planu nauki języka', description: 'Oszacuj godziny nauki według CEFR, sprawdź termin i zamień tygodniowy czas na praktyczny plan nauki języka.', ui, faq,
18
+ seo: makePlannerSeo({ titles: ['Utwórz plan językowy dopasowany do terminu', 'Jak obliczany jest szacunek', 'Przeczytaj status planu przed decyzją', 'Traktuj liczbę jako punkt wyjścia'], paragraphs: ['Użyj kalkulatora, gdy masz jasny cel językowy, ale chcesz sprawdzić, czy termin jest realny. Wybierz obecny poziom CEFR, poziom docelowy, datę i tygodniowy czas, który naprawdę możesz chronić. Otrzymasz zakres obciążenia, sugerowane tempo tygodniowe oraz kamienie milowe do sprawdzania postępów.', 'Planer korzysta ze skumulowanych zakresów godzin nauki prowadzonej dla każdego poziomu CEFR. Odejmujemy zakres obecnego poziomu od zakresu poziomu docelowego, a następnie porównujemy godziny z pozostałymi tygodniami. W tym modelu przejście z A1 do B1 oznacza około 260 do 300 godzin nauki prowadzonej. Przy 5 godzinach tygodniowo wymaga to około 52 do 60 tygodni, bez uwzględnienia opuszczonych sesji i dodatkowych powtórek.', 'CEFR opisuje umiejętności, a nie gwarantowany harmonogram. Odległość językowa, wcześniejszy kontakt, jakość nauki i prawdziwa praktyka mogą wyraźnie zmienić tempo. Porównuj kamienie milowe z faktami: gdy postęp zwalnia, przesuń datę lub zmniejsz cel; gdy przyspiesza, przeznacz dodatkowy czas na rozmowę i powtórki.'], tableHeaders: ['Status', 'Znaczenie', 'Co zrobić'], tableRows: [['Na dobrej drodze', 'Dostępne godziny sięgają górnego szacunku.', 'Utrzymuj rutynę i traktuj kamienie milowe jako punkty kontroli.'], ['Napięty', 'Godziny sięgają dolnego, lecz nie górnego szacunku.', 'Potraktuj termin jako ambitny i zabezpiecz czas na powtórki.'], ['Niewystarczający', 'Dostępne godziny są poniżej dolnego szacunku.', 'Dodaj czas tygodniowo, przesuń datę albo wybierz bliższy cel.']] }),
19
+ bibliography: [{ name: 'Rada Europy: CEFR Companion Volume, wydanie hiszpańskie', url: 'https://rm.coe.int/marco-comun-europeo-de-referencia-para-las-lenguas-aprendizaje-ensenan/1680a52d53' }, { name: 'Cambridge English: Godziny nauki prowadzonej', url: 'https://support.cambridgeenglish.org/hc/en-gb/articles/202838506-Guided-learning-hours' }],
20
+ howToName: 'Utworzyć plan nauki języka', howTo: [{ name: 'Wybierz języki', text: 'Wybierz język, którego już swobodnie używasz, oraz język, którego chcesz się nauczyć.' }, { name: 'Ustaw postęp CEFR', text: 'Wybierz obecny poziom i poziom, który chcesz osiągnąć. Cel musi być wyższy od obecnego poziomu.' }, { name: 'Zabezpiecz tygodniową rutynę', text: 'Ustaw przyszłą datę docelową i wpisz liczbę godzin, które realnie możesz przeznaczyć na naukę co tydzień.' }, { name: 'Sprawdzaj i dostosowuj', text: 'Wykorzystaj status, podział umiejętności i kamienie milowe jako plan startowy, a potem zmieniaj datę lub czas tygodniowy.' }],
21
+ });
@@ -0,0 +1,21 @@
1
+ import type { LanguagePlannerUI } from '../ui';
2
+ import { createPlannerLocale, makePlannerSeo } from './shared';
3
+
4
+ const ui: LanguagePlannerUI = {
5
+ plannerKicker: 'Planejador de aprendizagem de idiomas', plannerHeading: 'Torne visível sua próxima meta linguística.', sourceLanguage: 'Idioma de partida', targetLanguage: 'Idioma que você quer aprender', currentLevel: 'Nível CEFR atual', targetLevel: 'Nível CEFR desejado', targetDate: 'Data alvo', weeklyHours: 'Tempo de estudo por semana', priority: 'Prioridade de habilidades', balanced: 'Equilibrado', comprehension: 'Compreensão', production: 'Fala e escrita', planButton: 'Criar meu plano de estudo', resetButton: 'Redefinir', presetsLabel: 'Comece com um ritmo', casualPreset: '30 min por dia', steadyPreset: '5 horas por semana', sprintPreset: 'Sprint para exame', plannerNote: 'Esta é uma estimativa de planejamento baseada em faixas amplas de aprendizagem orientada. Ela não testa seu nível nem garante fluência.', resultTitle: 'Seu plano de estudo', liveLabel: 'Ao vivo', hoursRange: 'Horas estimadas necessárias', weeksAvailable: 'Semanas até sua data', hoursAvailable: 'Horas disponíveis nesse ritmo', recommendedTime: 'Faixa semanal sugerida', onTrack: 'Seu cronograma cobre a estimativa superior.', tight: 'Seu cronograma cobre a estimativa inferior. Reserve tempo para revisão.', insufficient: 'Seu prazo é menor que a estimativa inferior. Acrescente tempo ou adie a data.', statusLabel: 'Status do plano', weeklyAllocation: 'Divisão semanal por habilidade', milestones: 'Marcos', skillListening: 'Compreensão oral', skillSpeaking: 'Fala', skillReading: 'Leitura', skillWriting: 'Escrita', milestoneTarget: 'Alcançar', milestoneWeek: 'por volta da semana', errorPrefix: 'Confira seus dados', languageOptions: 'inglês|espanhol|francês|alemão|italiano|português|japonês|coreano|chinês|árabe', emptyResultDescription: 'Escolha um ritmo e uma data para ver seu caminho de um nível ao próximo.', guidedLearningDetail: 'faixa de aprendizagem orientada', targetDateDetail: 'até sua data alvo', weeklyPaceDetail: 'no ritmo semanal escolhido', recommendedRangeDetail: 'por semana para esta faixa',
6
+ };
7
+
8
+ const faq = [
9
+ { question: 'O que o planejador de aprendizagem de idiomas calcula?', answer: 'Ele estima uma faixa de horas entre seus níveis CEFR atual e desejado, compara essa faixa com as semanas e horas disponíveis até sua data e sugere uma divisão semanal por habilidade.' },
10
+ { question: 'As horas de estudo são uma garantia?', answer: 'Não. São faixas amplas de planejamento baseadas em estimativas de aprendizagem orientada. O par de idiomas, a experiência anterior, a exposição, a qualidade do estudo e as oportunidades de prática podem mudar bastante o resultado real.' },
11
+ { question: 'Qual é a diferença entre compreensão e produção?', answer: 'Compreensão coloca mais tempo em ouvir e ler. Produção coloca mais tempo em falar e escrever. Equilibrado divide o tempo igualmente entre as quatro habilidades.' },
12
+ { question: 'Posso usar isto para qualquer par de idiomas?', answer: 'Você pode usar a ferramenta como ponto de partida para qualquer par, mas a estimativa não considera distância linguística nem complexidade da escrita. Trate a faixa como um limite de planejamento e revise com base no seu progresso.' },
13
+ { question: 'O planejador guarda minhas escolhas de idioma?', answer: 'Ele funciona no navegador e não envia suas entradas para um servidor. A página não exige conta nem login.' },
14
+ ];
15
+
16
+ export const content = createPlannerLocale({
17
+ slug: 'calculadora-plano-estudo-idiomas', title: 'Calculadora de plano de estudo de idiomas', description: 'Estime horas de estudo pelo CEFR, teste um prazo e transforme sua disponibilidade semanal em um plano prático de aprendizagem.', ui, faq,
18
+ seo: makePlannerSeo({ titles: ['Crie um plano de idiomas que caiba no seu prazo', 'Como a estimativa é calculada', 'Leia o status do plano antes de se comprometer', 'Use o número como ponto de partida'], paragraphs: ['Use esta calculadora quando tiver uma meta linguística clara, mas precisar saber se seu prazo é realista. Escolha o nível CEFR atual, o nível desejado, uma data e o tempo semanal que você realmente consegue proteger. Você receberá uma faixa de carga, um ritmo semanal sugerido e marcos para acompanhar seu progresso.', 'O planejador usa faixas cumulativas de horas de aprendizagem orientada para cada nível CEFR. Ele subtrai a faixa do nível atual da faixa do nível desejado e compara essas horas com as semanas restantes. Neste modelo, passar de A1 para B1 representa aproximadamente 260 a 300 horas orientadas. Com 5 horas por semana, essa carga exige cerca de 52 a 60 semanas, antes de considerar sessões perdidas ou revisão extra.', 'O CEFR descreve capacidades, não um calendário garantido. A distância entre idiomas, a exposição anterior, a qualidade do estudo e a prática real podem mudar bastante o ritmo. Compare os marcos com evidências reais: se o progresso for mais lento, adie a data ou reduza a meta; se for mais rápido, use o tempo extra para conversação e revisão.'], tableHeaders: ['Status', 'O que significa', 'O que fazer'], tableRows: [['No ritmo', 'Suas horas disponíveis alcançam a estimativa superior.', 'Mantenha a rotina e use os marcos como pontos de controle.'], ['Apertado', 'Suas horas alcançam a estimativa inferior, mas não a superior.', 'Trate a data como ambiciosa e proteja tempo para revisão.'], ['Insuficiente', 'Suas horas disponíveis ficam abaixo da estimativa inferior.', 'Acrescente tempo semanal, adie a data ou escolha uma meta mais próxima.']] }),
19
+ bibliography: [{ name: 'Conselho da Europa: Volume complementar do CEFR, edição em espanhol', url: 'https://rm.coe.int/marco-comun-europeo-de-referencia-para-las-lenguas-aprendizaje-ensenan/1680a52d53' }, { name: 'Cambridge English: Horas de aprendizagem orientada', url: 'https://support.cambridgeenglish.org/hc/en-gb/articles/202838506-Guided-learning-hours' }],
20
+ howToName: 'Criar um plano de estudo de idiomas', howTo: [{ name: 'Escolha seus idiomas', text: 'Selecione o idioma que você já usa com conforto e o idioma que quer aprender.' }, { name: 'Defina a progressão CEFR', text: 'Escolha seu nível atual e o nível que deseja alcançar. A meta deve estar acima do nível atual.' }, { name: 'Proteja uma rotina semanal', text: 'Defina uma data alvo futura e informe as horas que você consegue estudar de forma realista toda semana.' }, { name: 'Revise e adapte', text: 'Use o status, a divisão de habilidades e os marcos como plano inicial; depois ajuste a data ou o tempo semanal.' }],
21
+ });
@@ -0,0 +1,21 @@
1
+ import type { LanguagePlannerUI } from '../ui';
2
+ import { createPlannerLocale, makePlannerSeo } from './shared';
3
+
4
+ const ui: LanguagePlannerUI = {
5
+ plannerKicker: 'Планировщик изучения языка', plannerHeading: 'Сделайте следующую языковую цель наглядной.', sourceLanguage: 'Исходный язык', targetLanguage: 'Язык для изучения', currentLevel: 'Текущий уровень CEFR', targetLevel: 'Целевой уровень CEFR', targetDate: 'Целевая дата', weeklyHours: 'Время занятий в неделю', priority: 'Приоритет навыков', balanced: 'Баланс', comprehension: 'Понимание', production: 'Говорение и письмо', planButton: 'Составить мой план', resetButton: 'Сбросить', presetsLabel: 'Начните с темпа', casualPreset: '30 минут в день', steadyPreset: '5 часов в неделю', sprintPreset: 'Экзаменационный спринт', plannerNote: 'Это планировочная оценка на основе широких диапазонов управляемого обучения. Она не проверяет ваш уровень и не гарантирует свободное владение языком.', resultTitle: 'Ваш план обучения', liveLabel: 'Сейчас', hoursRange: 'Примерное необходимое время', weeksAvailable: 'Недель до выбранной даты', hoursAvailable: 'Доступно часов при таком темпе', recommendedTime: 'Рекомендуемый диапазон в неделю', onTrack: 'Ваш график покрывает верхнюю оценку.', tight: 'Ваш график покрывает нижнюю оценку. Оставьте время на повторение.', insufficient: 'Ваш срок короче нижней оценки. Добавьте время или перенесите дату.', statusLabel: 'Статус плана', weeklyAllocation: 'Распределение навыков по неделе', milestones: 'Промежуточные цели', skillListening: 'Аудирование', skillSpeaking: 'Говорение', skillReading: 'Чтение', skillWriting: 'Письмо', milestoneTarget: 'Достичь', milestoneWeek: 'примерно на неделе', errorPrefix: 'Проверьте введённые данные', languageOptions: 'английский|испанский|французский|немецкий|итальянский|португальский|японский|корейский|китайский|арабский', emptyResultDescription: 'Выберите темп и дату, чтобы увидеть путь от одного уровня к следующему.', guidedLearningDetail: 'диапазон управляемого обучения', targetDateDetail: 'до целевой даты', weeklyPaceDetail: 'при выбранном темпе в неделю', recommendedRangeDetail: 'в неделю для этого диапазона',
6
+ };
7
+
8
+ const faq = [
9
+ { question: 'Что рассчитывает планировщик изучения языка?', answer: 'Он оценивает диапазон часов между текущим и целевым уровнями CEFR, сравнивает его с доступными неделями и часами до выбранной даты и предлагает распределение времени между навыками.' },
10
+ { question: 'Являются ли часы обучения гарантией?', answer: 'Нет. Это широкие диапазоны для планирования, основанные на оценках управляемого обучения. Языковая пара, прошлый опыт, окружение, качество занятий и возможности практики могут существенно изменить реальное время.' },
11
+ { question: 'Чем отличаются понимание и продукция?', answer: 'Понимание выделяет больше времени на аудирование и чтение. Продукция выделяет больше времени на говорение и письмо. Баланс распределяет время поровну между четырьмя навыками.' },
12
+ { question: 'Можно ли использовать планировщик для любой пары языков?', answer: 'Да, как отправную точку для любой пары, но оценка не учитывает языковую дистанцию и сложность письменности. Считайте диапазон рамкой для планирования и уточняйте его по собственному прогрессу.' },
13
+ { question: 'Сохраняет ли планировщик выбранные языки?', answer: 'Планировщик работает в браузере и не отправляет введённые данные на сервер. Для страницы не нужны учётная запись и вход.' },
14
+ ];
15
+
16
+ export const content = createPlannerLocale({
17
+ slug: 'kalkulyator-plana-izucheniya-yazyka', title: 'Калькулятор плана изучения языка', description: 'Оцените часы по CEFR, проверьте срок и превратите доступное время в неделю в практичный план изучения языка.', ui, faq,
18
+ seo: makePlannerSeo({ titles: ['Составьте план изучения языка под свой срок', 'Как рассчитывается оценка', 'Изучите статус плана до принятия решения', 'Используйте число как отправную точку'], paragraphs: ['Используйте этот калькулятор, если у вас есть конкретная языковая цель, но нужно понять, реалистичен ли срок. Выберите текущий уровень CEFR, целевой уровень, дату и количество часов в неделю, которое вы действительно можете выделить. Вы получите диапазон нагрузки, рекомендуемый темп и промежуточные цели для проверки прогресса.', 'Планировщик использует накопительные диапазоны часов управляемого обучения для каждого уровня CEFR. Он вычитает диапазон текущего уровня из диапазона целевого, а затем сравнивает часы с оставшимися неделями. В этой модели переход с A1 на B1 занимает примерно 260 до 300 часов управляемого обучения. При 5 часах в неделю это около 52 до 60 недель без учёта пропущенных занятий и дополнительного повторения.', 'CEFR описывает навыки, а не гарантированный календарь. Языковая дистанция, прежний опыт, качество занятий и реальная практика заметно влияют на темп. Сравнивайте промежуточные цели с фактами: при медленном прогрессе перенесите дату или снизьте цель, а при быстром используйте свободное время для разговоров и повторения.'], tableHeaders: ['Статус', 'Что это значит', 'Что делать'], tableRows: [['По плану', 'Доступные часы достигают верхней оценки.', 'Сохраняйте режим и используйте промежуточные цели как контрольные точки.'], ['Впритык', 'Часы достигают нижней, но не верхней оценки.', 'Считайте срок амбициозным и заранее оставьте время на повторение.'], ['Недостаточно', 'Доступные часы ниже нижней оценки.', 'Добавьте часы в неделю, перенесите дату или выберите более близкую цель.']] }),
19
+ bibliography: [{ name: 'Совет Европы: CEFR Companion Volume, испанское издание', url: 'https://rm.coe.int/marco-comun-europeo-de-referencia-para-las-lenguas-aprendizaje-ensenan/1680a52d53' }, { name: 'Cambridge English: часы управляемого обучения', url: 'https://support.cambridgeenglish.org/hc/en-gb/articles/202838506-Guided-learning-hours' }],
20
+ howToName: 'Составить план изучения языка', howTo: [{ name: 'Выберите языки', text: 'Выберите язык, которым уже уверенно пользуетесь, и язык, который хотите изучать.' }, { name: 'Задайте путь CEFR', text: 'Выберите текущий и желаемый уровни. Целевой уровень должен быть выше текущего.' }, { name: 'Закрепите недельный режим', text: 'Укажите будущую целевую дату и число часов, которые реально сможете заниматься каждую неделю.' }, { name: 'Проверяйте и меняйте', text: 'Используйте статус, распределение навыков и промежуточные цели как начальный план, затем меняйте дату или недельное время.' }],
21
+ });
@@ -0,0 +1,70 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { LanguagePlannerUI } from '../ui';
3
+
4
+ interface PlannerLocaleInput {
5
+ slug: string;
6
+ title: string;
7
+ description: string;
8
+ ui: LanguagePlannerUI;
9
+ seo: ToolLocaleContent['seo'];
10
+ faq: ToolLocaleContent['faq'];
11
+ bibliography: ToolLocaleContent['bibliography'];
12
+ howTo: ToolLocaleContent['howTo'];
13
+ howToName: string;
14
+ }
15
+
16
+ interface PlannerSeoInput {
17
+ titles: [string, string, string, string];
18
+ paragraphs: [string, string, string];
19
+ tableHeaders: [string, string, string];
20
+ tableRows: [string, string, string][];
21
+ }
22
+
23
+ export function makePlannerSeo(input: PlannerSeoInput): ToolLocaleContent['seo'] {
24
+ return [
25
+ { type: 'title', text: input.titles[0], level: 2 },
26
+ { type: 'paragraph', html: input.paragraphs[0] },
27
+ { type: 'title', text: input.titles[1], level: 2 },
28
+ { type: 'paragraph', html: input.paragraphs[1] },
29
+ { type: 'title', text: input.titles[2], level: 2 },
30
+ { type: 'table', headers: input.tableHeaders, rows: input.tableRows },
31
+ { type: 'title', text: input.titles[3], level: 2 },
32
+ { type: 'paragraph', html: input.paragraphs[2] },
33
+ ];
34
+ }
35
+
36
+ export function createPlannerLocale(input: PlannerLocaleInput): ToolLocaleContent<LanguagePlannerUI> {
37
+ return {
38
+ ...input,
39
+ schemas: [
40
+ {
41
+ '@context': 'https://schema.org',
42
+ '@type': 'SoftwareApplication',
43
+ name: input.title,
44
+ applicationCategory: 'EducationalApplication',
45
+ operatingSystem: 'Any',
46
+ isAccessibleForFree: true,
47
+ url: 'https://gamebob.dev/en/language-learning-study-plan-planner',
48
+ },
49
+ {
50
+ '@context': 'https://schema.org',
51
+ '@type': 'HowTo',
52
+ name: input.howToName,
53
+ step: input.howTo.map((step) => ({
54
+ '@type': 'HowToStep',
55
+ name: step.name,
56
+ text: step.text,
57
+ })),
58
+ },
59
+ {
60
+ '@context': 'https://schema.org',
61
+ '@type': 'FAQPage',
62
+ mainEntity: input.faq.map((item) => ({
63
+ '@type': 'Question',
64
+ name: item.question,
65
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
66
+ })),
67
+ },
68
+ ],
69
+ };
70
+ }
@@ -0,0 +1,21 @@
1
+ import type { LanguagePlannerUI } from '../ui';
2
+ import { createPlannerLocale, makePlannerSeo } from './shared';
3
+
4
+ const ui: LanguagePlannerUI = {
5
+ plannerKicker: 'Planerare för språkstudier', plannerHeading: 'Gör ditt nästa språkmål synligt.', sourceLanguage: 'Utgångsspråk', targetLanguage: 'Språk du vill lära dig', currentLevel: 'Nuvarande CEFR nivå', targetLevel: 'Önskad CEFR nivå', targetDate: 'Måldatum', weeklyHours: 'Studietid per vecka', priority: 'Prioritet för färdighet', balanced: 'Balanserad', comprehension: 'Förståelse', production: 'Tal och skrift', planButton: 'Skapa min studieplan', resetButton: 'Återställ', presetsLabel: 'Börja med ett tempo', casualPreset: '30 min om dagen', steadyPreset: '5 timmar i veckan', sprintPreset: 'Provsprint', plannerNote: 'Detta är en planeringsuppskattning baserad på breda intervall för handledt lärande. Den testar inte din nivå och garanterar inte flyt.', resultTitle: 'Din studieplan', liveLabel: 'Direkt', hoursRange: 'Beräknat antal timmar', weeksAvailable: 'Veckor till ditt datum', hoursAvailable: 'Tillgängliga timmar i detta tempo', recommendedTime: 'Föreslaget intervall per vecka', onTrack: 'Ditt schema täcker den högre uppskattningen.', tight: 'Ditt schema täcker den lägre uppskattningen. Avsätt tid för repetition.', insufficient: 'Din tidsfrist är kortare än den lägre uppskattningen. Lägg till tid eller flytta datumet.', statusLabel: 'Planens status', weeklyAllocation: 'Veckofördelning per färdighet', milestones: 'Milstolpar', skillListening: 'Hörförståelse', skillSpeaking: 'Tal', skillReading: 'Läsning', skillWriting: 'Skrift', milestoneTarget: 'Nå', milestoneWeek: 'ungefär vecka', errorPrefix: 'Kontrollera dina uppgifter', languageOptions: 'engelska|spanska|franska|tyska|italienska|portugisiska|japanska|koreanska|kinesiska|arabiska', emptyResultDescription: 'Välj ett tempo och ett datum för att se vägen från en nivå till nästa.', guidedLearningDetail: 'intervall för handledt lärande', targetDateDetail: 'fram till ditt måldatum', weeklyPaceDetail: 'i ditt valda veckotempo', recommendedRangeDetail: 'per vecka för detta intervall',
6
+ };
7
+
8
+ const faq = [
9
+ { question: 'Vad beräknar planeraren för språkstudier?', answer: 'Den uppskattar ett timintervall mellan din nuvarande och önskade CEFR nivå, jämför intervallet med veckorna och timmarna före ditt datum och föreslår en veckofördelning mellan färdigheter.' },
10
+ { question: 'Är studietimmarna en garanti?', answer: 'Nej. Det är breda planeringsintervall baserade på uppskattningar för handledt lärande. Språkparet, tidigare erfarenhet, exponering, studiekvalitet och möjligheter att öva kan ändra den verkliga tiden mycket.' },
11
+ { question: 'Vad är skillnaden mellan förståelse och produktion?', answer: 'Förståelse lägger mer av veckan på att lyssna och läsa. Produktion lägger mer på att tala och skriva. Balanserad delar tiden lika mellan de fyra färdigheterna.' },
12
+ { question: 'Kan jag använda den för vilket språkpar som helst?', answer: 'Du kan använda den som utgångspunkt för vilket språkpar som helst, men uppskattningen modellerar inte språkligt avstånd eller skriftsystem. Se intervallet som en planeringsram och justera utifrån dina framsteg.' },
13
+ { question: 'Sparar planeraren mina språkval?', answer: 'Planeraren körs i webbläsaren och skickar inte dina uppgifter till en server. Sidan kräver varken konto eller inloggning.' },
14
+ ];
15
+
16
+ export const content = createPlannerLocale({
17
+ slug: 'kalkylator-sprakstudieplan', title: 'Kalkylator för språkstudieplan', description: 'Uppskatta CEFR studietimmar, testa en tidsfrist och gör din tid per vecka till en praktisk plan för språkinlärning.', ui, faq,
18
+ seo: makePlannerSeo({ titles: ['Skapa en språkstudieplan som passar din tidsfrist', 'Så beräknas uppskattningen', 'Läs planens status innan du bestämmer dig', 'Använd siffran som utgångspunkt'], paragraphs: ['Använd kalkylatorn när du har ett tydligt språkmål men behöver veta om tidsfristen är realistisk. Välj nuvarande CEFR nivå, önskad nivå, ett datum och den veckotid du verkligen kan skydda. Du får ett arbetsintervall, ett föreslaget veckotempo och milstolpar som du kan följa under vägen.', 'Planeraren använder kumulativa timintervall för handledt lärande på varje CEFR nivå. Den drar av intervallet för din nuvarande nivå från intervallet för målnivån och jämför timmarna med veckorna som återstår. I denna modell motsvarar steget från A1 till B1 ungefär 260 till 300 handledda timmar. Med 5 timmar i veckan kräver det cirka 52 till 60 veckor, innan missade pass eller extra repetition räknas med.', 'CEFR beskriver färdigheter, inte ett garanterat schema. Språkligt avstånd, tidigare exponering, studiekvalitet och verklig övning kan ändra tempot betydligt. Jämför milstolparna med verkliga resultat: flytta datumet eller sänk målet om framstegen går långsammare; använd extra tid till samtal och repetition om det går snabbare.'], tableHeaders: ['Status', 'Vad det betyder', 'Vad du kan göra'], tableRows: [['I fas', 'Dina tillgängliga timmar når den högre uppskattningen.', 'Behåll rutinen och använd milstolparna som kontrollpunkter.'], ['Tajt', 'Timmarna når den lägre men inte den högre uppskattningen.', 'Se datumet som ambitiöst och skydda tid för repetition.'], ['Otillräckligt', 'Dina tillgängliga timmar ligger under den lägre uppskattningen.', 'Lägg till tid varje vecka, flytta datumet eller välj ett närmare mål.']] }),
19
+ bibliography: [{ name: 'Europarådet: CEFR Companion Volume, spansk utgåva', url: 'https://rm.coe.int/marco-comun-europeo-de-referencia-para-las-lenguas-aprendizaje-ensenan/1680a52d53' }, { name: 'Cambridge English: Timmar för handledt lärande', url: 'https://support.cambridgeenglish.org/hc/en-gb/articles/202838506-Guided-learning-hours' }],
20
+ howToName: 'Skapa en språkstudieplan', howTo: [{ name: 'Välj dina språk', text: 'Välj språket du redan använder bekvämt och språket du vill lära dig.' }, { name: 'Ställ in CEFR utvecklingen', text: 'Välj din nuvarande nivå och nivån du vill nå. Målet måste ligga över den nuvarande nivån.' }, { name: 'Skydda en veckorutin', text: 'Ange ett framtida måldatum och skriv in hur många timmar du realistiskt kan studera varje vecka.' }, { name: 'Granska och anpassa', text: 'Använd status, färdighetsfördelning och milstolpar som startplan och ändra sedan datum eller veckotid vid behov.' }],
21
+ });
@@ -0,0 +1,21 @@
1
+ import type { LanguagePlannerUI } from '../ui';
2
+ import { createPlannerLocale, makePlannerSeo } from './shared';
3
+
4
+ const ui: LanguagePlannerUI = {
5
+ plannerKicker: 'Dil öğrenme planlayıcısı', plannerHeading: 'Bir sonraki dil hedefini görünür kıl.', sourceLanguage: 'Başlangıç dili', targetLanguage: 'Öğrenmek istediğin dil', currentLevel: 'Mevcut CEFR seviyesi', targetLevel: 'Hedef CEFR seviyesi', targetDate: 'Hedef tarih', weeklyHours: 'Haftalık çalışma süresi', priority: 'Beceri önceliği', balanced: 'Dengeli', comprehension: 'Anlama', production: 'Konuşma ve yazma', planButton: 'Çalışma planımı oluştur', resetButton: 'Sıfırla', presetsLabel: 'Bir tempoyla başla', casualPreset: 'Günde 30 dakika', steadyPreset: 'Haftada 5 saat', sprintPreset: 'Sınav sprinti', plannerNote: 'Bu, rehberli öğrenme için geniş aralıklara dayanan bir planlama tahminidir. Seviyeni test etmez ve akıcılığı garanti etmez.', resultTitle: 'Çalışma planın', liveLabel: 'Canlı', hoursRange: 'Tahmini gerekli saat', weeksAvailable: 'Tarihine kadar kalan hafta', hoursAvailable: 'Bu tempoda kullanılabilir saat', recommendedTime: 'Önerilen haftalık aralık', onTrack: 'Programın üst tahmini karşılıyor.', tight: 'Programın alt tahmini karşılıyor. Tekrar için zaman bırak.', insufficient: 'Son tarihin alt tahminden daha sıkı. Zaman ekle veya tarihi değiştir.', statusLabel: 'Plan durumu', weeklyAllocation: 'Haftalık beceri dağılımı', milestones: 'Kilometre taşları', skillListening: 'Dinleme', skillSpeaking: 'Konuşma', skillReading: 'Okuma', skillWriting: 'Yazma', milestoneTarget: 'Ulaş', milestoneWeek: 'yaklaşık hafta', errorPrefix: 'Girdilerini kontrol et', languageOptions: 'İngilizce|İspanyolca|Fransızca|Almanca|İtalyanca|Portekizce|Japonca|Korece|Çince|Arapça', emptyResultDescription: 'Bir tempo ve tarih seçerek bir seviyeden diğerine giden yolu gör.', guidedLearningDetail: 'rehberli öğrenme aralığı', targetDateDetail: 'hedef tarihine kadar', weeklyPaceDetail: 'seçtiğin haftalık tempoda', recommendedRangeDetail: 'bu aralık için haftada',
6
+ };
7
+
8
+ const faq = [
9
+ { question: 'Dil öğrenme planlayıcısı neyi hesaplar?', answer: 'Mevcut ve hedef CEFR seviyelerin arasındaki saat aralığını tahmin eder, bunu tarihine kadar kalan hafta ve saatlerle karşılaştırır ve haftalık beceri dağılımı önerir.' },
10
+ { question: 'Çalışma saatleri garanti midir?', answer: 'Hayır. Bunlar rehberli öğrenme tahminlerine dayanan geniş planlama aralıklarıdır. Dil çifti, önceki deneyim, maruz kalma, çalışma kalitesi ve pratik fırsatları gerçek süreyi büyük ölçüde değiştirebilir.' },
11
+ { question: 'Anlama ve üretim öncelikleri arasındaki fark nedir?', answer: 'Anlama, haftanın daha büyük bölümünü dinleme ve okumaya ayırır. Üretim, konuşma ve yazmaya daha fazla zaman verir. Dengeli seçenek dört beceriye eşit zaman ayırır.' },
12
+ { question: 'Bunu her dil çifti için kullanabilir miyim?', answer: 'Her dil çifti için başlangıç noktası olarak kullanabilirsin, ancak tahmin dil uzaklığını veya yazı sistemi karmaşıklığını modellemez. Aralığı bir planlama çerçevesi olarak gör ve ilerlemene göre düzenle.' },
13
+ { question: 'Planlayıcı dil seçimlerimi kaydeder mi?', answer: 'Planlayıcı tarayıcında çalışır ve girdilerini bir sunucuya göndermez. Bu sayfa hesap veya giriş gerektirmez.' },
14
+ ];
15
+
16
+ export const content = createPlannerLocale({
17
+ slug: 'dil-calisma-plani-hesaplayici', title: 'Dil Çalışma Planı Hesaplayıcı', description: 'CEFR çalışma saatlerini tahmin et, bir son tarihi dene ve haftalık vaktini pratik bir dil öğrenme planına dönüştür.', ui, faq,
18
+ seo: makePlannerSeo({ titles: ['Son tarihine uyan bir dil çalışma planı oluştur', 'Tahmin nasıl hesaplanır', 'Karar vermeden önce plan durumunu oku', 'Sayıyı başlangıç noktası olarak kullan'], paragraphs: ['Bu hesaplayıcıyı net bir dil hedefin olduğunda ancak son tarihin gerçekçi olup olmadığını bilmek istediğinde kullan. Mevcut CEFR seviyeni, hedef seviyeni, tarihi ve gerçekten ayırabileceğin haftalık zamanı seç. Bir çalışma aralığı, önerilen haftalık tempo ve ilerlemeni kontrol edebileceğin kilometre taşları alırsın.', 'Planlayıcı her CEFR seviyesi için kümülatif rehberli öğrenme saat aralıkları kullanır. Mevcut seviyenin aralığını hedef seviyenin aralığından çıkarır ve sonucu kalan haftalarla karşılaştırır. Bu modelde A1 den B1 e geçiş yaklaşık 260 ila 300 rehberli saat anlamına gelir. Haftada 5 saatle bu yük, kaçırılan oturumlar veya ek tekrarlar hesaba katılmadan yaklaşık 52 ila 60 hafta sürer.', 'CEFR becerileri tanımlar, garanti edilmiş bir takvim vermez. Diller arasındaki uzaklık, önceki maruz kalma, çalışma kalitesi ve gerçek pratik tempoyu önemli ölçüde değiştirebilir. Kilometre taşlarını gerçek kanıtlarla karşılaştır: yavaş ilerliyorsan tarihi değiştir veya hedefi düşür; hızlı ilerliyorsan ek zamanı konuşma ve tekrara ayır.'], tableHeaders: ['Durum', 'Anlamı', 'Ne yapmalı'], tableRows: [['Yolunda', 'Kullanılabilir saatlerin üst tahmine ulaşıyor.', 'Rutini koru ve kilometre taşlarını kontrol noktası olarak kullan.'], ['Sıkı', 'Saatlerin alt tahmine ulaşıyor ancak üst tahmine ulaşmıyor.', 'Tarihi iddialı kabul et ve tekrar için zaman ayır.'], ['Yetersiz', 'Kullanılabilir saatlerin alt tahminin altında kalıyor.', 'Haftalık zaman ekle, tarihi değiştir veya daha yakın bir hedef seç.']] }),
19
+ bibliography: [{ name: 'Avrupa Konseyi: CEFR Companion Volume, İspanyolca baskı', url: 'https://rm.coe.int/marco-comun-europeo-de-referencia-para-las-lenguas-aprendizaje-ensenan/1680a52d53' }, { name: 'Cambridge English: Rehberli öğrenme saatleri', url: 'https://support.cambridgeenglish.org/hc/en-gb/articles/202838506-Guided-learning-hours' }],
20
+ howToName: 'Dil çalışma planı oluşturmak', howTo: [{ name: 'Dillerini seç', text: 'Rahatça kullandığın dili ve öğrenmek istediğin dili seç.' }, { name: 'CEFR ilerlemesini ayarla', text: 'Mevcut seviyeni ve ulaşmak istediğin seviyeyi seç. Hedef mevcut seviyenin üzerinde olmalı.' }, { name: 'Haftalık rutine zaman ayır', text: 'Gelecekteki bir hedef tarihi belirle ve her hafta gerçekçi biçimde çalışabileceğin saatleri gir.' }, { name: 'Gözden geçir ve uyarla', text: 'Durumu, beceri dağılımını ve kilometre taşlarını başlangıç planı olarak kullan; sonra tarihi veya haftalık zamanı düzenle.' }],
21
+ });
@@ -0,0 +1,21 @@
1
+ import type { LanguagePlannerUI } from '../ui';
2
+ import { createPlannerLocale, makePlannerSeo } from './shared';
3
+
4
+ const ui: LanguagePlannerUI = {
5
+ plannerKicker: '语言学习计划工具', plannerHeading: '让下一个语言目标清晰可见。', sourceLanguage: '起始语言', targetLanguage: '想学习的语言', currentLevel: '当前 CEFR 等级', targetLevel: '目标 CEFR 等级', targetDate: '目标日期', weeklyHours: '每周学习时间', priority: '技能重点', balanced: '均衡', comprehension: '理解能力', production: '口语和写作', planButton: '生成我的学习计划', resetButton: '重置', presetsLabel: '选择节奏开始', casualPreset: '每天 30 分钟', steadyPreset: '每周 5 小时', sprintPreset: '考试冲刺', plannerNote: '这是根据宽泛的指导学习时间范围得出的计划估算,不会测试你的水平,也不保证达到流利程度。', resultTitle: '你的学习计划', liveLabel: '实时', hoursRange: '预计所需小时数', weeksAvailable: '距离目标日期的周数', hoursAvailable: '按此节奏可用的小时数', recommendedTime: '建议每周范围', onTrack: '你的时间安排覆盖了较高估算。', tight: '你的时间安排覆盖了较低估算,请留出复习时间。', insufficient: '你的期限短于较低估算,请增加时间或推迟日期。', statusLabel: '计划状态', weeklyAllocation: '每周技能分配', milestones: '阶段目标', skillListening: '听力', skillSpeaking: '口语', skillReading: '阅读', skillWriting: '写作', milestoneTarget: '达到', milestoneWeek: '大约第几周', errorPrefix: '请检查输入', languageOptions: '英语|西班牙语|法语|德语|意大利语|葡萄牙语|日语|韩语|中文|阿拉伯语', emptyResultDescription: '选择节奏和日期,查看从一个等级到下一个等级的学习路径。', guidedLearningDetail: '指导学习范围', targetDateDetail: '直到目标日期', weeklyPaceDetail: '按你选择的每周节奏', recommendedRangeDetail: '此范围每周需要',
6
+ };
7
+
8
+ const faq = [
9
+ { question: '语言学习计划工具会计算什么?', answer: '它会估算当前 CEFR 等级到目标等级所需的小时范围,将其与目标日期前可用的周数和小时数进行比较,并建议每周的技能分配。' },
10
+ { question: '学习小时数是保证吗?', answer: '不是。这些是根据指导学习估算得出的宽泛计划范围。语言组合、既往经验、接触程度、学习质量和练习机会都可能显著改变实际所需时间。' },
11
+ { question: '理解和输出重点有什么区别?', answer: '理解模式会把更多时间放在听力和阅读上。输出模式会把更多时间放在口语和写作上。均衡模式会在四项技能之间平均分配时间。' },
12
+ { question: '可以用于任意语言组合吗?', answer: '可以把它作为任意语言组合的起点,但估算不会考虑语言距离或文字系统的复杂度。请把范围当作规划边界,并根据自己的进步进行修正。' },
13
+ { question: '工具会保存我选择的语言吗?', answer: '工具在浏览器中运行,不会把输入发送到服务器。当前页面不需要账号或登录。' },
14
+ ];
15
+
16
+ export const content = createPlannerLocale({
17
+ slug: 'language-learning-study-plan-planner', title: '语言学习计划计算器', description: '估算 CEFR 学习时间,检验目标期限,并将每周可用时间转化为实用的语言学习计划。', ui, faq,
18
+ seo: makePlannerSeo({ titles: ['制定符合期限的语言学习计划', '估算是如何计算的', '做决定前先查看计划状态', '把数字当作起点'], paragraphs: ['当你有明确的语言目标,却需要确认目标日期是否现实,可以使用这个计算器。选择当前 CEFR 等级、目标等级、日期以及每周真正能够保证的学习时间。你会看到所需时间范围、建议的每周节奏和用于检查进度的阶段目标。', '工具为每个 CEFR 等级使用累计的指导学习小时范围。它会用目标等级的范围减去当前等级的范围,再将结果与剩余周数比较。在这个模型中,从 A1 提升到 B1 大约需要 260 到 300 个指导学习小时。每周学习 5 小时,需要约 52 到 60 周,这还没有计算缺席和额外复习。', 'CEFR 描述的是能力,而不是保证的日程。语言之间的距离、过去的接触、学习质量和真实使用都会明显影响学习速度。请把阶段目标与实际结果比较:如果进步较慢,就推迟日期或降低目标;如果进步较快,就把额外时间用于对话和复习。'], tableHeaders: ['状态', '含义', '建议'], tableRows: [['按计划', '可用小时数达到较高估算。', '保持习惯,并把阶段目标作为检查点。'], ['紧张', '可用小时数达到较低估算,但没有达到较高估算。', '把日期视为有挑战的目标,并保护复习时间。'], ['不足', '可用小时数低于较低估算。', '增加每周时间、推迟日期,或选择更近的目标。']] }),
19
+ bibliography: [{ name: '欧洲委员会:CEFR Companion Volume 西班牙语版', url: 'https://rm.coe.int/marco-comun-europeo-de-referencia-para-las-lenguas-aprendizaje-ensenan/1680a52d53' }, { name: 'Cambridge English:指导学习小时数', url: 'https://support.cambridgeenglish.org/hc/en-gb/articles/202838506-Guided-learning-hours' }],
20
+ howToName: '制定语言学习计划', howTo: [{ name: '选择语言', text: '选择你已经能够熟练使用的语言,以及你想学习的语言。' }, { name: '设置 CEFR 进度', text: '选择当前等级和想要达到的等级。目标必须高于当前等级。' }, { name: '固定每周习惯', text: '设置未来的目标日期,并输入每周现实可行的学习小时数。' }, { name: '检查并调整', text: '把状态、技能分配和阶段目标作为起始计划,然后根据学习情况调整日期或每周时间。' }],
21
+ });
@@ -0,0 +1,4 @@
1
+ export { languageLearningStudyPlanPlanner, LANGUAGE_LEARNING_STUDY_PLAN_PLANNER_TOOL } from './entry';
2
+ export type { LanguagePlannerUI, LanguageLearningStudyPlanPlannerLocaleContent } from './entry';
3
+ export { calculateStudyPlan, GUIDED_HOURS_FROM_BEGINNER, LEVEL_LABELS, PRIORITY_ALLOCATIONS, STUDY_LEVELS } from './logic';
4
+ export type { LanguagePlannerInputs, PlanStatus, SkillAllocation, StudyLevel, StudyMilestone, StudyPlan } from './types';