diff --git a/public/manifest.json b/public/manifest.json index f4e0793..a5eb03c 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -1,7 +1,7 @@ { "name": "ZeroSixLab", "short_name": "ZSL", - "description": "Ankara merkezli, global vizyonlu yeni nesil yazılım ve Ar-Ge laboratuvarı.", + "description": "Ankara merkezli, global vizyonlu yeni nesil yazilim ve Ar-Ge laboratuvari.", "start_url": "/", "display": "standalone", "background_color": "#0A0E17", @@ -11,69 +11,17 @@ "lang": "tr", "icons": [ { - "src": "/icons/icon-72x72.png", - "sizes": "72x72", - "type": "image/png", - "purpose": "maskable any" + "src": "/icon", + "sizes": "32x32", + "type": "image/png" }, { - "src": "/icons/icon-96x96.png", - "sizes": "96x96", - "type": "image/png", - "purpose": "maskable any" - }, - { - "src": "/icons/icon-128x128.png", - "sizes": "128x128", - "type": "image/png", - "purpose": "maskable any" - }, - { - "src": "/icons/icon-144x144.png", - "sizes": "144x144", - "type": "image/png", - "purpose": "maskable any" - }, - { - "src": "/icons/icon-152x152.png", - "sizes": "152x152", - "type": "image/png", - "purpose": "maskable any" - }, - { - "src": "/icons/icon-192x192.png", - "sizes": "192x192", - "type": "image/png", - "purpose": "maskable any" - }, - { - "src": "/icons/icon-384x384.png", - "sizes": "384x384", - "type": "image/png", - "purpose": "maskable any" - }, - { - "src": "/icons/icon-512x512.png", - "sizes": "512x512", - "type": "image/png", - "purpose": "maskable any" + "src": "/apple-icon", + "sizes": "180x180", + "type": "image/png" } ], "categories": ["business", "productivity", "utilities"], - "screenshots": [ - { - "src": "/screenshots/desktop.png", - "sizes": "1920x1080", - "type": "image/png", - "form_factor": "wide" - }, - { - "src": "/screenshots/mobile.png", - "sizes": "390x844", - "type": "image/png", - "form_factor": "narrow" - } - ], "related_applications": [], "prefer_related_applications": false } diff --git a/src/app/apple-icon.tsx b/src/app/apple-icon.tsx new file mode 100644 index 0000000..274b0d5 --- /dev/null +++ b/src/app/apple-icon.tsx @@ -0,0 +1,26 @@ +import { ImageResponse } from 'next/og'; + +export const runtime = 'edge'; +export const size = { width: 180, height: 180 }; +export const contentType = 'image/png'; + +export default function Icon() { + return new ImageResponse( + ( +
+
🐱
+
+ ), + { ...size } + ); +} diff --git a/src/app/icon.tsx b/src/app/icon.tsx new file mode 100644 index 0000000..50c9fff --- /dev/null +++ b/src/app/icon.tsx @@ -0,0 +1,26 @@ +import { ImageResponse } from 'next/og'; + +export const runtime = 'edge'; +export const size = { width: 32, height: 32 }; +export const contentType = 'image/png'; + +export default function Icon() { + return new ImageResponse( + ( +
+
🐱
+
+ ), + { ...size } + ); +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 43942e3..ca5cb56 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,6 +1,7 @@ import type { Metadata, Viewport } from "next"; import { Inter, Orbitron } from "next/font/google"; import { Analytics } from '@vercel/analytics/next'; +import { LocaleProvider } from '@/context/LocaleContext'; import React from 'react'; import "./globals.css"; @@ -92,14 +93,16 @@ export default function RootLayout({ - - Ana içeriğe atla - -
- {children} -
- -
+ + + Ana i\u00e7eri\u011fe atla + +
+ {children} +
+ +
+
); diff --git a/src/app/opengraph-image.tsx b/src/app/opengraph-image.tsx new file mode 100644 index 0000000..ecda286 --- /dev/null +++ b/src/app/opengraph-image.tsx @@ -0,0 +1,168 @@ +import { ImageResponse } from 'next/og'; + +export const runtime = 'edge'; + +export const alt = 'ZeroSixLab - Geleceği Kodlayan Laboratuvar'; +export const size = { + width: 1200, + height: 630, +}; +export const contentType = 'image/png'; + +export default async function Image() { + return new ImageResponse( + ( +
+ {/* Grid Pattern */} +
+ + {/* Glow Effect */} +
+ + {/* Logo/Brand */} +
+ {/* Cat Icon */} +
+ 🐱 +
+ + {/* Text */} +
+ + ZeroSixLab + + + SOFTWARE LAB + +
+
+ + {/* Tagline */} +
+ Geleceği Kodlayan Laboratuvar +
+ + {/* Tech Tags */} +
+ {['Web', 'Mobil', 'AI', 'Blockchain'].map((tag) => ( +
+ {tag} +
+ ))} +
+ + {/* Bottom URL */} +
+ zerosixlab.com +
+
+ ), + { + ...size, + } + ); +} diff --git a/src/app/page.tsx b/src/app/page.tsx index 1ca8036..636737e 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -15,6 +15,7 @@ import { PartnerLogos } from '@/components/PartnerLogos'; import { ScrollAnimation } from '@/components/ScrollAnimation'; import { CookieBanner } from '@/components/CookieBanner'; import { ProjectModal } from '@/components/ProjectModal'; +import { LanguageSwitcher } from '@/components/LanguageSwitcher'; import { NavPage } from '@/types'; // Social Links @@ -207,6 +208,54 @@ export default function Home() { color: "primary", desc: "Temiz kod prensipleriyle çalışan güçlü algoritma geliştiricisi.", stats: { java: 90, backend: 95, bugs: 0 } + }, + { + name: "Mert Karadeniz", + handle: "PIXEL_MASTER", + role: "UI/UX Designer", + color: "accent", + desc: "Kullanıcı deneyimini piksel piksel mükemmelleştiren tasarımcı.", + stats: { design: 98, ux: 96, creativity: 100 } + }, + { + name: "Ege Yılmaz", + handle: "DATA_WIZARD", + role: "Data Engineer", + color: "primary", + desc: "Büyük veriyi anlamlı içgörülere dönüştüren veri büyücüsü.", + stats: { sql: 97, python: 95, ml: 92 } + }, + { + name: "Emre Çelik", + handle: "CLOUD_RUNNER", + role: "DevOps Engineer", + color: "accent", + desc: "CI/CD pipeline'larını ve bulut altyapısını yöneten uzman.", + stats: { docker: 98, kubernetes: 96, aws: 94 } + }, + { + name: "Bedirhan Demirhan", + handle: "FRONT_LINE", + role: "Web Developer", + color: "primary", + desc: "Modern web teknolojileriyle dinamik arayüzleri inşa eden uzman.", + stats: { react: 95, css: 100, speed: 90 } + }, + { + name: "Murat Dursun", + handle: "PIXEL_FLOW", + role: "Web Developer", + color: "accent", + desc: "Kullanıcı deneyimini kusursuz koda döken web geliştirici.", + stats: { ux: 95, code: 92, coffee: 80 } + }, + { + name: "Mustafa Çoban", + handle: "NET_DEFENDER", + role: "Cyber Security Expert", + color: "primary", + desc: "Ağ güvenliği ve sızma testlerinde uzmanlaşmış siber güvenlik kalkanı.", + stats: { defense: 99, pentest: 98, firewall: 100 } } ]; @@ -872,6 +921,11 @@ export default function Home() { ))}
+ {/* Language Switcher */} +
+ +
+ {/* Mobile Menu Button */}
+ + {isOpen && ( +
+ {locales.map((loc) => ( + + ))} +
+ )} +
+ ); +} diff --git a/src/context/LocaleContext.tsx b/src/context/LocaleContext.tsx new file mode 100644 index 0000000..db43f0d --- /dev/null +++ b/src/context/LocaleContext.tsx @@ -0,0 +1,61 @@ +'use client'; + +import { createContext, useContext, useState, useCallback, useEffect, ReactNode } from 'react'; +import { Locale, defaultLocale, locales } from '@/i18n/config'; +import { getTranslations } from '@/i18n'; +import { TranslationKeys } from '@/i18n/locales/tr'; + +interface LocaleContextType { + locale: Locale; + setLocale: (locale: Locale) => void; + t: TranslationKeys; +} + +const LocaleContext = createContext(undefined); + +const LOCALE_STORAGE_KEY = 'zsl-locale'; + +export function LocaleProvider({ children }: { children: ReactNode }) { + const [locale, setLocaleState] = useState(defaultLocale); + const [translations, setTranslations] = useState(getTranslations(defaultLocale)); + + // Load locale from localStorage on mount + useEffect(() => { + const savedLocale = localStorage.getItem(LOCALE_STORAGE_KEY) as Locale | null; + if (savedLocale && locales.includes(savedLocale)) { + setLocaleState(savedLocale); + setTranslations(getTranslations(savedLocale)); + } else { + // Try to detect browser language + const browserLang = navigator.language.split('-')[0] as Locale; + if (locales.includes(browserLang)) { + setLocaleState(browserLang); + setTranslations(getTranslations(browserLang)); + } + } + }, []); + + const setLocale = useCallback((newLocale: Locale) => { + if (locales.includes(newLocale)) { + setLocaleState(newLocale); + setTranslations(getTranslations(newLocale)); + localStorage.setItem(LOCALE_STORAGE_KEY, newLocale); + // Update html lang attribute + document.documentElement.lang = newLocale; + } + }, []); + + return ( + + {children} + + ); +} + +export function useLocale() { + const context = useContext(LocaleContext); + if (context === undefined) { + throw new Error('useLocale must be used within a LocaleProvider'); + } + return context; +} diff --git a/src/i18n/config.ts b/src/i18n/config.ts new file mode 100644 index 0000000..a2e4d34 --- /dev/null +++ b/src/i18n/config.ts @@ -0,0 +1,14 @@ +export const locales = ['tr', 'en'] as const; +export const defaultLocale = 'tr' as const; + +export type Locale = (typeof locales)[number]; + +export const localeNames: Record = { + tr: 'Türkçe', + en: 'English', +}; + +export const localeFlags: Record = { + tr: '🇹🇷', + en: '🇬🇧', +}; diff --git a/src/i18n/index.ts b/src/i18n/index.ts new file mode 100644 index 0000000..a59d7ec --- /dev/null +++ b/src/i18n/index.ts @@ -0,0 +1,31 @@ +import { tr } from './locales/tr'; +import { en } from './locales/en'; +import { Locale, defaultLocale } from './config'; + +const translations = { + tr, + en, +} as const; + +export function getTranslations(locale: Locale = defaultLocale) { + return translations[locale] || translations[defaultLocale]; +} + +export function t(locale: Locale, key: string): string { + const keys = key.split('.'); + let value: unknown = translations[locale] || translations[defaultLocale]; + + for (const k of keys) { + if (value && typeof value === 'object' && k in value) { + value = (value as Record)[k]; + } else { + return key; // Return key if translation not found + } + } + + return typeof value === 'string' ? value : key; +} + +export * from './config'; +export * from './locales/tr'; +export * from './locales/en'; diff --git a/src/i18n/locales/en.ts b/src/i18n/locales/en.ts new file mode 100644 index 0000000..798d748 --- /dev/null +++ b/src/i18n/locales/en.ts @@ -0,0 +1,142 @@ +import { TranslationKeys } from './tr'; + +export const en: TranslationKeys = { + // Navigation + nav: { + home: 'Home', + services: 'Services', + projects: 'Projects', + about: 'About', + blog: 'Lab Notes', + contact: 'Contact', + }, + + // Hero Section + hero: { + badge: 'NEXT-GEN SOFTWARE LABORATORY', + title: 'Coding the', + titleHighlight: 'Future', + description: 'Ankara-based R&D laboratory with global vision. We accelerate your digital transformation with web, mobile, AI, and blockchain technologies.', + cta: 'Start Your Project', + ctaSecondary: 'Explore Our Solutions', + }, + + // Services Section + services: { + badge: 'OUR EXPERTISE', + title: 'Technology Solutions', + description: 'We build the digital future of your business with cutting-edge tools and methodologies.', + items: { + web: { + title: 'Web Development', + description: 'High-performance, SEO-friendly web applications with Next.js, React, and modern technologies.', + }, + mobile: { + title: 'Mobile Apps', + description: 'Native-performance cross-platform applications for iOS and Android with React Native and Flutter.', + }, + ai: { + title: 'Artificial Intelligence', + description: 'Machine learning, natural language processing, and computer vision solutions.', + }, + blockchain: { + title: 'Blockchain', + description: 'Smart contracts, DeFi protocols, and Web3 integrations.', + }, + cloud: { + title: 'Cloud & DevOps', + description: 'Scalable infrastructure and CI/CD pipelines on AWS, Azure, and GCP.', + }, + security: { + title: 'Cybersecurity', + description: 'Penetration testing, security audits, and secure software development.', + }, + }, + }, + + // Projects Section + projects: { + badge: 'PORTFOLIO', + title: 'Featured Projects', + viewAll: 'View All Projects', + viewProject: 'View Project', + }, + + // Stats Section + stats: { + projects: 'Completed Projects', + partners: 'Business Partners', + experience: 'Years Experience', + success: 'Project Success Rate', + }, + + // Testimonials Section + testimonials: { + badge: 'TESTIMONIALS', + title: 'What Our Partners Say?', + }, + + // FAQ Section + faq: { + badge: 'FAQ', + title: 'Frequently Asked Questions', + }, + + // About Section + about: { + badge: 'ABOUT US', + title: 'Who is ZeroSixLab?', + description: 'We are an Ankara-based software and R&D laboratory with a global vision. We lead digital transformation for businesses using modern technologies.', + mission: 'Our Mission', + missionText: 'To democratize technology and unlock the digital potential of businesses of all sizes.', + vision: 'Our Vision', + visionText: 'To contribute to Turkey\'s presence on the global technology stage.', + }, + + // Contact Section + contact: { + badge: 'CONTACT', + title: 'Let\'s Discuss Your Project', + description: 'Planning a new project? We\'re excited to hear your ideas and discuss how we can help.', + form: { + name: 'Name', + email: 'Email', + subject: 'Subject', + message: 'Message', + send: 'Send Message', + sending: 'Sending...', + success: 'Your message has been sent successfully!', + error: 'Failed to send message. Please try again.', + }, + }, + + // Footer + footer: { + description: 'Ankara-based, globally-minded next-generation software and R&D laboratory.', + explore: 'Explore', + services: 'Services', + contact: 'Contact Us', + rights: 'All Rights Reserved.', + systemStatus: 'System Status', + operational: 'All Systems Operational', + }, + + // Common + common: { + learnMore: 'Learn More', + getStarted: 'Get Started', + viewDetails: 'View Details', + backToHome: 'Back to Home', + loading: 'Loading...', + error: 'Error', + success: 'Success', + }, + + // 404 Page + notFound: { + title: 'Page Not Found', + description: 'The page you\'re looking for may have been moved, deleted, or never existed.', + backHome: 'Back to Home', + goBack: 'Go Back', + }, +}; diff --git a/src/i18n/locales/tr.ts b/src/i18n/locales/tr.ts new file mode 100644 index 0000000..2d3fdbd --- /dev/null +++ b/src/i18n/locales/tr.ts @@ -0,0 +1,142 @@ +export const tr = { + // Navigation + nav: { + home: 'Ana Sayfa', + services: 'Çözümler', + projects: 'Projeler', + about: 'Hakkımızda', + blog: 'Lab Notları', + contact: 'İletişim', + }, + + // Hero Section + hero: { + badge: 'YENİ NESİL YAZILIM LABORATUVARI', + title: 'Geleceği', + titleHighlight: 'Kodluyoruz', + description: 'Ankara merkezli, global vizyonlu Ar-Ge laboratuvarı. Web, mobil, yapay zeka ve blockchain teknolojileriyle dijital dönüşümünüzü hızlandırıyoruz.', + cta: 'Projeni Başlat', + ctaSecondary: 'Çözümlerimizi Keşfet', + }, + + // Services Section + services: { + badge: 'UZMANLIK ALANLARIMIZ', + title: 'Teknoloji Çözümlerimiz', + description: 'Son teknoloji araçlar ve metodolojilerle işletmenizin dijital geleceğini inşa ediyoruz.', + items: { + web: { + title: 'Web Geliştirme', + description: 'Next.js, React ve modern teknolojilerle yüksek performanslı, SEO uyumlu web uygulamaları.', + }, + mobile: { + title: 'Mobil Uygulama', + description: 'React Native ve Flutter ile iOS ve Android için native performanslı cross-platform uygulamalar.', + }, + ai: { + title: 'Yapay Zeka', + description: 'Makine öğrenimi, doğal dil işleme ve bilgisayarlı görü çözümleri.', + }, + blockchain: { + title: 'Blockchain', + description: 'Akıllı sözleşmeler, DeFi protokolleri ve Web3 entegrasyonları.', + }, + cloud: { + title: 'Cloud & DevOps', + description: 'AWS, Azure, GCP üzerinde ölçeklenebilir altyapı ve CI/CD pipeline\'ları.', + }, + security: { + title: 'Siber Güvenlik', + description: 'Penetrasyon testleri, güvenlik denetimleri ve güvenli yazılım geliştirme.', + }, + }, + }, + + // Projects Section + projects: { + badge: 'PORTFÖLYİMİZ', + title: 'Öne Çıkan Projeler', + viewAll: 'Tüm Projeleri Gör', + viewProject: 'Projeyi İncele', + }, + + // Stats Section + stats: { + projects: 'Tamamlanan Proje', + partners: 'İş Ortağı', + experience: 'Yıllık Deneyim', + success: 'Proje Başarı Oranı', + }, + + // Testimonials Section + testimonials: { + badge: 'REFERANSLAR', + title: 'İş Ortaklarımız Ne Diyor?', + }, + + // FAQ Section + faq: { + badge: 'SSS', + title: 'Sıkça Sorulan Sorular', + }, + + // About Section + about: { + badge: 'HAKKIMIZDA', + title: 'ZeroSixLab Kimdir?', + description: 'Ankara merkezli, global vizyonlu bir yazılım ve Ar-Ge laboratuvarıyız. Modern teknolojilerle işletmelerin dijital dönüşümüne öncülük ediyoruz.', + mission: 'Misyonumuz', + missionText: 'Teknolojiyi demokratikleştirmek ve her ölçekteki işletmenin dijital potansiyelini açığa çıkarmak.', + vision: 'Vizyonumuz', + visionText: 'Türkiye\'nin global teknoloji sahnesinde söz sahibi olmasına katkıda bulunmak.', + }, + + // Contact Section + contact: { + badge: 'İLETİŞİM', + title: 'Projenizi Konuşalım', + description: 'Yeni bir proje mi planlıyorsunuz? Fikirlerinizi dinlemek ve size nasıl yardımcı olabileceğimizi konuşmak için sabırsızlanıyoruz.', + form: { + name: 'İsim', + email: 'E-posta', + subject: 'Konu', + message: 'Mesaj', + send: 'Mesaj Gönder', + sending: 'Gönderiliyor...', + success: 'Mesajınız başarıyla gönderildi!', + error: 'Mesaj gönderilemedi. Lütfen tekrar deneyin.', + }, + }, + + // Footer + footer: { + description: 'Ankara merkezli, global vizyonlu yeni nesil yazılım ve Ar-Ge laboratuvarı.', + explore: 'Keşfet', + services: 'Hizmetler', + contact: 'Bize Ulaşın', + rights: 'Tüm Hakları Saklıdır.', + systemStatus: 'Sistem Durumu', + operational: 'Tüm Sistemler Çalışıyor', + }, + + // Common + common: { + learnMore: 'Daha Fazla', + getStarted: 'Başla', + viewDetails: 'Detayları Gör', + backToHome: 'Ana Sayfaya Dön', + loading: 'Yükleniyor...', + error: 'Hata', + success: 'Başarılı', + }, + + // 404 Page + notFound: { + title: 'Sayfa Bulunamadı', + description: 'Aradığınız sayfa taşınmış, silinmiş veya hiç var olmamış olabilir.', + backHome: 'Ana Sayfaya Dön', + goBack: 'Geri Git', + }, +} as const; + +export type TranslationKeys = typeof tr;