From 71f2ee7c973f2faba2febc6de749fcba9dd7fa7d Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Mon, 20 Apr 2026 08:28:00 +0200 Subject: [PATCH] feat(seo, routing): add Bisaya learning and German for Bisaya courses - Introduced new routes for Bisaya learning and German for Bisaya courses, enhancing the marketing section of the application. - Updated sitemap.xml to include new course URLs for better SEO visibility. - Added localization entries for both courses in English and German, improving content accessibility for users. - Enhanced SEO metadata generation for the new courses, ensuring proper indexing and visibility in search engines. - Updated VocabLandingView to feature links to the new courses, improving user navigation and engagement. --- frontend/public/sitemap.xml | 10 + frontend/src/i18n/locales/de/seo.json | 14 ++ frontend/src/i18n/locales/en/seo.json | 14 ++ frontend/src/router/marketingRoutes.js | 24 +++ frontend/src/utils/seo.js | 36 ++++ .../public/BisayaLearningLandingView.vue | 179 ++++++++++++++++++ .../public/GermanForBisayaLandingView.vue | 169 +++++++++++++++++ .../src/views/public/VocabLandingView.vue | 46 +++++ 8 files changed, 492 insertions(+) create mode 100644 frontend/src/views/public/BisayaLearningLandingView.vue create mode 100644 frontend/src/views/public/GermanForBisayaLandingView.vue diff --git a/frontend/public/sitemap.xml b/frontend/public/sitemap.xml index b4fa7ef..7c0dcea 100644 --- a/frontend/public/sitemap.xml +++ b/frontend/public/sitemap.xml @@ -15,6 +15,16 @@ weekly 0.8 + + https://www.your-part.de/bisaya-lernen + weekly + 0.8 + + + https://www.your-part.de/deutsch-fuer-bisaya + weekly + 0.8 + https://www.your-part.de/falukant weekly diff --git a/frontend/src/i18n/locales/de/seo.json b/frontend/src/i18n/locales/de/seo.json index 43ceb2b..9218681 100644 --- a/frontend/src/i18n/locales/de/seo.json +++ b/frontend/src/i18n/locales/de/seo.json @@ -32,6 +32,20 @@ "jsonLdDescription": "Interaktiver Vokabeltrainer mit Kursen, Lektionen und Übungen zum Sprachenlernen.", "jsonLdName": "YourPart Vokabeltrainer" }, + "bisayaLearning": { + "title": "Bisaya lernen online - Cebuano fuer Anfaenger | YourPart", + "description": "Bisaya online lernen fuer deutschsprachige Anfaenger: Vokabeln, Satzmuster und Alltagssaetze fuer Familie, Reisen, Gesundheit und Gespraeche direkt im Browser ueben.", + "keywords": "Bisaya lernen, Cebuano lernen, Visaya lernen, Bisaya Vokabeln, Cebuano Anfaenger, Philippinen Sprache lernen, Bisaya Deutsch, Vokabeltrainer", + "jsonLdDescription": "Online-Kurs fuer deutschsprachige Anfaenger, die Bisaya/Cebuano mit Alltagssaetzen und Vokabeltraining lernen wollen.", + "jsonLdName": "Bisaya lernen fuer deutschsprachige Anfaenger" + }, + "germanForBisaya": { + "title": "Deutsch fuer Bisaya-Sprecher lernen - A1 Alltag online | YourPart", + "description": "Deutsch online ueben fuer Cebuano-/Bisaya-Sprecher: Grundwortschatz, A1-orientierte Alltagssaetze, Arzt, Arbeit, Schule, Termine und Formulare im Browser trainieren.", + "keywords": "Deutsch fuer Bisaya, Deutsch fuer Cebuano, Deutsch lernen A1, German for Bisaya speakers, Deutsch Vokabeltrainer, Deutsch online lernen", + "jsonLdDescription": "Online-Kurs fuer Cebuano-/Bisaya-Sprecher, die deutsche Alltagssaetze und Grundwortschatz ueben wollen.", + "jsonLdName": "Deutsch fuer Bisaya-Sprecher" + }, "blogList": { "title": "Blogs auf YourPart - Community-Beiträge und Themen", "description": "Entdecke öffentliche Blogs auf YourPart mit Community-Beiträgen, Gedanken, Erfahrungen und Themen aus verschiedenen Bereichen.", diff --git a/frontend/src/i18n/locales/en/seo.json b/frontend/src/i18n/locales/en/seo.json index 4f3f3ec..456dfd1 100644 --- a/frontend/src/i18n/locales/en/seo.json +++ b/frontend/src/i18n/locales/en/seo.json @@ -32,6 +32,20 @@ "jsonLdDescription": "Interactive vocabulary trainer with courses, lessons and exercises for language learning.", "jsonLdName": "YourPart vocabulary trainer" }, + "bisayaLearning": { + "title": "Learn Bisaya online - Cebuano for beginners | YourPart", + "description": "Learn Bisaya online for German-speaking beginners: vocabulary, sentence patterns and everyday phrases for family, travel, health and conversations in the browser.", + "keywords": "learn Bisaya, learn Cebuano, Visaya, Bisaya vocabulary, Cebuano beginner, Philippine language, Bisaya German, vocabulary trainer", + "jsonLdDescription": "Online course for German-speaking beginners who want to learn Bisaya/Cebuano with everyday phrases and vocabulary practice.", + "jsonLdName": "Learn Bisaya for German-speaking beginners" + }, + "germanForBisaya": { + "title": "Learn German for Bisaya speakers - A1 everyday German | YourPart", + "description": "Practice German online for Cebuano/Bisaya speakers: basic vocabulary, A1-oriented everyday sentences, doctor, work, school, appointments and forms in the browser.", + "keywords": "German for Bisaya, German for Cebuano, learn German A1, German vocabulary trainer, learn German online", + "jsonLdDescription": "Online course for Cebuano/Bisaya speakers who want to practice German everyday sentences and basic vocabulary.", + "jsonLdName": "German for Bisaya speakers" + }, "blogList": { "title": "Blogs on YourPart - community posts and topics", "description": "Explore public blogs on YourPart with community posts, ideas, experiences and topics from many areas.", diff --git a/frontend/src/router/marketingRoutes.js b/frontend/src/router/marketingRoutes.js index 03c5505..60eba0e 100644 --- a/frontend/src/router/marketingRoutes.js +++ b/frontend/src/router/marketingRoutes.js @@ -1,6 +1,8 @@ const FalukantLandingView = () => import('../views/public/FalukantLandingView.vue'); const MinigamesLandingView = () => import('../views/public/MinigamesLandingView.vue'); const VocabLandingView = () => import('../views/public/VocabLandingView.vue'); +const BisayaLearningLandingView = () => import('../views/public/BisayaLearningLandingView.vue'); +const GermanForBisayaLandingView = () => import('../views/public/GermanForBisayaLandingView.vue'); const marketingRoutes = [ { @@ -36,6 +38,28 @@ const marketingRoutes = [ }, }, }, + { + path: '/bisaya-lernen', + name: 'BisayaLearningLanding', + component: BisayaLearningLandingView, + meta: { + seo: { + i18nKey: 'bisayaLearning', + canonicalPath: '/bisaya-lernen', + }, + }, + }, + { + path: '/deutsch-fuer-bisaya', + name: 'GermanForBisayaLanding', + component: GermanForBisayaLandingView, + meta: { + seo: { + i18nKey: 'germanForBisaya', + canonicalPath: '/deutsch-fuer-bisaya', + }, + }, + }, ]; export default marketingRoutes; diff --git a/frontend/src/utils/seo.js b/frontend/src/utils/seo.js index a8646da..95c5531 100644 --- a/frontend/src/utils/seo.js +++ b/frontend/src/utils/seo.js @@ -219,6 +219,42 @@ export function buildRouteJsonLd(route, t, uiLocale) { ]; } + if (name === 'BisayaLearningLanding') { + return [ + { + '@context': 'https://schema.org', + '@type': 'Course', + name: t('seo.bisayaLearning.jsonLdName'), + url: buildAbsoluteUrl('/bisaya-lernen'), + description: t('seo.bisayaLearning.jsonLdDescription'), + inLanguage: lang, + provider: { + '@type': 'Organization', + name: DEFAULT_SITE_NAME, + sameAs: buildAbsoluteUrl('/'), + }, + }, + ]; + } + + if (name === 'GermanForBisayaLanding') { + return [ + { + '@context': 'https://schema.org', + '@type': 'Course', + name: t('seo.germanForBisaya.jsonLdName'), + url: buildAbsoluteUrl('/deutsch-fuer-bisaya'), + description: t('seo.germanForBisaya.jsonLdDescription'), + inLanguage: lang, + provider: { + '@type': 'Organization', + name: DEFAULT_SITE_NAME, + sameAs: buildAbsoluteUrl('/'), + }, + }, + ]; + } + if (name === 'BlogList') { return [ { diff --git a/frontend/src/views/public/BisayaLearningLandingView.vue b/frontend/src/views/public/BisayaLearningLandingView.vue new file mode 100644 index 0000000..e53dca2 --- /dev/null +++ b/frontend/src/views/public/BisayaLearningLandingView.vue @@ -0,0 +1,179 @@ + + + + + diff --git a/frontend/src/views/public/GermanForBisayaLandingView.vue b/frontend/src/views/public/GermanForBisayaLandingView.vue new file mode 100644 index 0000000..0697115 --- /dev/null +++ b/frontend/src/views/public/GermanForBisayaLandingView.vue @@ -0,0 +1,169 @@ + + + + + diff --git a/frontend/src/views/public/VocabLandingView.vue b/frontend/src/views/public/VocabLandingView.vue index bfc381c..eb218fa 100644 --- a/frontend/src/views/public/VocabLandingView.vue +++ b/frontend/src/views/public/VocabLandingView.vue @@ -23,6 +23,23 @@

{{ $t('home.vocabLanding.feature3Text') }}

+ + @@ -88,6 +105,13 @@ export default { margin-top: 28px; } +.course-links { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 18px; + margin-top: 28px; +} + .features article { padding: 24px; border-radius: var(--radius-lg); @@ -95,13 +119,35 @@ export default { border: 1px solid rgba(31, 47, 29, 0.08); } +.course-links article { + padding: 24px; + border-radius: 8px; + background: #fff; + border: 1px solid rgba(31, 47, 29, 0.12); +} + .features h2 { margin-top: 0; margin-bottom: 10px; } +.course-links h2 { + margin-top: 0; + margin-bottom: 10px; +} + .features p { margin: 0; line-height: 1.65; } + +.course-links p { + margin: 0 0 14px; + line-height: 1.65; +} + +.course-links a { + color: #244f2b; + font-weight: 700; +}