diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..09ff259 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,46 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Next.js: Full Stack", + "type": "node-terminal", + "request": "launch", + "command": "npm run dev", + "serverReadyAction": { + "pattern": "started server on .+, url: (https?://.+)", + "uriFormat": "%s", + "action": "debugWithChrome" + }, + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen" + }, + { + "name": "Next.js: Frontend", + "type": "chrome", + "request": "launch", + "url": "http://localhost:3030", + "webRoot": "${workspaceFolder}", + "sourceMapPathOverrides": { + "webpack://_N_E/*": "${webRoot}/*" + } + }, + { + "name": "Next.js: Backend", + "type": "node", + "request": "attach", + "port": 9229, + "restart": true, + "sourceMaps": true, + "sourceMapPathOverrides": { + "webpack:///*": "${workspaceFolder}/*" + } + } + ], + "compounds": [ + { + "name": "Next.js: Debug Full Stack", + "configurations": ["Next.js: Backend", "Next.js: Frontend"], + "stopAll": true + } + ] +} diff --git a/app/[locale]/about/page.tsx b/app/[locale]/about/page.tsx index 7b0e750..059a0cd 100644 --- a/app/[locale]/about/page.tsx +++ b/app/[locale]/about/page.tsx @@ -1,6 +1,6 @@ import { Metadata } from 'next' import { Navbar } from '@/components/blog/navbar' -import {setRequestLocale} from 'next-intl/server' +import {setRequestLocale, getTranslations} from 'next-intl/server' export const metadata: Metadata = { title: 'About', @@ -14,6 +14,7 @@ type Props = { export default async function AboutPage({params}: Props) { const {locale} = await params setRequestLocale(locale) + const t = await getTranslations('About') return ( <> @@ -22,10 +23,10 @@ export default async function AboutPage({params}: Props) { {/* Classification Header */}

- >> _DOC://PUBLIC_ACCESS + {t('classificationHeader')}

- ABOUT ME_ + {t('mainTitle')}

@@ -35,12 +36,10 @@ export default async function AboutPage({params}: Props) {

- Welcome to my corner of the internet! This is where I share my thoughts, opinions, - and experiences - from tech adventures to life as a family man. Yes, I love - technology, but there's so much more to life than just code and servers. + {t('introParagraph1')}

- STATUS: ACTIVE // ROLE: DAD + DEV + LIFE ENTHUSIAST + {t('introLabel')}

@@ -48,46 +47,39 @@ export default async function AboutPage({params}: Props) { {/* Life & Values Section */}

- > LIFE & VALUES + {t('lifeValuesTitle')}

- [FAMILY FIRST] + {t('familyFirstTitle')}

- Being a dad to an amazing toddler is my most important role. Family time is - sacred - whether it's building block towers, exploring parks, or just - enjoying the chaos of everyday life together. Tech can wait; these moments - can't. + {t('familyFirstText')}

- [ACTIVE LIFESTYLE] + {t('activeLifestyleTitle')}

- I believe in keeping the body active. Whether it's hitting the gym, playing - sports, or just staying on the move - physical activity keeps me sharp, - balanced, and ready for whatever life throws my way. + {t('activeLifestyleText')}

- [ENJOYING THE SIMPLE THINGS] + {t('simpleThingsTitle')}

- Life's too short not to enjoy it. A good drink, a relaxing - evening after a long day, or just not doing anything a blowing some steam off. + {t('simpleThingsText')}

- [TECH WITH PURPOSE] + {t('techPurposeTitle')}

- Yes, I love tech - self-hosting, privacy, tinkering with hardware. But it's - a tool, not a lifestyle. Tech should serve life, not the other way around. + {t('techPurposeText')}

@@ -96,51 +88,46 @@ export default async function AboutPage({params}: Props) { {/* Content Section */}

- > WHAT YOU'LL FIND HERE + {t('contentTitle')}

- CONTENT SCOPE // EVERYTHING FROM TECH TO LIFE + {t('contentSubtitle')}

  • > - Thoughts & Opinions - My take on life, work, and everything in - between + {t('contentThoughts')} - {t('contentThoughtsDesc')}
  • > - Life & Family - Adventures in parenting, sports, and enjoying - the simple things + {t('contentLifeFamily')} - {t('contentLifeFamilyDesc')}
  • > - Tech Research - When I dive into interesting technologies and - experiments + {t('contentTechResearch')} - {t('contentTechResearchDesc')}
  • > - System Administration - Self-hosting, infrastructure, and - DevOps adventures + {t('contentSysAdmin')} - {t('contentSysAdminDesc')}
  • > - Development Insights - Lessons learned from building software + {t('contentDevelopment')} - {t('contentDevelopmentDesc')}
  • > - Random Stuff - Because life doesn't fit into neat - categories! + {t('contentRandom')} - {t('contentRandomDesc')}
@@ -149,40 +136,39 @@ export default async function AboutPage({params}: Props) { {/* Areas of Focus Section */}

- > AREAS OF FOCUS + {t('focusTitle')}

- [BEING A DAD] + {t('focusBeingDadTitle')}

- Playing with my boy, teaching moments, watching him grow, building memories - together + {t('focusBeingDadText')}

- [STAYING ACTIVE] + {t('focusStayingActiveTitle')}

- Gym sessions, sports, keeping fit, maintaining energy for life's demands + {t('focusStayingActiveText')}

- [TECHNOLOGY & SYSTEMS] + {t('focusTechnologyTitle')}

- Software development, infrastructure, DevOps, self-hosting adventures + {t('focusTechnologyText')}

- [LIFE BALANCE] + {t('focusLifeBalanceTitle')}

- Relaxing with good company, enjoying downtime, appreciating the simple moments + {t('focusLifeBalanceText')}

@@ -190,42 +176,42 @@ export default async function AboutPage({params}: Props) { {/* Tech Stack Section */}

- > TECH STACK + {t('techStackTitle')}

- TOOLS I USE // WHEN NEEDED + {t('techStackSubtitle')}

- [DEVELOPMENT] + {t('techStackDevelopmentTitle')}

- .NET, Golang, TypeScript, Next.js, React + {t('techStackDevelopmentText')}

- [INFRASTRUCTURE] + {t('techStackInfrastructureTitle')}

- Windows Server, Linux, Docker, Hyper-V + {t('techStackInfrastructureText')}

- [DESIGN] + {t('techStackDesignTitle')}

- Tailwind CSS, Markdown, Terminal aesthetics + {t('techStackDesignText')}

- [SELF-HOSTING] + {t('techStackSelfHostingTitle')}

- Home lab, privacy-focused services, full control, Git server + {t('techStackSelfHostingText')}

@@ -233,7 +219,7 @@ export default async function AboutPage({params}: Props) { {/* Contact Section */}

- > CONTACT + {t('contactTitle')}

{/*

diff --git a/app/[locale]/blog/blog-client.tsx b/app/[locale]/blog/blog-client.tsx index 43ad88d..5b67834 100644 --- a/app/[locale]/blog/blog-client.tsx +++ b/app/[locale]/blog/blog-client.tsx @@ -7,7 +7,6 @@ import { BlogCard } from '@/components/blog/blog-card' import { SearchBar } from '@/components/blog/search-bar' import { SortDropdown } from '@/components/blog/sort-dropdown' import { TagFilter } from '@/components/blog/tag-filter' -import { Navbar } from '@/components/blog/navbar' interface BlogPageClientProps { posts: Post[] @@ -142,7 +141,7 @@ export default function BlogPageClient({ posts, allTags }: BlogPageClientProps) disabled={currentPage === 1} className="px-6 py-3 font-mono text-sm uppercase border border-[rgb(var(--border-primary))] text-[rgb(var(--text-primary))] disabled:opacity-30 disabled:cursor-not-allowed hover:border-[var(--neon-cyan)] hover:text-[var(--neon-cyan)] transition-colors cursor-pointer" > - < PREV + {t('prev')}

{Array.from({ length: totalPages }, (_, i) => i + 1).map(page => ( @@ -164,7 +163,7 @@ export default function BlogPageClient({ posts, allTags }: BlogPageClientProps) disabled={currentPage === totalPages} className="px-6 py-3 font-mono text-sm uppercase border border-[rgb(var(--border-primary))] text-[rgb(var(--text-primary))] disabled:opacity-30 disabled:cursor-not-allowed hover:border-[var(--neon-cyan)] hover:text-[var(--neon-cyan)] transition-colors cursor-pointer" > - NEXT > + {t('next')}
diff --git a/app/[locale]/blog/page.tsx b/app/[locale]/blog/page.tsx index 485362e..c80bdd4 100644 --- a/app/[locale]/blog/page.tsx +++ b/app/[locale]/blog/page.tsx @@ -1,9 +1,11 @@ import { getAllPosts } from '@/lib/markdown' import BlogPageClient from './blog-client' -import {setRequestLocale} from 'next-intl/server' +import { setRequestLocale } from 'next-intl/server' -export default async function BlogPage() { - const posts = await getAllPosts() +export default async function BlogPage({ params }: { params: Promise<{ locale: string }> }) { + const { locale } = await params; + await setRequestLocale(locale) + const posts = await getAllPosts(locale) const allTags = Array.from(new Set(posts.flatMap(post => post.frontmatter.tags))).sort() return diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index 58ab27e..4d59ec2 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -3,9 +3,18 @@ import Image from 'next/image' import { getAllPosts } from '@/lib/markdown' import { formatDate } from '@/lib/utils' import { ThemeToggle } from '@/components/theme-toggle' -import {setRequestLocale} from 'next-intl/server' +import {setRequestLocale, getTranslations} from 'next-intl/server' + +type Props = { + params: Promise<{locale: string}> +} + +export default async function HomePage({params}: Props) { + const {locale} = await params + setRequestLocale(locale) + const t = await getTranslations('Home') + const tNav = await getTranslations('Navigation') -export default async function HomePage() { const allPosts = await getAllPosts() const featuredPosts = allPosts.slice(0, 6) @@ -24,7 +33,7 @@ export default async function HomePage() {
Logo - TERMINAL:// V2.0 + {t('terminalVersion')}
@@ -32,13 +41,13 @@ export default async function HomePage() { href="/blog" className="font-mono text-xs text-slate-600 dark:text-slate-400 uppercase tracking-wider hover:text-cyan-600 dark:hover:text-cyan-400" > - [BLOG] + [{tNav('blog')}] - [ABOUT] + [{tNav('about')}]
@@ -46,15 +55,13 @@ export default async function HomePage() {

- DOCUMENT LEVEL-1 // + {t('documentLevel')}

- BUILD. WRITE. -
- SHARE. + {t('heroTitle')}

- > Explore ideas + {t('heroSubtitle')}

@@ -63,13 +70,13 @@ export default async function HomePage() { href="/blog" className="px-6 md:px-8 py-3 md:py-4 bg-cyan-700 dark:bg-cyan-900 text-white dark:text-slate-100 border-2 border-cyan-600 dark:border-cyan-700 font-mono font-bold uppercase text-xs md:text-sm tracking-wider hover:bg-cyan-600 dark:hover:bg-cyan-800 hover:border-cyan-500 dark:hover:border-cyan-600 rounded-none transition-colors duration-200" > - [CHECK POSTS] + {t('checkPostsButton')} - [ABOUT ME] + {t('aboutMeButton')} @@ -81,10 +88,10 @@ export default async function HomePage() {

- ARCHIVE ACCESS // RECENT ENTRIES + {t('recentEntriesLabel')}

- > RECENT ENTRIES + {t('recentEntriesTitle')}

@@ -134,7 +141,7 @@ export default async function HomePage() { href={`/blog/${post.slug}`} className="inline-flex items-center text-cyan-600 dark:text-cyan-400 font-mono text-xs font-bold uppercase tracking-wider hover:text-cyan-500 dark:hover:text-cyan-300 border-2 border-slate-400 dark:border-slate-700 px-4 py-2 hover:border-cyan-700 dark:hover:border-cyan-900 transition-colors duration-200" > - [ACCESEAZĂ] >> + {t('accessButton')}
@@ -147,14 +154,14 @@ export default async function HomePage() { href="/blog" className="inline-flex items-center px-8 py-4 bg-transparent text-slate-700 dark:text-slate-300 border-2 border-slate-400 dark:border-slate-700 font-mono font-bold uppercase text-sm tracking-wider hover:bg-slate-200 dark:hover:bg-slate-800 hover:border-slate-500 dark:hover:border-slate-600 transition-colors duration-200" > - [SEE POSTS] >> + {t('seePostsButton')} )} - [SEE ALL TAGS] >> + {t('seeAllTagsButton')} diff --git a/content/blog/en/why-this-page.md b/content/blog/en/why-this-page.md index dc12dff..614dfc5 100644 --- a/content/blog/en/why-this-page.md +++ b/content/blog/en/why-this-page.md @@ -1,5 +1,5 @@ --- -title: 'Why I created this page' +title: 'First post' description: 'First post' date: '2025-12-02' author: 'Rares' diff --git a/content/blog/ro/why-this-page.md b/content/blog/ro/why-this-page.md index c040ebd..454216b 100644 --- a/content/blog/ro/why-this-page.md +++ b/content/blog/ro/why-this-page.md @@ -1,6 +1,6 @@ --- -title: 'Why I created this page' -description: 'First post' +title: 'Primul post' +description: 'Primul post' date: '2025-12-02' author: 'Rares' category: 'Opinion' diff --git a/messages/en.json b/messages/en.json index af3d382..d354bb9 100644 --- a/messages/en.json +++ b/messages/en.json @@ -18,6 +18,21 @@ "about": "About" }, + "Home": { + "terminalVersion": "TERMINAL:// V2.0", + "documentLevel": "DOCUMENT LEVEL-1 //", + "heroTitle": "BUILD. WRITE. SHARE.", + "heroSubtitle": "> Explore ideas", + "checkPostsButton": "[CHECK POSTS]", + "aboutMeButton": "[ABOUT ME]", + "recentEntriesLabel": "ARCHIVE ACCESS // RECENT ENTRIES", + "recentEntriesTitle": "> RECENT ENTRIES", + "fileLabel": "FILE#{number} // {category}", + "accessButton": "[ACCESS] >>", + "seePostsButton": "[SEE POSTS] >>", + "seeAllTagsButton": "[SEE ALL TAGS] >>" + }, + "BlogListing": { "title": "Blog", "subtitle": "Latest articles and thoughts", @@ -29,7 +44,9 @@ "filterByTag": "Filter by tag", "clearFilters": "Clear filters", "foundPosts": "Found {count} posts", - "noPosts": "No posts found" + "noPosts": "No posts found", + "prev": "< PREV", + "next": "NEXT >" }, "BlogPost": { @@ -53,7 +70,54 @@ "About": { "title": "About", - "subtitle": "Learn more about me" + "subtitle": "Learn more about me", + "classificationHeader": ">> _DOC://PUBLIC_ACCESS", + "mainTitle": "ABOUT ME_", + "introLabel": "STATUS: ACTIVE // ROLE: DAD + DEV + LIFE ENTHUSIAST", + "introParagraph1": "Welcome to my corner of the internet! This is where I share my thoughts, opinions, and experiences - from tech adventures to life as a family man. Yes, I love technology, but there's so much more to life than just code and servers.", + "lifeValuesTitle": "> LIFE & VALUES", + "familyFirstTitle": "[FAMILY FIRST]", + "familyFirstText": "Being a dad to an amazing toddler is my most important role. Family time is sacred - whether it's building block towers, exploring parks, or just enjoying the chaos of everyday life together. Tech can wait; these moments can't.", + "activeLifestyleTitle": "[ACTIVE LIFESTYLE]", + "activeLifestyleText": "I believe in keeping the body active. Whether it's hitting the gym, playing sports, or just staying on the move - physical activity keeps me sharp, balanced, and ready for whatever life throws my way.", + "simpleThingsTitle": "[ENJOYING THE SIMPLE THINGS]", + "simpleThingsText": "Life's too short not to enjoy it. A good drink, a relaxing evening after a long day, or just not doing anything a blowing some steam off.", + "techPurposeTitle": "[TECH WITH PURPOSE]", + "techPurposeText": "Yes, I love tech - self-hosting, privacy, tinkering with hardware. But it's a tool, not a lifestyle. Tech should serve life, not the other way around.", + "contentTitle": "> WHAT YOU'LL FIND HERE", + "contentSubtitle": "CONTENT SCOPE // EVERYTHING FROM TECH TO LIFE", + "contentThoughts": "Thoughts & Opinions", + "contentThoughtsDesc": "My take on life, work, and everything in between", + "contentLifeFamily": "Life & Family", + "contentLifeFamilyDesc": "Adventures in parenting, sports, and enjoying the simple things", + "contentTechResearch": "Tech Research", + "contentTechResearchDesc": "When I dive into interesting technologies and experiments", + "contentSysAdmin": "System Administration", + "contentSysAdminDesc": "Self-hosting, infrastructure, and DevOps adventures", + "contentDevelopment": "Development Insights", + "contentDevelopmentDesc": "Lessons learned from building software", + "contentRandom": "Random Stuff", + "contentRandomDesc": "Because life doesn't fit into neat categories!", + "focusTitle": "> AREAS OF FOCUS", + "focusBeingDadTitle": "[BEING A DAD]", + "focusBeingDadText": "Playing with my boy, teaching moments, watching him grow, building memories together", + "focusStayingActiveTitle": "[STAYING ACTIVE]", + "focusStayingActiveText": "Gym sessions, sports, keeping fit, maintaining energy for life's demands", + "focusTechnologyTitle": "[TECHNOLOGY & SYSTEMS]", + "focusTechnologyText": "Software development, infrastructure, DevOps, self-hosting adventures", + "focusLifeBalanceTitle": "[LIFE BALANCE]", + "focusLifeBalanceText": "Relaxing with good company, enjoying downtime, appreciating the simple moments", + "techStackTitle": "> TECH STACK", + "techStackSubtitle": "TOOLS I USE // WHEN NEEDED", + "techStackDevelopmentTitle": "[DEVELOPMENT]", + "techStackDevelopmentText": ".NET, Golang, TypeScript, Next.js, React", + "techStackInfrastructureTitle": "[INFRASTRUCTURE]", + "techStackInfrastructureText": "Windows Server, Linux, Docker, Hyper-V", + "techStackDesignTitle": "[DESIGN]", + "techStackDesignText": "Tailwind CSS, Markdown, Terminal aesthetics", + "techStackSelfHostingTitle": "[SELF-HOSTING]", + "techStackSelfHostingText": "Home lab, privacy-focused services, full control, Git server", + "contactTitle": "> CONTACT" }, "NotFound": { diff --git a/messages/ro.json b/messages/ro.json index d0077f2..0536108 100644 --- a/messages/ro.json +++ b/messages/ro.json @@ -18,6 +18,21 @@ "about": "Despre" }, + "Home": { + "terminalVersion": "TERMINAL:// V2.0", + "documentLevel": "DOCUMENT LEVEL-1 //", + "heroTitle": "BUILD. WRITE. SHARE.", + "heroSubtitle": "> Explore ideas", + "checkPostsButton": "[CHECK POSTS]", + "aboutMeButton": "[ABOUT ME]", + "recentEntriesLabel": "ARCHIVE ACCESS // RECENT ENTRIES", + "recentEntriesTitle": "> RECENT ENTRIES", + "fileLabel": "FILE#{number} // {category}", + "accessButton": "[ACCESS] >>", + "seePostsButton": "[SEE POSTS] >>", + "seeAllTagsButton": "[SEE ALL TAGS] >>" + }, + "BlogListing": { "title": "Blog", "subtitle": "Ultimele articole și gânduri", @@ -29,7 +44,9 @@ "filterByTag": "Filtrează după etichetă", "clearFilters": "Șterge filtrele", "foundPosts": "{count} articole găsite", - "noPosts": "Niciun articol găsit" + "noPosts": "Niciun articol găsit", + "prev": "< PREV", + "next": "NEXT >" }, "BlogPost": { @@ -53,7 +70,54 @@ "About": { "title": "Despre", - "subtitle": "Află mai multe despre mine" + "subtitle": "Află mai multe despre mine", + "classificationHeader": ">> _DOC://PUBLIC_ACCESS", + "mainTitle": "ABOUT ME_", + "introLabel": "STATUS: ACTIVE // ROLE: DAD + DEV + LIFE ENTHUSIAST", + "introParagraph1": "Welcome to my corner of the internet! This is where I share my thoughts, opinions, and experiences - from tech adventures to life as a family man. Yes, I love technology, but there's so much more to life than just code and servers.", + "lifeValuesTitle": "> LIFE & VALUES", + "familyFirstTitle": "[FAMILY FIRST]", + "familyFirstText": "Being a dad to an amazing toddler is my most important role. Family time is sacred - whether it's building block towers, exploring parks, or just enjoying the chaos of everyday life together. Tech can wait; these moments can't.", + "activeLifestyleTitle": "[ACTIVE LIFESTYLE]", + "activeLifestyleText": "I believe in keeping the body active. Whether it's hitting the gym, playing sports, or just staying on the move - physical activity keeps me sharp, balanced, and ready for whatever life throws my way.", + "simpleThingsTitle": "[ENJOYING THE SIMPLE THINGS]", + "simpleThingsText": "Life's too short not to enjoy it. A good drink, a relaxing evening after a long day, or just not doing anything a blowing some steam off.", + "techPurposeTitle": "[TECH WITH PURPOSE]", + "techPurposeText": "Yes, I love tech - self-hosting, privacy, tinkering with hardware. But it's a tool, not a lifestyle. Tech should serve life, not the other way around.", + "contentTitle": "> WHAT YOU'LL FIND HERE", + "contentSubtitle": "CONTENT SCOPE // EVERYTHING FROM TECH TO LIFE", + "contentThoughts": "Thoughts & Opinions", + "contentThoughtsDesc": "My take on life, work, and everything in between", + "contentLifeFamily": "Life & Family", + "contentLifeFamilyDesc": "Adventures in parenting, sports, and enjoying the simple things", + "contentTechResearch": "Tech Research", + "contentTechResearchDesc": "When I dive into interesting technologies and experiments", + "contentSysAdmin": "System Administration", + "contentSysAdminDesc": "Self-hosting, infrastructure, and DevOps adventures", + "contentDevelopment": "Development Insights", + "contentDevelopmentDesc": "Lessons learned from building software", + "contentRandom": "Random Stuff", + "contentRandomDesc": "Because life doesn't fit into neat categories!", + "focusTitle": "> AREAS OF FOCUS", + "focusBeingDadTitle": "[BEING A DAD]", + "focusBeingDadText": "Playing with my boy, teaching moments, watching him grow, building memories together", + "focusStayingActiveTitle": "[STAYING ACTIVE]", + "focusStayingActiveText": "Gym sessions, sports, keeping fit, maintaining energy for life's demands", + "focusTechnologyTitle": "[TECHNOLOGY & SYSTEMS]", + "focusTechnologyText": "Software development, infrastructure, DevOps, self-hosting adventures", + "focusLifeBalanceTitle": "[LIFE BALANCE]", + "focusLifeBalanceText": "Relaxing with good company, enjoying downtime, appreciating the simple moments", + "techStackTitle": "> TECH STACK", + "techStackSubtitle": "TOOLS I USE // WHEN NEEDED", + "techStackDevelopmentTitle": "[DEVELOPMENT]", + "techStackDevelopmentText": ".NET, Golang, TypeScript, Next.js, React", + "techStackInfrastructureTitle": "[INFRASTRUCTURE]", + "techStackInfrastructureText": "Windows Server, Linux, Docker, Hyper-V", + "techStackDesignTitle": "[DESIGN]", + "techStackDesignText": "Tailwind CSS, Markdown, Terminal aesthetics", + "techStackSelfHostingTitle": "[SELF-HOSTING]", + "techStackSelfHostingText": "Home lab, privacy-focused services, full control, Git server", + "contactTitle": "> CONTACT" }, "NotFound": {