Migrate from Vite to Next.js 15 with SSR
- Replace Vite + React Router with Next.js 15 App Router - Implement i18n with next-intl (URL-based: /de, /en, /sr) - Add SSR/SSG for all pages (48 static pages generated) - Setup Supabase SSR client for auth - Migrate all pages: Home, About, Portfolio, Blog, Contact, Login, Dashboard, Imprint, Privacy, Terms - Add Docker support with standalone output - Replace i18next with next-intl JSON translations - Use next/image for optimized images Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
export const hero = {
|
||||
// Navigation/Header
|
||||
aboutMe: 'ABOUT ME',
|
||||
// Main Section
|
||||
title: 'Digital Solutions Expert',
|
||||
description: 'With a background in software development and expertise in digital transformation, I help companies optimize and automate their processes through innovative solutions.',
|
||||
// Expertise Areas
|
||||
expertise: {
|
||||
processAutomation: {
|
||||
title: 'Process Automation',
|
||||
description: 'Development of efficient automated workflows'
|
||||
},
|
||||
systemIntegration: {
|
||||
title: 'System Integration',
|
||||
description: 'Connection and optimization of business systems'
|
||||
},
|
||||
customDevelopment: {
|
||||
title: 'Custom Development',
|
||||
description: 'Creation of tailored software solutions'
|
||||
}
|
||||
},
|
||||
// Languages
|
||||
languages: {
|
||||
english: 'English',
|
||||
serbian: 'Serbian',
|
||||
german: 'German',
|
||||
french: 'French',
|
||||
spanish: 'Spanish',
|
||||
russian: 'Russian'
|
||||
}
|
||||
} as const;
|
||||
// Type for type safety
|
||||
export type HeroTranslations = typeof hero;
|
||||
@@ -0,0 +1,28 @@
|
||||
import { hero } from './hero';
|
||||
import { journey } from './journey';
|
||||
import { schema } from './schema';
|
||||
import { skillbar } from './skillbar';
|
||||
import { skillgroup } from './skillgroup';
|
||||
import { skills } from './skills';
|
||||
import { workflow } from './workflow';
|
||||
export const about = {
|
||||
seo: {
|
||||
title: 'About Me - Damjan Savić | Fullstack Developer & AI Specialist',
|
||||
description: 'Learn more about Damjan Savić - AI & Automation Specialist focused on Voice AI, autonomous agents, and process automation from Cologne, Germany.'
|
||||
},
|
||||
hero,
|
||||
journey,
|
||||
schema,
|
||||
skillbar,
|
||||
skillgroup,
|
||||
skills,
|
||||
workflow
|
||||
} as const;
|
||||
// Typen exportieren
|
||||
export type { HeroTranslations } from './hero';
|
||||
export type { JourneyTranslations } from './journey';
|
||||
export type { SchemaTranslations } from './schema';
|
||||
export type { SkillBarTranslations } from './skillbar';
|
||||
export type { SkillGroupTranslations } from './skillgroup';
|
||||
export type { SkillsTranslations } from './skills';
|
||||
export type { WorkflowTranslations } from './workflow';
|
||||
@@ -0,0 +1,95 @@
|
||||
export const journey = {
|
||||
// Header
|
||||
title: 'Professional Journey',
|
||||
subtitle: 'From digital media to enterprise solutions',
|
||||
// Education Section
|
||||
education: {
|
||||
title: 'Education',
|
||||
degrees: {
|
||||
masters: {
|
||||
degree: 'M.A. Software Development',
|
||||
university: 'Middlesex University, London',
|
||||
period: '2020 - 2022'
|
||||
},
|
||||
bachelors: {
|
||||
degree: 'B.A. Cross-Media Production',
|
||||
university: 'Middlesex University, London',
|
||||
period: '2018 - 2020'
|
||||
}
|
||||
}
|
||||
},
|
||||
// Languages Section
|
||||
languages: {
|
||||
title: 'Languages',
|
||||
items: {
|
||||
english: {
|
||||
name: 'English',
|
||||
level: 'C2'
|
||||
},
|
||||
serbian: {
|
||||
name: 'Serbian',
|
||||
level: 'C2'
|
||||
},
|
||||
german: {
|
||||
name: 'German',
|
||||
level: 'C2'
|
||||
},
|
||||
french: {
|
||||
name: 'French',
|
||||
level: 'B2'
|
||||
},
|
||||
spanish: {
|
||||
name: 'Spanish',
|
||||
level: 'B2'
|
||||
},
|
||||
russian: {
|
||||
name: 'Russian',
|
||||
level: 'A1'
|
||||
}
|
||||
}
|
||||
},
|
||||
// Work History
|
||||
work: {
|
||||
positions: [
|
||||
{
|
||||
period: '08/2023 - Present',
|
||||
company: 'Ritter Digital GmbH',
|
||||
title: 'Digital Solutions Consultant',
|
||||
location: 'Oberhausen',
|
||||
highlights: [
|
||||
'ERP consulting and implementation (JTL WaWi)',
|
||||
'Process automation & full-stack development',
|
||||
'RFID technology & automation',
|
||||
'Lead generation & management',
|
||||
'AI-supported content management'
|
||||
]
|
||||
},
|
||||
{
|
||||
period: '02/2023 - 08/2023',
|
||||
company: 'Joyce & Girls Co AG',
|
||||
title: 'ERP Integration Specialist',
|
||||
location: 'Köln',
|
||||
highlights: [
|
||||
'Complex system integration (Apparel Magic, TradeByte)',
|
||||
'Server administration and automation',
|
||||
'Database and API development',
|
||||
'Digital marketing and campaign analysis'
|
||||
]
|
||||
},
|
||||
{
|
||||
period: '08/2022 - 01/2023',
|
||||
company: 'Magnarius',
|
||||
title: 'RPA Developer & E-Commerce Manager',
|
||||
location: 'Bergisch Gladbach',
|
||||
highlights: [
|
||||
'Shopware 6 development and JTL integration',
|
||||
'Google Ads automation',
|
||||
'CMS management and optimization',
|
||||
'SEO strategy implementation'
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
} as const;
|
||||
// Type for type safety
|
||||
export type JourneyTranslations = typeof journey;
|
||||
@@ -0,0 +1,31 @@
|
||||
export const schema = {
|
||||
page: {
|
||||
name: 'About Damjan Savić',
|
||||
description: 'Learn more about Damjan Savić, a certified JTL expert with extensive experience in e-commerce and warehouse management solutions.'
|
||||
},
|
||||
person: {
|
||||
jobTitle: 'JTL Integration Expert',
|
||||
description: 'With extensive experience in integrating and optimizing e-commerce systems, I help companies with the digital transformation of their business processes.',
|
||||
languages: {
|
||||
english: 'English',
|
||||
serbian: 'Serbian',
|
||||
german: 'German',
|
||||
french: 'French',
|
||||
spanish: 'Spanish',
|
||||
russian: 'Russian'
|
||||
},
|
||||
skills: {
|
||||
python: 'Python',
|
||||
googleAds: 'Google Ads',
|
||||
metaAds: 'Meta Ads',
|
||||
shopware: 'Shopware',
|
||||
shopify: 'Shopify',
|
||||
wooCommerce: 'WooCommerce',
|
||||
jtlWawi: 'JTL WAWI',
|
||||
serverAdmin: 'Server Administration',
|
||||
airflow: 'AirFlow'
|
||||
}
|
||||
}
|
||||
} as const;
|
||||
// Type for type safety
|
||||
export type SchemaTranslations = typeof schema;
|
||||
@@ -0,0 +1,13 @@
|
||||
export const skillbar = {
|
||||
// Accessibility labels
|
||||
ariaLabel: {
|
||||
skillLevel: 'Skill Level',
|
||||
progressBar: 'Progress Bar'
|
||||
},
|
||||
// Screen reader text
|
||||
screenReader: {
|
||||
progress: '{{level}} percent progress for {{skill}}'
|
||||
}
|
||||
} as const;
|
||||
// Type for type safety
|
||||
export type SkillBarTranslations = typeof skillbar;
|
||||
@@ -0,0 +1,63 @@
|
||||
export const skillgroup = {
|
||||
// Categories
|
||||
categories: {
|
||||
development: 'Development',
|
||||
ecommerce: 'E-Commerce',
|
||||
marketing: 'Marketing',
|
||||
automation: 'Automation',
|
||||
languages: 'Programming Languages',
|
||||
databases: 'Databases'
|
||||
},
|
||||
// Skills by category
|
||||
skills: {
|
||||
development: {
|
||||
frontend: 'Frontend Development',
|
||||
backend: 'Backend Development',
|
||||
fullstack: 'Full-Stack Development',
|
||||
api: 'API Development',
|
||||
testing: 'Software Testing'
|
||||
},
|
||||
ecommerce: {
|
||||
jtl: 'JTL WaWi',
|
||||
shopware: 'Shopware',
|
||||
shopify: 'Shopify',
|
||||
woocommerce: 'WooCommerce',
|
||||
magento: 'Magento'
|
||||
},
|
||||
marketing: {
|
||||
seo: 'Search Engine Optimization',
|
||||
sea: 'Search Engine Advertising',
|
||||
analytics: 'Web Analytics',
|
||||
googleAds: 'Google Ads',
|
||||
metaAds: 'Meta Ads'
|
||||
},
|
||||
automation: {
|
||||
rpa: 'Robotic Process Automation',
|
||||
workflow: 'Workflow Automation',
|
||||
cicd: 'CI/CD',
|
||||
testing: 'Test Automation',
|
||||
deployment: 'Deployment Automation'
|
||||
},
|
||||
languages: {
|
||||
python: 'Python',
|
||||
javascript: 'JavaScript',
|
||||
typescript: 'TypeScript',
|
||||
php: 'PHP',
|
||||
sql: 'SQL'
|
||||
},
|
||||
databases: {
|
||||
mysql: 'MySQL',
|
||||
postgresql: 'PostgreSQL',
|
||||
mongodb: 'MongoDB',
|
||||
redis: 'Redis',
|
||||
elasticsearch: 'Elasticsearch'
|
||||
}
|
||||
},
|
||||
// Accessibility
|
||||
ariaLabels: {
|
||||
skillGroup: 'Skill Group',
|
||||
skillList: 'List of skills in this category'
|
||||
}
|
||||
} as const;
|
||||
// Type for type safety
|
||||
export type SkillGroupTranslations = typeof skillgroup;
|
||||
@@ -0,0 +1,46 @@
|
||||
// en/pages/about/skills.ts
|
||||
export const skills = {
|
||||
title: 'Skills',
|
||||
skillGroups: [
|
||||
{
|
||||
category: 'Development',
|
||||
items: [
|
||||
{ name: 'Python', level: 90 },
|
||||
{ name: 'Google Ads', level: 85 },
|
||||
{ name: 'Meta Ads', level: 85 }
|
||||
]
|
||||
},
|
||||
{
|
||||
category: 'E-Commerce',
|
||||
items: [
|
||||
{ name: 'Shopware', level: 85 },
|
||||
{ name: 'Shopify', level: 85 },
|
||||
{ name: 'WooCommerce', level: 85 }
|
||||
]
|
||||
},
|
||||
{
|
||||
category: 'System Administration',
|
||||
items: [
|
||||
{ name: 'JTL WAWI', level: 85 },
|
||||
{ name: 'Server', level: 75 },
|
||||
{ name: 'AirFlow', level: 60 }
|
||||
]
|
||||
}
|
||||
],
|
||||
ui: {
|
||||
percentage: 'percent',
|
||||
levelLabel: 'Level',
|
||||
skillLevel: '{{level}}% proficiency in {{skill}}'
|
||||
},
|
||||
aria: {
|
||||
skillGroup: 'Skill group for {{category}}',
|
||||
skillBar: 'Progress bar for {{skill}}',
|
||||
skillIcon: 'Icon for {{category}}',
|
||||
selectSkill: 'Select skill'
|
||||
},
|
||||
screenReader: {
|
||||
skillProgress: '{{skill}} with a level of {{level}} percent'
|
||||
}
|
||||
} as const;
|
||||
|
||||
export type SkillsTranslations = typeof skills;
|
||||
@@ -0,0 +1,44 @@
|
||||
export const workflow = {
|
||||
// Page title
|
||||
title: 'MY WORKFLOW',
|
||||
description: 'Systematic approach to software development through defined steps',
|
||||
// Workflow steps
|
||||
steps: [
|
||||
{
|
||||
number: '01',
|
||||
title: 'REQUIREMENTS ANALYSIS'
|
||||
},
|
||||
{
|
||||
number: '02',
|
||||
title: 'ASSESSMENT OF DEADLINES AND CONSTRAINTS'
|
||||
},
|
||||
{
|
||||
number: '03',
|
||||
title: 'DEVELOPMENT ENVIRONMENT SETUP'
|
||||
},
|
||||
{
|
||||
number: '04',
|
||||
title: 'PROGRAMMING'
|
||||
},
|
||||
{
|
||||
number: '05',
|
||||
title: 'TESTING THE RESULTS'
|
||||
},
|
||||
{
|
||||
number: '06',
|
||||
title: 'CODE SUPPORT AND SCALING'
|
||||
}
|
||||
],
|
||||
// Aria Labels for accessibility
|
||||
aria: {
|
||||
workflowSection: 'Workflow Process',
|
||||
stepNumber: 'Step {{number}}',
|
||||
stepDescription: 'Workflow step: {{title}}'
|
||||
},
|
||||
// Screen Reader texts
|
||||
screenReader: {
|
||||
stepProgress: 'Step {{number}} of {{total}}: {{title}}'
|
||||
}
|
||||
} as const;
|
||||
// Type for type safety
|
||||
export type WorkflowTranslations = typeof workflow;
|
||||
Reference in New Issue
Block a user