From ac20bd697ce6ed7efc2d04a2c124d2bc624e7200 Mon Sep 17 00:00:00 2001 From: Poyraz <78071274+poyrazavsever@users.noreply.github.com> Date: Sat, 27 Jun 2026 14:42:48 +0300 Subject: [PATCH] feat(i18n): convert portfolio lists to bilingual schemas and resolve localized values --- components/about-content.tsx | 54 +-- components/projects-content.tsx | 42 +- components/reference-cards.tsx | 10 +- components/references-detail-content.tsx | 7 +- components/volunteer-community-content.tsx | 15 +- data/bookmarks.ts | 35 +- data/certificates.ts | 194 ++++++--- data/education.ts | 29 +- data/experience.ts | 42 +- data/projects.ts | 108 +++-- data/references.ts | 60 ++- data/volunteer-community.ts | 75 +++- lib/command-palette-links.ts | 460 ++++++++++++--------- 13 files changed, 745 insertions(+), 386 deletions(-) diff --git a/components/about-content.tsx b/components/about-content.tsx index a489530..bddad86 100644 --- a/components/about-content.tsx +++ b/components/about-content.tsx @@ -1,7 +1,7 @@ "use client"; import Image from "next/image"; -import Link from "next/link"; +import { Link } from "@/i18n/routing"; import { Badge, Card, Typography } from "poyraz-ui/atoms"; import { Sheet, SheetContent, SheetTitle, SheetTrigger } from "poyraz-ui/molecules"; import { StaggerContainer, StaggerItem } from "@/components/motion-wrapper"; @@ -9,19 +9,19 @@ import { BOOKMARKS } from "@/data/bookmarks"; import { certificates } from "@/data/certificates"; import { EDUCATION } from "@/data/education"; import { EXPERIENCE } from "@/data/experience"; - -const ABOUT_TEXT = - "Ortaokulda yazılımla tanıştığımdan beri sürekli öğrenmeye ve kendimi geliştirmeye çalışıyorum. Lise yıllarında öğrenme hevesim daha da arttı ve web geliştirme tarafında farklı teknolojileri keşfetme fırsatı buldum. Lisenin sonlarına doğru mobil dünyasına da adım attım. Şu an aktif olarak üretiyor, geliştiriyor ve en önemlisi hâlâ öğrenmeye devam ediyorum."; - -const CERTIFICATE_PREVIEW = certificates.slice(0, 4); +import { useTranslations, useLocale } from "next-intl"; +import { getLocalizedValue } from "@/lib/locale"; export function AboutContent() { + const t = useTranslations("About"); + const locale = useLocale(); + return (
- {ABOUT_TEXT} + {t("aboutText")} @@ -31,13 +31,13 @@ export function AboutContent() { - {item.title} + {getLocalizedValue(item.title, locale)} {item.institution} - {item.period} + {getLocalizedValue(item.period, locale)} @@ -56,14 +56,14 @@ export function AboutContent() { >
- {CERTIFICATE_PREVIEW.map((item) => ( + {certificates.slice(0, 4).map((item) => (
{item.name} - Tüm Sertifikalar + {t("allCertificates")}
{certificates.map((item) => ( - +
{item.name}
- {item.name} + {getLocalizedValue(item.name, locale)} {item.organization} - {item.date} + {getLocalizedValue(item.date, locale)}
@@ -114,13 +114,13 @@ export function AboutContent() { - {item.role} + {getLocalizedValue(item.role, locale)} {item.company} - {item.period} + {getLocalizedValue(item.period, locale)} @@ -133,10 +133,10 @@ export function AboutContent() { - Referanslar + {t("referencesTitle")} - Tüm referansları ayrı bir detay sayfasında görüntüle. + {t("referencesDesc")} @@ -144,10 +144,10 @@ export function AboutContent() { - Gönüllülük ve Topluluk + {t("volunteerTitle")} - Zaman çizelgesi ve katkı detaylarını ayrı bir detay sayfasında incele. + {t("volunteerDesc")} @@ -161,17 +161,17 @@ export function AboutContent() { > - Yer İmleri + {t("bookmarksTitle")} - Hızlı erişim bağlantılarını bir sheet içinde görüntüle. + {t("bookmarksDesc")} - Yer İmleri + {t("bookmarksTitle")}
{BOOKMARKS.map((item) => ( @@ -184,7 +184,7 @@ export function AboutContent() {
- {item.description} + {getLocalizedValue(item.description, locale)} @@ -81,11 +92,22 @@ function ProjectSection({ } export async function ProjectsContent() { + const t = await getTranslations("Projects"); + const locale = await getLocale(); + const [repos, npmPackages] = await Promise.all([ getGithubRepos(), getNpmPackages(), ]); + const localizeItems = (items: ProjectItem[]): LocalizedProjectItem[] => { + return items.map((item) => ({ + ...item, + description: getLocalizedValue(item.description, locale), + badge: item.badge ? getLocalizedValue(item.badge, locale) : undefined, + })); + }; + return (
@@ -101,20 +123,20 @@ export async function ProjectsContent() {
- - - - + + + +
- npm Paketleri (@poyrazavsever) + {t("sections.npmPackages")}
{npmPackages.length === 0 ? ( - npm API yanıtı şu anda boş. + {t("emptyNpm")} ) : ( @@ -151,13 +173,13 @@ export async function ProjectsContent() {
- GitHub Repoları (@poyrazavsever) + {t("sections.githubRepos")}
{repos.length === 0 ? ( - GitHub API yanıtı şu anda boş. + {t("emptyGithub")} ) : ( diff --git a/components/reference-cards.tsx b/components/reference-cards.tsx index d6af78d..37df150 100644 --- a/components/reference-cards.tsx +++ b/components/reference-cards.tsx @@ -1,6 +1,8 @@ -import Link from "next/link"; +import { Link } from "@/i18n/routing"; import { TestimonialCard } from "poyraz-ui/molecules"; import { REFERENCES } from "@/data/references"; +import { useLocale } from "next-intl"; +import { getLocalizedValue } from "@/lib/locale"; type ReferenceCardsProps = { className?: string; @@ -8,14 +10,16 @@ type ReferenceCardsProps = { }; export function ReferenceCards({ className, cardClassName }: ReferenceCardsProps) { + const locale = useLocale(); + return (
{REFERENCES.map((item) => { const card = ( - {"<- Hakkımda'ya dön"} + {t("backToAbout")} - {"<- Hakkımda'ya dön"} + {t("backToAbout")}
@@ -20,12 +25,12 @@ export function VolunteerCommunityContent() { - Zaman Çizelgesi: {item.timeline} + {t("timelineLabel")} {getLocalizedValue(item.timeline, locale)} {item.link ? ( - Bağlantı:{" "} + {t("linkLabel")}{" "} - Odak: {item.focus} + {t("focusLabel")} {getLocalizedValue(item.focus, locale)} ))} diff --git a/data/bookmarks.ts b/data/bookmarks.ts index fb12b84..7bf1f4c 100644 --- a/data/bookmarks.ts +++ b/data/bookmarks.ts @@ -2,7 +2,10 @@ export type BookmarkItem = { id: string; title: string; href: string; - description: string; + description: { + tr: string; + en: string; + }; tag: string; }; @@ -11,42 +14,60 @@ export const BOOKMARKS: BookmarkItem[] = [ id: "bookmark-poyraz-ui", title: "Poyraz UI", href: "https://ui.poyrazavsever.com", - description: "Component docs and examples for the design system used in this portfolio.", + description: { + tr: "Bu portfolyoda kullanılan tasarım sistemi için bileşen dokümantasyonu ve örnekleri.", + en: "Component docs and examples for the design system used in this portfolio.", + }, tag: "UI Kit", }, { id: "bookmark-reactive-switcher", title: "Reactive Switcher", href: "https://reactive-switcher.vercel.app", - description: "Theme switching package docs for scalable light and dark mode setup.", + description: { + tr: "Ölçeklenebilir açık ve koyu mod kurulumu için tema değiştirici paket dokümantasyonu.", + en: "Theme switching package docs for scalable light and dark mode setup.", + }, tag: "Theming", }, { id: "bookmark-next-docs", title: "Next.js Docs", href: "https://nextjs.org/docs", - description: "Official App Router and rendering strategy reference.", + description: { + tr: "Resmi App Router ve render etme stratejisi referansı.", + en: "Official App Router and rendering strategy reference.", + }, tag: "Framework", }, { id: "bookmark-tailwind-docs", title: "Tailwind CSS Docs", href: "https://tailwindcss.com/docs", - description: "Utility classes and token customization reference.", + description: { + tr: "Yardımcı sınıflar ve token özelleştirme referansı.", + en: "Utility classes and token customization reference.", + }, tag: "CSS", }, { id: "bookmark-vercel", title: "Vercel", href: "https://vercel.com/docs", - description: "Deployment and performance optimization references.", + description: { + tr: "Dağıtım ve performans optimizasyonu referansları.", + en: "Deployment and performance optimization references.", + }, tag: "Deploy", }, { id: "bookmark-github", title: "GitHub", href: "https://github.com/poyrazavsever", - description: "Open-source repositories and shipped experiments.", + description: { + tr: "Açık kaynaklı depolarım ve yayınladığım deneysel projeler.", + en: "Open-source repositories and shipped experiments.", + }, tag: "Profile", }, ]; diff --git a/data/certificates.ts b/data/certificates.ts index 710bd02..980bd1c 100644 --- a/data/certificates.ts +++ b/data/certificates.ts @@ -1,109 +1,205 @@ -export const certificates = [ +export const certificates = [ { - name: "React Native | Uygulamalı React Native Eğitimi", + name: { + tr: "React Native | Uygulamalı React Native Eğitimi", + en: "React Native | Practical React Native Training", + }, organization: "Udemy", - date: "Haziran 2025", - description: - "Bu eğitimle Android ve iOS platformlarında çalışan mobil uygulamalar geliştirebilecek seviyeye geldim. Temel bileşenler, navigasyon, veri yönetimi ve performans optimizasyonu konularında pratik yaptım.", + date: { + tr: "Haziran 2025", + en: "June 2025", + }, + description: { + tr: "Bu eğitimle Android ve iOS platformlarında çalışan mobil uygulamalar geliştirebilecek seviyeye geldim. Temel bileşenler, navigasyon, veri yönetimi ve performans optimizasyonu konularında pratik yaptım.", + en: "With this training, I reached a level where I can develop mobile applications running on Android and iOS platforms. I practiced core components, navigation, data management, and performance optimization.", + }, image: "/certificates/reactnative.png", category: "mobil", }, { - name: "GDG Hackathon Katılım Sertifikası", + name: { + tr: "GDG Hackathon Katılım Sertifikası", + en: "GDG Hackathon Participation Certificate", + }, organization: "Google Developer Group", - date: "Mayıs 2025", - description: - "Google Developer Group tarafından düzenlenen hackathon etkinliğinde organizasyon ekibinde görev aldım.", + date: { + tr: "Mayıs 2025", + en: "May 2025", + }, + description: { + tr: "Google Developer Group tarafından düzenlenen hackathon etkinliğinde organizasyon ekibinde görev aldım.", + en: "I took part in the organizing team of the hackathon event organized by Google Developer Group.", + }, image: "/certificates/gdg.png", category: "hackathon", }, { - name: "Ulusal Öğrenci Kongresi Katılım Sertifikası", + name: { + tr: "Ulusal Öğrenci Kongresi Katılım Sertifikası", + en: "National Student Congress Participation Certificate", + }, organization: "OSTİM Teknik Üniversitesi, İşletme Fakültesi", - date: "Nisan 2025", - description: - "Yapay Zekâ Çağında Sürdürülebilir İşletmeler temalı 1. Ulusal Öğrenci Kongresi'ne katkım nedeniyle verilen katılım sertifikası.", + date: { + tr: "Nisan 2025", + en: "April 2025", + }, + description: { + tr: "Yapay Zekâ Çağında Sürdürülebilir İşletmeler temalı 1. Ulusal Öğrenci Kongresi'ne katkım nedeniyle verilen katılım sertifikası.", + en: "Participation certificate awarded for my contribution to the 1st National Student Congress themed Sustainable Businesses in the Age of AI.", + }, image: "/certificates/ulusal.png", category: "kişisel", }, { - name: "HSD Core Team Katılım Sertifikası", + name: { + tr: "HSD Core Team Katılım Sertifikası", + en: "HSD Core Team Participation Certificate", + }, organization: "Huawei Student Developers", - date: "Ocak 2025", - description: - "OSTİM Teknik Üniversitesi'nde 2024-2025 döneminde kurulan Huawei Student Developers topluluğunun Core Team kadrosunda yer aldım.", + date: { + tr: "Ocak 2025", + en: "January 2025", + }, + description: { + tr: "OSTİM Teknik Üniversitesi'nde 2024-2025 döneminde kurulan Huawei Student Developers topluluğunun Core Team kadrosunda yer aldım.", + en: "I was part of the Core Team of the Huawei Student Developers community established at OSTİM Technical University in the 2024-2025 term.", + }, image: "/certificates/hsd.png", category: "kişisel", }, { - name: "Versiyon Kontrol: Git & GitHub", + name: { + tr: "Versiyon Kontrol: Git & GitHub", + en: "Version Control: Git & GitHub", + }, organization: "BTK Akademi", - date: "Eylül 2024", - description: - "Git ve GitHub üzerine aldığım bu eğitimde sürüm kontrol süreçleri, proje yönetimi ve ekip çalışmasında değişiklik takibi konularında yetkinliğimi artırdım.", + date: { + tr: "Eylül 2024", + en: "September 2024", + }, + description: { + tr: "Git ve GitHub üzerine aldığım bu eğitimde sürüm kontrol süreçleri, proje yönetimi ve ekip çalışmasında değişiklik takibi konularında yetkinliğimi artırdım.", + en: "In this training on Git and GitHub, I increased my competence in version control processes, project management, and tracking changes in teamwork.", + }, image: "/certificates/git.png", category: "yazılım", }, { - name: "Girişimcilikte Sunum Teknikleri ve İletişim Yönetimi", + name: { + tr: "Girişimcilikte Sunum Teknikleri ve İletişim Yönetimi", + en: "Presentation Techniques and Communication Management in Entrepreneurship", + }, organization: "BTK Akademi", - date: "Eylül 2024", - description: - "Bu eğitim sayesinde etkili sunum hazırlama, ikna edici iletişim kurma ve girişimcilik süreçlerinde kendini doğru ifade etme becerilerimi geliştirdim.", + date: { + tr: "Eylül 2024", + en: "September 2024", + }, + description: { + tr: "Bu eğitim sayesinde etkili sunum hazırlama, ikna edici iletişim kurma ve girişimcilik süreçlerinde kendini doğru ifade etme becerilerimi geliştirdim.", + en: "Thanks to this training, I developed my skills in preparing effective presentations, establishing persuasive communication, and expressing myself correctly in entrepreneurial processes.", + }, image: "/certificates/girisim.png", category: "iletişim", }, { - name: "Etkili LinkedIn Profili Oluşturma", + name: { + tr: "Etkili LinkedIn Profili Oluşturma", + en: "Creating an Effective LinkedIn Profile", + }, organization: "BTK Akademi", - date: "Ekim 2024", - description: - "Profesyonel profil oluşturma, networking stratejileri geliştirme ve LinkedIn'i daha verimli kullanma konularında bilgi kazandım.", + date: { + tr: "Ekim 2024", + en: "October 2024", + }, + description: { + tr: "Profesyonel profil oluşturma, networking stratejileri geliştirme ve LinkedIn'i daha verimli kullanma konularında bilgi kazandım.", + en: "I gained knowledge about creating a professional profile, developing networking strategies, and using LinkedIn more efficiently.", + }, image: "/certificates/linkedin.png", category: "kişisel", }, { - name: "REACT ile Web Programcılığı", + name: { + tr: "REACT ile Web Programcılığı", + en: "Web Programming with REACT", + }, organization: "BTK Akademi", - date: "Haziran 2024", - description: - "React ile modern web uygulamaları geliştirme, bileşen tabanlı mimari ve dinamik kullanıcı arayüzü tasarımı konularında uygulamalı eğitim aldım.", + date: { + tr: "Haziran 2024", + en: "June 2024", + }, + description: { + tr: "React ile modern web uygulamaları geliştirme, bileşen tabanlı mimari ve dinamik kullanıcı arayüzü tasarımı konularında uygulamalı eğitim aldım.", + en: "I received hands-on training on developing modern web applications with React, component-based architecture, and dynamic user interface design.", + }, image: "/certificates/react.png", category: "web", }, { - name: "Node.js ile Web Programcılığı", + name: { + tr: "Node.js ile Web Programcılığı", + en: "Web Programming with Node.js", + }, organization: "BTK Akademi", - date: "Kasım 2024", - description: - "Node.js kullanarak sunucu tarafı geliştirme, API oluşturma ve backend süreçlerini yönetme becerilerimi geliştirdim.", + date: { + tr: "Kasım 2024", + en: "November 2024", + }, + description: { + tr: "Node.js kullanarak sunucu tarafı geliştirme, API oluşturma ve backend süreçlerini yönetme becerilerimi geliştirdim.", + en: "I developed my skills in server-side development, creating APIs, and managing backend processes using Node.js.", + }, image: "/certificates/nodejs.png", category: "web", }, { - name: "Yeşilay Türkiye Münazara Şampiyonası", + name: { + tr: "Yeşilay Türkiye Münazara Şampiyonası", + en: "Green Crescent Turkey Debating Championship", + }, organization: "Yeşilay", - date: "Temmuz 2023", - description: - "Yeşilay Türkiye Münazara Şampiyonası'nda finalist oldum. Bu süreçte iletişim, ikna ve hızlı düşünme becerilerimi güçlendirdim.", + date: { + tr: "Temmuz 2023", + en: "July 2023", + }, + description: { + tr: "Yeşilay Türkiye Münazara Şampiyonası'nda finalist oldum. Bu süreçte iletişim, ikna ve hızlı düşünme becerilerimi güçlendirdim.", + en: "I became a finalist in the Green Crescent Turkey Debating Championship. During this process, I strengthened my communication, persuasion, and quick-thinking skills.", + }, image: "/certificates/turkiye.png", category: "iletişim", }, { - name: "Yeşilay Bölge Münazara Turnuvası Şampiyonası", + name: { + tr: "Yeşilay Bölge Münazara Turnuvası Şampiyonası", + en: "Green Crescent Regional Debating Tournament Championship", + }, organization: "Yeşilay", - date: "Mayıs 2023", - description: - "Yeşilay Bölge Münazara Turnuvası'nda finalist oldum ve tartışma-temelli iletişim becerilerimi geliştirdim.", + date: { + tr: "Mayıs 2023", + en: "May 2023", + }, + description: { + tr: "Yeşilay Bölge Münazara Turnuvası'nda finalist oldum ve tartışma-temelli iletişim becerilerimi geliştirdim.", + en: "I became a finalist in the Green Crescent Regional Debating Tournament and developed my debate-based communication skills.", + }, image: "/certificates/bolge.png", category: "iletişim", }, { - name: "Python | Sıfırdan İleri Seviye Programlama", + name: { + tr: "Python | Sıfırdan İleri Seviye Programlama", + en: "Python | Programming from Scratch to Advanced Level", + }, organization: "Udemy", - date: "Kasım 2021", - description: - "Algoritmalar, veri yapıları ve nesne yönelimli programlama dahil olmak üzere Python'ın temel ve ileri seviye konularında kapsamlı eğitim tamamladım.", + date: { + tr: "Kasım 2021", + en: "November 2021", + }, + description: { + tr: "Algoritmalar, veri yapıları ve nesne yönelimli programlama dahil olmak üzere Python'ın temel ve ileri seviye konularında kapsamlı eğitim tamamladım.", + en: "I completed comprehensive training in core and advanced topics of Python, including algorithms, data structures, and object-oriented programming.", + }, image: "/certificates/python.png", category: "yazılım", }, diff --git a/data/education.ts b/data/education.ts index 02f6b3b..a146b94 100644 --- a/data/education.ts +++ b/data/education.ts @@ -1,18 +1,31 @@ -export const EDUCATION = [ +export const EDUCATION = [ { id: "ostim-university", - title: "Yazılım Mühendisliği (3. Sınıf)", + title: { + tr: "Yazılım Mühendisliği (3. Sınıf)", + en: "Software Engineering (Junior)", + }, institution: "OSTİM Teknik Üniversitesi", - period: "2024 - Günümüz", - description: - "Yazılım temelleri, ürün bakış açısı ve disiplinler arası proje geliştirme alanlarında kendimi geliştirmeye devam ediyorum.", + period: { + tr: "2024 - Günümüz", + en: "2024 - Present", + }, + description: { + tr: "Yazılım temelleri, ürün bakış açısı ve disiplinler arası proje geliştirme alanlarında kendimi geliştirmeye devam ediyorum.", + en: "Continuing to develop my skills in software foundations, product perspective, and interdisciplinary project development.", + }, }, { id: "high-school", - title: "Lise", + title: { + tr: "Lise", + en: "High School", + }, institution: "Tuşba Fen Lisesi", period: "2020 - 2024", - description: - "Temel mühendislik ve analitik düşünme yetkinliklerimi geliştirirken web ve mobil projeler üreterek pratik yaptım.", + description: { + tr: "Temel mühendislik ve analitik düşünme yetkinliklerimi geliştirirken web ve mobil projeler üreterek pratik yaptım.", + en: "Practiced by building web and mobile projects while developing my basic engineering and analytical thinking skills.", + }, }, ] as const; diff --git a/data/experience.ts b/data/experience.ts index a4c8fdc..e8104a4 100644 --- a/data/experience.ts +++ b/data/experience.ts @@ -1,26 +1,50 @@ -export const EXPERIENCE = [ +export const EXPERIENCE = [ { id: "omedya-part-time", - role: "Fullstack Developer (Part-time)", + role: { + tr: "Fullstack Developer (Part-time)", + en: "Fullstack Developer (Part-time)", + }, company: "Omedya Bilişim A.Ş.", - period: "Ağustos 2025 - Günümüz", + period: { + tr: "Ağustos 2025 - Günümüz", + en: "August 2025 - Present", + }, }, { id: "omedya-intern", - role: "Fullstack Developer Intern", + role: { + tr: "Fullstack Developer Stajyeri", + en: "Fullstack Developer Intern", + }, company: "Omedya Bilişim A.Ş.", - period: "Haziran 2025 - Ağustos 2025", + period: { + tr: "Haziran 2025 - Ağustos 2025", + en: "June 2025 - August 2025", + }, }, { id: "arc-intern", - role: "Fullstack Developer Intern", + role: { + tr: "Fullstack Developer Stajyeri", + en: "Fullstack Developer Intern", + }, company: "ARC Foreign Trade", - period: "Şubat 2025 - Haziran 2025", + period: { + tr: "Şubat 2025 - Haziran 2025", + en: "February 2025 - June 2025", + }, }, { id: "tarvina-intern", - role: "Fullstack Developer Intern", + role: { + tr: "Fullstack Developer Stajyeri", + en: "Fullstack Developer Intern", + }, company: "Tarvina Software Technologies", - period: "Ekim 2024 - Aralık 2024", + period: { + tr: "Ekim 2024 - Aralık 2024", + en: "October 2024 - December 2024", + }, }, ] as const; diff --git a/data/projects.ts b/data/projects.ts index 66fe297..d02a64f 100644 --- a/data/projects.ts +++ b/data/projects.ts @@ -1,9 +1,15 @@ -export type ProjectItem = { +export type ProjectItem = { id: string; title: string; - description: string; + description: { + tr: string; + en: string; + }; image: string; - badge?: string; + badge?: { + tr: string; + en: string; + } | string; href?: string; }; @@ -14,8 +20,10 @@ export const MOBILE_APPS: ProjectItem[] = [ badge: "Agritech", image: "/projects/targiz.png", href: "https://targiz.com", - description: - "Ottoqua ekibiyle birlikte geliştirdiğimiz, küçük ölçekli üreticilere sahada destek veren yapay zeka destekli tarım uygulaması.", + description: { + tr: "Ottoqua ekibiyle birlikte geliştirdiğimiz, küçük ölçekli üreticilere sahada destek veren yapay zeka destekli tarım uygulaması.", + en: "An AI-powered agricultural application we developed with the Ottoqua team to support small-scale producers in the field.", + }, }, ]; @@ -23,47 +31,72 @@ export const WEB_APPS: ProjectItem[] = [ { id: "arc-foreign-trade", title: "ARC Foreign Trade", - badge: "Freelance", + badge: { + tr: "Freelance", + en: "Freelance", + }, image: "/projects/arc.png", href: "https://arcforeigntrade.com", - description: - "Ankara merkezli ihracat odaklı bir üretici firma için kurumsal web sitesi yenileme projesi.", + description: { + tr: "Ankara merkezli ihracat odaklı bir üretici firma için kurumsal web sitesi yenileme projesi.", + en: "Corporate website renewal project for an Ankara-based export-oriented manufacturer.", + }, }, { id: "ataturk-chronology", title: "Atatürk Kronolojisi", - badge: "Open Source", + badge: { + tr: "Açık Kaynak", + en: "Open Source", + }, image: "/projects/ataturk.png", href: "https://ataturk-kronolojisi.org", - description: - "Atatürk’ün hayatındaki önemli olayları, konuşmaları ve reformları etkileşimli bir zaman çizelgesiyle sunan web deneyimi.", + description: { + tr: "Atatürk’ün hayatındaki önemli olayları, konuşmaları ve reformları etkileşimli bir zaman çizelgesiyle sunan web deneyimi.", + en: "A web experience presenting important events, speeches, and reforms in Atatürk's life with an interactive timeline.", + }, }, { id: "mockup-factory", title: "Mockup Factory", - badge: "Open Source", + badge: { + tr: "Açık Kaynak", + en: "Open Source", + }, image: "/projects/mockup.png", href: "https://mockup-factory-mu.vercel.app/", - description: - "Görsellerin cihaz mockup’larına saniyeler içinde dönüştürüldüğü, tamamen tarayıcı üzerinde çalışan açık kaynak araç.", + description: { + tr: "Görsellerin cihaz mockup’larına saniyeler içinde dönüştürüldüğü, tamamen tarayıcı üzerinde çalışan açık kaynak araç.", + en: "An open-source tool running entirely in the browser that converts images into device mockups in seconds.", + }, }, { id: "ohhike", title: "Ohhike Coach", - badge: "Open Source", + badge: { + tr: "Açık Kaynak", + en: "Open Source", + }, image: "/projects/ohhike.png", href: "https://www.ohhike.com", - description: - "An open-source, AI-powered coaching intelligence platform for sports teams. OhHike CoachOS turns athlete check-ins, training notes, smartwatch data, and session history into actionable team memory.", + description: { + tr: "Spor takımları için açık kaynaklı, yapay zekâ destekli antrenörlük zekâ platformu. OhHike CoachOS; sporcu check-in'lerini, antrenman notlarını, akıllı saat verilerini ve antrenman geçmişini aksiyona geçirilebilir bir takım hafızasına dönüştürür.", + en: "An open-source, AI-powered coaching intelligence platform for sports teams. OhHike CoachOS turns athlete check-ins, training notes, smartwatch data, and session history into actionable team memory.", + }, }, { id: "neta", title: "Take Neta", - badge: "Open Source", + badge: { + tr: "Açık Kaynak", + en: "Open Source", + }, image: "/projects/neta.png", href: "https://www.takeneta.com", - description: - "Your digital second brain. An all-in-one personal operating system for mindful productivity and life-tracking. Local-first, AI-integrated, and open-source.", + description: { + tr: "Dijital ikinci beyniniz. Bilinçli üretkenlik ve yaşam takibi için hepsi bir arada kişisel işletim sistemi. Yerel öncelikli, yapay zekâ entegrasyonlu ve açık kaynaklı.", + en: "Your digital second brain. An all-in-one personal operating system for mindful productivity and life-tracking. Local-first, AI-integrated, and open-source.", + }, }, ]; @@ -71,30 +104,44 @@ export const EXTENSIONS: ProjectItem[] = [ { id: "shortcut-injector", title: "Shortcut Injector", - badge: "Cross-Browser", + badge: { + tr: "Çapraz Tarayıcı", + en: "Cross-Browser", + }, image: "/projects/quick-fill.png", href: "https://github.com/poyrazavsever/shortcut-injector", - description: "A cross-browser extension to quickly inject predefined personal data and links into web forms using custom keyboard shortcuts." + description: { + tr: "Özel klavye kısayollarını kullanarak önceden tanımlanmış kişisel verileri ve bağlantıları web formlarına hızlıca enjekte etmek için geliştirilmiş bir tarayıcı eklentisi.", + en: "A cross-browser extension to quickly inject predefined personal data and links into web forms using custom keyboard shortcuts.", + }, }, { id: "tab-audio-relay", title: "Tab Audio Relay", - badge: "Corss-Browser", + badge: { + tr: "Çapraz Tarayıcı", + en: "Cross-Browser", + }, image: "/projects/sound_sync.png", href: "https://github.com/poyrazavsever/tab-audio-relay", - description: "A browser extension that synchronizes audio playback between tabs. Automatically plays your music when your tutorial/lecture video stops, and pauses it when you resume learning. Perfect for deep work and seamless study sessions." - } + description: { + tr: "Sekmeler arasındaki ses çalma işlemlerini senkronize eden bir tarayıcı eklentisi. Eğitim videonuz durduğunda müziğinizi otomatik olarak oynatır, eğitime devam ettiğinizde ise müziği duraklatır.", + en: "A browser extension that synchronizes audio playback between tabs. Automatically plays your music when your tutorial/lecture video stops, and pauses it when you resume learning. Perfect for deep work and seamless study sessions.", + }, + }, ]; export const FIGMA_TEMPLATES: ProjectItem[] = [ { id: "hsd-website", title: "HSD Community Web Site", - badge: "figma", + badge: "Figma", image: "/projects/hsd.png", href: "https://www.figma.com/community/file/1613511833232376739", - description: - "HSD Community için Web Site tasarımı. Component, dashboard, landing page, profile sayfaları", + description: { + tr: "HSD Community için Web Site tasarımı. Bileşenler, kontrol paneli, açılış sayfası, profil sayfaları.", + en: "Web Site design for HSD Community. Components, dashboard, landing page, profile pages.", + }, }, { id: "restaurant-menu", @@ -102,6 +149,9 @@ export const FIGMA_TEMPLATES: ProjectItem[] = [ badge: "Figma", image: "/projects/menu.png", href: "https://www.figma.com/community/file/1613577450975840169/restaurant-menu-ui-design", - description: "Restaurant Menu UI Design Template for community", + description: { + tr: "Topluluk için Restaurant Menü Arayüz Tasarımı şablonu.", + en: "Restaurant Menu UI Design Template for the community.", + }, }, ]; diff --git a/data/references.ts b/data/references.ts index d79b80f..d7886be 100644 --- a/data/references.ts +++ b/data/references.ts @@ -1,8 +1,14 @@ export type Reference = { id: string; - quote: string; + quote: { + tr: string; + en: string; + }; author: string; - role: string; + role: { + tr: string; + en: string; + } | string; avatar: string; rating?: number; profileHref?: string; @@ -12,40 +18,60 @@ export const REFERENCES: Reference[] = [ { id: "ali-korkmaz", author: "Ali Korkmaz", - role: "Müşteri - 2025", + role: { + tr: "Müşteri - 2025", + en: "Client - 2025", + }, rating: 5, avatar: "/avatars/ali.png", - quote: - "Web sitesi tam olarak istediğim gibi oldu. Poyraz benim gözden kaçırdığım detayları da düşündü, her kararı şeffaf şekilde anlattı ve beklentimin üstünde bir iş teslim etti.", + quote: { + tr: "Web sitesi tam olarak istediğim gibi oldu. Poyraz benim gözden kaçırdığım detayları da düşündü, her kararı şeffaf şekilde anlattı ve beklentimin üstünde bir iş teslim etti.", + en: "The website turned out exactly as I wanted. Poyraz thought of the details I missed, explained every decision transparently, and delivered a job beyond my expectations.", + }, }, { id: "halil-ibrahim-sabo", author: "Halil Ibrahim Sabo", - role: "Ürün Yöneticisi - 2024", + role: { + tr: "Ürün Yöneticisi - 2024", + en: "Product Manager - 2024", + }, rating: 5, avatar: "/avatars/halil.png", profileHref: "https://www.linkedin.com/in/halil-ibrahim-sabo-18a03a251/", - quote: - "Poyraz çok başarılı ve çalışkan bir genç adam. Çok dürüst ve şeffaf bir yaklaşımı var. Başarılarının devam ettiğini görmekten mutluluk duyuyorum.", + quote: { + tr: "Poyraz çok başarılı ve çalışkan bir genç adam. Çok dürüst ve şeffaf bir yaklaşımı var. Başarılarının devam ettiğini görmekten mutluluk duyuyorum.", + en: "Poyraz is a very successful and hardworking young man. He has a very honest and transparent approach. I am happy to see his continued success.", + }, }, { id: "berat-arslan", author: "Berat Arslan", - role: "Grafik Tasarımcı - 2025", + role: { + tr: "Grafik Tasarımcı - 2025", + en: "Graphic Designer - 2025", + }, avatar: "/avatars/berat.png", profileHref: "https://www.linkedin.com/in/beratarslan21/", - quote: - "Hem hırslı hem de işine gerçekten tutkulu bir takım arkadaşı. Poyraz ile çalışmak keyifliydi; merakını hep korudu, güvenilir şekilde teslim etti ve iş birliğini kolaylaştırdı.", + quote: { + tr: "Hem hırslı hem de işine gerçekten tutkulu bir takım arkadaşı. Poyraz ile çalışmak keyifliydi; merakını hep korudu, güvenilir şekilde teslim etti ve iş birliğini kolaylaştırdı.", + en: "He is a teammate who is both ambitious and truly passionate about his work. Working with Poyraz was a pleasure; he always kept his curiosity, delivered reliably, and facilitated collaboration.", + }, }, { id: "bugrahan-arici", author: "Buğrahan Arıcı", - role: "Dış Ticaret Uzmanı - 2025", + role: { + tr: "Dış Ticaret Uzmanı - 2025", + en: "Foreign Trade Specialist - 2025", + }, avatar: "/avatars/bugrahan.jpg", profileHref: "https://www.linkedin.com/in/bu%C4%9Frahan-ar%C4%B1c%C4%B1-8487b6275/", - quote: - "Poyraz ile ilk olarak kurucusu olduğum ARC Foreign Trade bünyesinde yarı zamanlı olarak çalıştık. İş ahlakı, yazılım konusundaki yetkinliği ve çözüm odaklı yapısıyla süreçlerimize büyük katkı sağladı. Kendisinin çalışma disiplininden o kadar memnun kaldık ki, yarı zamanlı süreci bittikten sonra da ARC Spare Parts ve diğer işlerimiz için kendisiyle freelance yazılımcı olarak çalışmaya devam ettik. Verilen işi her zaman eksiksiz ve zamanında teslim eden, son derece güvenilir biridir. Kendisiyle çalışmayı düşünen herkese kesinlikle tavsiye ederim.", + quote: { + tr: "Poyraz ile ilk olarak kurucusu olduğum ARC Foreign Trade bünyesinde yarı zamanlı olarak çalıştık. İş ahlakı, yazılım konusundaki yetkinliği ve çözüm odaklı yapısıyla süreçlerimize büyük katkı sağladı. Kendisinin çalışma disiplininden o kadar memnun kaldık ki, yarı zamanlı süreci bittikten sonra da ARC Spare Parts ve diğer işlerimiz için kendisiyle freelance yazılımcı olarak çalışmaya devam ettik. Verilen işi her zaman eksiksiz ve zamanında teslim eden, son derece güvenilir biridir. Kendisiyle çalışmayı düşünen herkese kesinlikle tavsiye ederim.", + en: "We first worked with Poyraz part-time at ARC Foreign Trade, of which I am the founder. He contributed greatly to our processes with his work ethic, software competence, and solution-oriented nature. We were so satisfied with his work discipline that we continued to work with him as a freelance developer for ARC Spare Parts and other businesses after his part-time period ended. He is extremely reliable, always delivering the given work completely and on time. I would recommend him to anyone considering working with him.", + }, }, { id: "ada-raimova", @@ -54,7 +80,9 @@ export const REFERENCES: Reference[] = [ avatar: "/avatars/ada.png", profileHref: "https://www.linkedin.com/in/bu%C4%9Frahan-ar%C4%B1c%C4%B1-8487b6275/", - quote: - "I've been working with Poyraz since the early days of Shipin, and he continues to impress me with his professionalism. He has a rare combination of solid technical skills and passion for teaching others. If I was to say one thing about him, it would be his reliability. He never over-promises, always delivers on his commitments, and genuinely incorporates feedback to improve his work.", + quote: { + tr: "Shipin'in ilk günlerinden beri Poyraz ile çalışıyorum ve profesyonelliği beni etkilemeye devam ediyor. Güçlü teknik beceriler ile başkalarına öğretme tutkusunu nadir bulunan bir şekilde birleştiriyor. Onun hakkında tek bir şey söyleyecek olsaydım, o da güvenilirliği olurdu. Asla yapabileceğinden fazlasını vaat etmez, taahhütlerini her zaman yerine getirir ve işini geliştirmek için geri bildirimleri samimiyetle uygular.", + en: "I've been working with Poyraz since the early days of Shipin, and he continues to impress me with his professionalism. He has a rare combination of solid technical skills and passion for teaching others. If I was to say one thing about him, it would be his reliability. He never over-promises, always delivers on his commitments, and genuinely incorporates feedback to improve his work.", + }, }, ]; diff --git a/data/volunteer-community.ts b/data/volunteer-community.ts index 7a32e72..825df2a 100644 --- a/data/volunteer-community.ts +++ b/data/volunteer-community.ts @@ -1,55 +1,92 @@ export type VolunteerCommunityItem = { id: string; title: string; - timeline: string; + timeline: { + tr: string; + en: string; + } | string; link?: string; - focus: string; + focus: { + tr: string; + en: string; + }; }; export const VOLUNTEER_COMMUNITY_ITEMS: VolunteerCommunityItem[] = [ { id: "youtube", title: "YouTube", - timeline: "2025 - Present", + timeline: { + tr: "2025 - Günümüz", + en: "2025 - Present", + }, link: "https://youtube.com/@poyrazavsever", - focus: - "Publishing creator economy breakdowns and tutorials to help new devs ship their first projects.", + focus: { + tr: "Yeni geliştiricilerin ilk projelerini yayına almalarına yardımcı olmak için içerik üretici ekonomisi analizleri ve eğitimleri yayınlamak.", + en: "Publishing creator economy breakdowns and tutorials to help new devs ship their first projects.", + }, }, { id: "instagram", title: "Instagram", - timeline: "2025 - Present", + timeline: { + tr: "2025 - Günümüz", + en: "2025 - Present", + }, link: "https://instagram.com/poyrazavsever", - focus: - "Sharing behind-the-scenes workflow notes and short-form content tips for junior creatives.", + focus: { + tr: "Geliştirici adayları için kamera arkası iş akışı notları ve kısa biçimli içerik ipuçları paylaşmak.", + en: "Sharing behind-the-scenes workflow notes and short-form content tips for junior creatives.", + }, }, { id: "ostim-debate-club", title: "Ostim Debate Club", - timeline: "2024 - Present", + timeline: { + tr: "2024 - Günümüz", + en: "2024 - Present", + }, link: "https://ostimmunazara.com", - focus: "Moderating weekly debate sessions and keeping the website content updated.", + focus: { + tr: "Haftalık münazara oturumlarını modere etmek ve web sitesi içeriğini güncel tutmak.", + en: "Moderating weekly debate sessions and keeping the website content updated.", + }, }, { id: "huawei-student-developers", title: "Huawei Student Developers", - timeline: "2025 - 2026", + timeline: { + tr: "2025 - 2026", + en: "2025 - 2026", + }, link: "https://hsdostim.tech", - focus: - "Organizing campus events around Huawei's developer tooling and mentoring first-time contributors.", + focus: { + tr: "Huawei'in geliştirici araçları etrafında kampüs etkinlikleri düzenlemek ve ilk kez katkıda bulunacaklara mentorluk yapmak.", + en: "Organizing campus events around Huawei's developer tooling and mentoring first-time contributors.", + }, }, { id: "google-developer-student-club", title: "Google Developer Student Club", - timeline: "2025 - 2025", - focus: - "Served as an event facilitator for one term, covering Flutter basics and Firebase quickstarts.", + timeline: { + tr: "2025 - 2025", + en: "2025 - 2025", + }, + focus: { + tr: "Bir dönem boyunca Flutter temelleri ve Firebase başlangıçlarını kapsayan etkinlik kolaylaştırıcısı olarak görev aldım.", + en: "Served as an event facilitator for one term, covering Flutter basics and Firebase quickstarts.", + }, }, { id: "ottoqa-technology-team", title: "Ottoqa Technology Team", - timeline: "2024 - Present", - focus: - "Supporting robotics and embedded systems experiments with documentation and prototype reviews.", + timeline: { + tr: "2024 - Günümüz", + en: "2024 - Present", + }, + focus: { + tr: "Robotik ve gömülü sistemler deneylerini dokümantasyon ve prototip incelemeleri ile desteklemek.", + en: "Supporting robotics and embedded systems experiments with documentation and prototype reviews.", + }, }, ]; diff --git a/lib/command-palette-links.ts b/lib/command-palette-links.ts index 2c73c67..e145de0 100644 --- a/lib/command-palette-links.ts +++ b/lib/command-palette-links.ts @@ -11,6 +11,7 @@ import { REFERENCES } from "@/data/references"; import { VOLUNTEER_COMMUNITY_ITEMS } from "@/data/volunteer-community"; import { YOUTUBE_VIDEO_LINKS } from "@/data/youtube-videos"; import { NAV_LINKS, SOCIAL_LINKS } from "@/lib/links"; +import { getLocalizedValue } from "@/lib/locale"; export type CommandPaletteItem = { id: string; @@ -27,208 +28,263 @@ export type CommandPaletteGroup = { items: CommandPaletteItem[]; }; -const navigationItems: CommandPaletteItem[] = NAV_LINKS.map((item) => ({ - id: item.id, - label: item.label, - href: item.href, - icon: "mdi:compass-outline", - keywords: [ - item.label, - item.href, - "sayfa", - "navigasyon", - "page", - "navigation", - ], -})); +export function getCommandPaletteGroups( + locale: string, + tLinks: (key: string) => string, + tNav: { (key: string): string; has: (key: string) => boolean } +): CommandPaletteGroup[] { + const navigationItems: CommandPaletteItem[] = NAV_LINKS.map((item) => { + const label = tNav.has(item.id) ? tNav(item.id) : item.label; + return { + id: item.id, + label, + href: item.href, + icon: "mdi:compass-outline", + keywords: [ + label, + item.href, + locale === "tr" ? "sayfa" : "page", + locale === "tr" ? "navigasyon" : "navigation", + ], + }; + }); -const socialItems: CommandPaletteItem[] = SOCIAL_LINKS.map((item) => ({ - id: item.id, - label: item.label, - href: item.href, - icon: item.icon, - external: true, - keywords: [item.label, "sosyal", "profil", "social", "profile"], -})); - -const blogItems: CommandPaletteItem[] = [ - { - id: "blog-index", - label: "Blog", - href: "/blog", - icon: "mdi:file-document-outline", - keywords: ["blog", "yazı", "article", "post"], - }, - { - id: "blog-content-page", - label: "Video ve Notlar", - href: "/content", - icon: "mdi:video-outline", - keywords: ["video", "youtube", "not", "pdf", "içerik", "content"], - }, -]; - -const aboutItems: CommandPaletteItem[] = [ - ...EDUCATION.map((item) => ({ - id: `education-${item.id}`, - label: item.title, - href: "/about", - icon: "mdi:school-outline", - keywords: [ - item.institution, - item.period, - item.description, - "eğitim", - "education", - "about", - ], - })), - ...EXPERIENCE.map((item) => ({ - id: `experience-${item.id}`, - label: item.role, - href: "/about", - icon: "mdi:briefcase-outline", - keywords: [item.company, item.period, "deneyim", "experience", "about"], - })), - ...certificates.map((item, index) => ({ - id: `certificate-${index}`, - label: item.name, - href: "/about", - icon: "mdi:certificate-outline", - keywords: [ - item.organization, - item.date, - item.category, - item.description, - "sertifika", - "certificate", - ], - })), - ...REFERENCES.map((item) => ({ - id: `reference-${item.id}`, - label: `Referans: ${item.author}`, - href: "/about/references", - icon: "mdi:account-voice-outline", - keywords: [ - item.role, - item.quote, - "referans", - "yorum", - "reference", - "testimonial", - ], - })), - ...VOLUNTEER_COMMUNITY_ITEMS.map((item) => ({ - id: `volunteer-${item.id}`, - label: item.title, - href: "/about/volunteer-community", - icon: "mdi:hand-heart-outline", - keywords: [ - item.timeline, - item.focus, - item.link ?? "", - "gönüllülük", - "topluluk", - "volunteer", - "community", - ], - })), -]; - -const projectItems: CommandPaletteItem[] = [ - ...MOBILE_APPS.map((item) => ({ - id: `mobile-project-${item.id}`, - label: item.title, - href: "/projects", - icon: "mdi:cellphone", - keywords: [ - item.description, - item.badge ?? "", - "mobil", - "proje", - "mobile", - "project", - ], - })), - ...WEB_APPS.map((item) => ({ - id: `web-project-${item.id}`, - label: item.title, - href: item.href ?? "/projects", - icon: "mdi:web", - external: Boolean(item.href), - keywords: [item.description, item.badge ?? "", "web", "proje", "project"], - })), - ...EXTENSIONS.map((item) => ({ - id: `extension-project-${item.id}`, - label: item.title, - href: item.href ?? "/projects", - icon: "mdi:puzzle-outline", - external: Boolean(item.href), - keywords: [ - item.description, - item.badge ?? "", - "extension", - "eklenti", - "proje", - "project", - ], - })), - ...FIGMA_TEMPLATES.map((item) => ({ - id: `figma-project-${item.id}`, - label: item.title, - href: item.href ?? "/projects", - icon: "mdi:figma", - external: Boolean(item.href), - keywords: [ - item.description, - item.badge ?? "", - "figma", - "şablon", - "template", - ], - })), -]; - -const contentItems: CommandPaletteItem[] = YOUTUBE_VIDEO_LINKS.map( - (item, index) => ({ - id: `youtube-video-${index + 1}`, - label: `YouTube Videosu ${index + 1}`, - href: item, - icon: "mdi:youtube", + const socialItems: CommandPaletteItem[] = SOCIAL_LINKS.map((item) => ({ + id: item.id, + label: item.label, + href: item.href, + icon: item.icon, external: true, - keywords: [item, "youtube", "video", "içerik", "content"], - }), -); + keywords: [ + item.label, + locale === "tr" ? "sosyal" : "social", + locale === "tr" ? "profil" : "profile", + ], + })); -export const COMMAND_PALETTE_GROUPS: CommandPaletteGroup[] = [ - { - id: "navigation", - heading: "Sayfalar", - items: navigationItems, - }, - { - id: "blog-data", - heading: "Blog İçerikleri", - items: blogItems, - }, - { - id: "about-data", - heading: "Hakkımda", - items: aboutItems, - }, - { - id: "projects-data", - heading: "Projeler", - items: projectItems, - }, - { - id: "content-data", - heading: "İçerikler", - items: contentItems, - }, - { - id: "social", - heading: "Sosyal", - items: socialItems, - }, -] as const; + const blogItems: CommandPaletteItem[] = [ + { + id: "blog-index", + label: "Blog", + href: "/blog", + icon: "mdi:file-document-outline", + keywords: ["blog", locale === "tr" ? "yazı" : "post", "article"], + }, + { + id: "blog-content-page", + label: locale === "tr" ? "Video ve Notlar" : "Videos and Notes", + href: "/content", + icon: "mdi:video-outline", + keywords: [ + "video", + "youtube", + locale === "tr" ? "not" : "note", + "pdf", + locale === "tr" ? "içerik" : "content", + ], + }, + ]; + + const aboutItems: CommandPaletteItem[] = [ + ...EDUCATION.map((item) => { + const title = getLocalizedValue(item.title, locale); + const description = getLocalizedValue(item.description, locale); + const period = getLocalizedValue(item.period, locale); + return { + id: `education-${item.id}`, + label: title, + href: "/about", + icon: "mdi:school-outline", + keywords: [ + item.institution, + period, + description, + locale === "tr" ? "eğitim" : "education", + "about", + ], + }; + }), + ...EXPERIENCE.map((item) => { + const role = getLocalizedValue(item.role, locale); + const period = getLocalizedValue(item.period, locale); + return { + id: `experience-${item.id}`, + label: role, + href: "/about", + icon: "mdi:briefcase-outline", + keywords: [ + item.company, + period, + locale === "tr" ? "deneyim" : "experience", + "about", + ], + }; + }), + ...certificates.map((item, index) => { + const name = getLocalizedValue(item.name, locale); + const date = getLocalizedValue(item.date, locale); + const description = getLocalizedValue(item.description, locale); + return { + id: `certificate-${index}`, + label: name, + href: "/about", + icon: "mdi:certificate-outline", + keywords: [ + item.organization, + date, + item.category, + description, + locale === "tr" ? "sertifika" : "certificate", + ], + }; + }), + ...REFERENCES.map((item) => { + const role = getLocalizedValue(item.role, locale); + const quote = getLocalizedValue(item.quote, locale); + return { + id: `reference-${item.id}`, + label: `${locale === "tr" ? "Referans" : "Reference"}: ${item.author}`, + href: "/about/references", + icon: "mdi:account-voice-outline", + keywords: [ + role, + quote, + locale === "tr" ? "referans" : "reference", + locale === "tr" ? "yorum" : "testimonial", + ], + }; + }), + ...VOLUNTEER_COMMUNITY_ITEMS.map((item) => { + const timeline = getLocalizedValue(item.timeline, locale); + const focus = getLocalizedValue(item.focus, locale); + return { + id: `volunteer-${item.id}`, + label: item.title, + href: "/about/volunteer-community", + icon: "mdi:hand-heart-outline", + keywords: [ + timeline, + focus, + item.link ?? "", + locale === "tr" ? "gönüllülük" : "volunteering", + locale === "tr" ? "topluluk" : "community", + ], + }; + }), + ]; + + const projectItems: CommandPaletteItem[] = [ + ...MOBILE_APPS.map((item) => { + const description = getLocalizedValue(item.description, locale); + const badgeStr = item.badge ? getLocalizedValue(item.badge, locale) : ""; + return { + id: `mobile-project-${item.id}`, + label: item.title, + href: "/projects", + icon: "mdi:cellphone", + keywords: [ + description, + badgeStr, + locale === "tr" ? "mobil" : "mobile", + locale === "tr" ? "proje" : "project", + ], + }; + }), + ...WEB_APPS.map((item) => { + const description = getLocalizedValue(item.description, locale); + const badgeStr = item.badge ? getLocalizedValue(item.badge, locale) : ""; + return { + id: `web-project-${item.id}`, + label: item.title, + href: item.href ?? "/projects", + icon: "mdi:web", + external: Boolean(item.href), + keywords: [ + description, + badgeStr, + "web", + locale === "tr" ? "proje" : "project", + ], + }; + }), + ...EXTENSIONS.map((item) => { + const description = getLocalizedValue(item.description, locale); + const badgeStr = item.badge ? getLocalizedValue(item.badge, locale) : ""; + return { + id: `extension-project-${item.id}`, + label: item.title, + href: item.href ?? "/projects", + icon: "mdi:puzzle-outline", + external: Boolean(item.href), + keywords: [ + description, + badgeStr, + "extension", + locale === "tr" ? "eklenti" : "addon", + locale === "tr" ? "proje" : "project", + ], + }; + }), + ...FIGMA_TEMPLATES.map((item) => { + const description = getLocalizedValue(item.description, locale); + const badgeStr = item.badge ? getLocalizedValue(item.badge, locale) : ""; + return { + id: `figma-project-${item.id}`, + label: item.title, + href: item.href ?? "/projects", + icon: "mdi:figma", + external: Boolean(item.href), + keywords: [ + description, + badgeStr, + "figma", + locale === "tr" ? "şablon" : "template", + ], + }; + }), + ]; + + const contentItems: CommandPaletteItem[] = YOUTUBE_VIDEO_LINKS.map( + (item, index) => ({ + id: `youtube-video-${index + 1}`, + label: `YouTube Video ${index + 1}`, + href: item, + icon: "mdi:youtube", + external: true, + keywords: [item, "youtube", "video", locale === "tr" ? "içerik" : "content"], + }) + ); + + return [ + { + id: "navigation", + heading: locale === "tr" ? "Sayfalar" : "Pages", + items: navigationItems, + }, + { + id: "blog-data", + heading: "Blog", + items: blogItems, + }, + { + id: "about-data", + heading: locale === "tr" ? "Hakkımda" : "About", + items: aboutItems, + }, + { + id: "projects-data", + heading: locale === "tr" ? "Projeler" : "Projects", + items: projectItems, + }, + { + id: "content-data", + heading: locale === "tr" ? "İçerikler" : "Contents", + items: contentItems, + }, + { + id: "social", + heading: "Social", + items: socialItems, + }, + ]; +}