Add full SEO optimization for Spanglish social and language events

- Add comprehensive metadata to root layout with Open Graph, Twitter cards
- Create dynamic sitemap.ts for all pages and events
- Create robots.ts with proper allow/disallow rules
- Add JSON-LD Event structured data to event detail pages
- Add page-specific metadata to events, community, contact, FAQ pages
- Add FAQ structured data schema
- Update footer with local SEO text for Asunción, Paraguay
- Add web manifest for mobile SEO
- Create 404 page with proper noindex
- Optimize image alt text and add lazy loading
- Add NEXT_PUBLIC_SITE_URL env variable
- Add about/ folder to gitignore
This commit is contained in:
root
2026-01-30 21:05:25 +00:00
parent d0ea55dc5b
commit 47ba754f05
40 changed files with 2659 additions and 420 deletions
+79 -7
View File
@@ -1,20 +1,91 @@
import type { Metadata } from 'next';
import type { Metadata, Viewport } from 'next';
import { Toaster } from 'react-hot-toast';
import { LanguageProvider } from '@/context/LanguageContext';
import { AuthProvider } from '@/context/AuthContext';
import PlausibleAnalytics from '@/components/PlausibleAnalytics';
import './globals.css';
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://spanglish.com.py';
export const metadata: Metadata = {
title: 'Spanglish - Language Exchange in Asunción',
description: 'Practice English and Spanish with native speakers at our language exchange events in Asunción, Paraguay.',
keywords: ['language exchange', 'Spanish', 'English', 'Asunción', 'Paraguay', 'intercambio de idiomas'],
metadataBase: new URL(siteUrl),
title: {
default: 'Spanglish Language Exchange Events in Asunción',
template: '%s Spanglish',
},
description: 'Practice English and Spanish at relaxed social events in Asunción. Meet locals and internationals. Join the next Spanglish meetup.',
keywords: [
'language exchange',
'Spanglish',
'Spanglish social',
'English Spanish meetup',
'language exchange Asunción',
'practice English Asunción',
'intercambio de idiomas',
'intercambio de idiomas Asunción',
'English Spanish Paraguay',
'language events Paraguay',
'Asunción',
'Paraguay',
],
authors: [{ name: 'Spanglish' }],
creator: 'Spanglish',
publisher: 'Spanglish',
formatDetection: {
email: false,
address: false,
telephone: false,
},
openGraph: {
title: 'Spanglish - Language Exchange in Asunción',
description: 'Practice English and Spanish with native speakers at our language exchange events.',
title: 'Spanglish Language Exchange Events in Asunción',
description: 'Practice English and Spanish at relaxed social events in Asunción. Meet locals and internationals. Join the next Spanglish meetup.',
url: siteUrl,
siteName: 'Spanglish',
type: 'website',
locale: 'en_US',
alternateLocale: 'es_ES',
alternateLocale: 'es_PY',
images: [
{
url: '/images/og-image.jpg',
width: 1200,
height: 630,
alt: 'Spanglish Language Exchange Events in Asunción, Paraguay',
},
],
},
twitter: {
card: 'summary_large_image',
title: 'Spanglish Language Exchange Events in Asunción',
description: 'Practice English and Spanish at relaxed social events in Asunción. Meet locals and internationals.',
images: ['/images/og-image.jpg'],
},
robots: {
index: true,
follow: true,
googleBot: {
index: true,
follow: true,
'max-video-preview': -1,
'max-image-preview': 'large',
'max-snippet': -1,
},
},
alternates: {
canonical: siteUrl,
languages: {
'en': siteUrl,
'es': `${siteUrl}/es`,
},
},
category: 'events',
manifest: '/manifest.json',
};
export const viewport: Viewport = {
themeColor: '#FFD700',
width: 'device-width',
initialScale: 1,
maximumScale: 5,
};
export default function RootLayout({
@@ -25,6 +96,7 @@ export default function RootLayout({
return (
<html lang="en">
<body>
<PlausibleAnalytics />
<AuthProvider>
<LanguageProvider>
{children}