feat(seo): enhance multilingual support and SEO handling
All checks were successful
Deploy to production / deploy (push) Successful in 2m46s

- Added support for multiple languages in the frontend, including English, Spanish, and Cebuano, improving accessibility for a broader audience.
- Implemented hreflang links for better SEO performance, ensuring search engines can correctly index language-specific content.
- Updated SEO metadata handling to utilize internationalization keys, enhancing the clarity and relevance of page titles and descriptions.
- Refactored SEO utility functions to streamline the management of OpenGraph and hreflang attributes, improving maintainability and performance.
This commit is contained in:
Torsten Schulz (local)
2026-04-07 15:43:16 +02:00
parent ebb2283646
commit c5b8860605
13 changed files with 542 additions and 98 deletions

View File

@@ -1,7 +1,6 @@
const BlogListView = () => import('@/views/blog/BlogListView.vue');
const BlogView = () => import('@/views/blog/BlogView.vue');
const BlogEditorView = () => import('@/views/blog/BlogEditorView.vue');
import { buildAbsoluteUrl } from '@/utils/seo.js';
export default [
{ path: '/blogs/create', name: 'BlogCreate', component: BlogEditorView, meta: { requiresAuth: true } },
@@ -14,8 +13,7 @@ export default [
props: route => ({ slug: route.params.slug }),
meta: {
seo: {
title: 'Blogs auf YourPart',
description: 'Öffentliche Blogs, Beiträge und Community-Inhalte auf YourPart.',
i18nKey: 'blogPage',
},
},
},
@@ -27,8 +25,7 @@ export default [
props: true,
meta: {
seo: {
title: 'Blogs auf YourPart',
description: 'Öffentliche Blogs, Beiträge und Community-Inhalte auf YourPart.',
i18nKey: 'blogPage',
},
},
},
@@ -38,20 +35,8 @@ export default [
component: BlogListView,
meta: {
seo: {
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.',
keywords: 'Blogs, Community Blog, Artikel, Beiträge, YourPart',
i18nKey: 'blogList',
canonicalPath: '/blogs',
jsonLd: [
{
'@context': 'https://schema.org',
'@type': 'CollectionPage',
name: 'Blogs auf YourPart',
url: buildAbsoluteUrl('/blogs'),
description: 'Öffentliche Blogs und Community-Beiträge auf YourPart.',
inLanguage: 'de',
},
],
},
},
},

View File

@@ -9,7 +9,7 @@ import blogRoutes from './blogRoutes';
import minigamesRoutes from './minigamesRoutes';
import personalRoutes from './personalRoutes';
import marketingRoutes from './marketingRoutes';
import { applyRouteSeo, buildAbsoluteUrl } from '../utils/seo';
import { applyRouteSeo } from '../utils/seo';
import apiClient from '../utils/axios';
const HomeView = () => import('../views/HomeView.vue');
@@ -21,25 +21,8 @@ const routes = [
component: HomeView,
meta: {
seo: {
title: 'YourPart - Community, Chat, Forum, Blogs, Vokabeltrainer und Spiele',
description: 'YourPart ist eine Community-Plattform mit Chat, Forum, Blogs, Vokabeltrainer, dem Browser-Aufbauspiel Falukant und Minispielen.',
keywords: 'YourPart, Community, Chat, Forum, Blogs, Vokabeltrainer, Browsergame, Falukant, Minispiele',
i18nKey: 'home',
canonicalPath: '/',
jsonLd: [
{
'@context': 'https://schema.org',
'@type': 'WebSite',
name: 'YourPart',
url: buildAbsoluteUrl('/'),
inLanguage: 'de',
description: 'Community-Plattform mit Chat, Forum, Blogs, Vokabeltrainer, Falukant und Browser-Minispielen.',
potentialAction: {
'@type': 'SearchAction',
target: `${buildAbsoluteUrl('/blogs')}?q={search_term_string}`,
'query-input': 'required name=search_term_string',
},
},
],
},
},
},

View File

@@ -1,5 +1,3 @@
import { buildAbsoluteUrl } from '../utils/seo';
const FalukantLandingView = () => import('../views/public/FalukantLandingView.vue');
const MinigamesLandingView = () => import('../views/public/MinigamesLandingView.vue');
const VocabLandingView = () => import('../views/public/VocabLandingView.vue');
@@ -11,26 +9,8 @@ const marketingRoutes = [
component: FalukantLandingView,
meta: {
seo: {
title: 'Falukant - Mittelalterliches Browser-Aufbauspiel auf YourPart',
description: 'Falukant ist das mittelalterliche Browser-Aufbauspiel auf YourPart mit Handel, Politik, Familie, Bildung und Charakterentwicklung.',
keywords: 'Falukant, Browsergame, Aufbauspiel, Mittelalterspiel, Wirtschaftsspiel, Politikspiel, YourPart',
i18nKey: 'falukant',
canonicalPath: '/falukant',
jsonLd: [
{
'@context': 'https://schema.org',
'@type': 'VideoGame',
name: 'Falukant',
url: buildAbsoluteUrl('/falukant'),
description: 'Mittelalterliches Browser-Aufbauspiel mit Handel, Politik, Familie und Charakterentwicklung.',
gamePlatform: 'Web Browser',
applicationCategory: 'Game',
inLanguage: 'de',
publisher: {
'@type': 'Organization',
name: 'YourPart',
},
},
],
},
},
},
@@ -40,20 +20,8 @@ const marketingRoutes = [
component: MinigamesLandingView,
meta: {
seo: {
title: 'Minispiele auf YourPart - Match 3 und Taxi im Browser',
description: 'Entdecke die Browser-Minispiele auf YourPart: Match 3 und Taxi bieten schnelle Spielrunden direkt auf der Plattform.',
keywords: 'Minispiele, Browsergames, Match 3, Taxi Spiel, Casual Games, YourPart',
i18nKey: 'minigames',
canonicalPath: '/minigames',
jsonLd: [
{
'@context': 'https://schema.org',
'@type': 'CollectionPage',
name: 'YourPart Minispiele',
url: buildAbsoluteUrl('/minigames'),
description: 'Browser-Minispiele auf YourPart mit Match 3 und Taxi.',
inLanguage: 'de',
},
],
},
},
},
@@ -63,22 +31,8 @@ const marketingRoutes = [
component: VocabLandingView,
meta: {
seo: {
title: 'Vokabeltrainer auf YourPart - Sprachen online lernen',
description: 'Der Vokabeltrainer auf YourPart unterstützt dich beim Sprachenlernen mit interaktiven Lektionen, Kursen und Übungen.',
keywords: 'Vokabeltrainer, Sprachen lernen, Online lernen, Sprachkurse, Übungen, YourPart',
i18nKey: 'vocab',
canonicalPath: '/vokabeltrainer',
jsonLd: [
{
'@context': 'https://schema.org',
'@type': 'SoftwareApplication',
name: 'YourPart Vokabeltrainer',
url: buildAbsoluteUrl('/vokabeltrainer'),
description: 'Interaktiver Vokabeltrainer mit Kursen, Lektionen und Übungen zum Sprachenlernen.',
applicationCategory: 'EducationalApplication',
operatingSystem: 'Web',
inLanguage: 'de',
},
],
},
},
},