Ekip Son
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "ZeroSixLab",
|
"name": "ZeroSixLab",
|
||||||
"short_name": "ZSL",
|
"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": "/",
|
"start_url": "/",
|
||||||
"display": "standalone",
|
"display": "standalone",
|
||||||
"background_color": "#0A0E17",
|
"background_color": "#0A0E17",
|
||||||
@@ -11,69 +11,17 @@
|
|||||||
"lang": "tr",
|
"lang": "tr",
|
||||||
"icons": [
|
"icons": [
|
||||||
{
|
{
|
||||||
"src": "/icons/icon-72x72.png",
|
"src": "/icon",
|
||||||
"sizes": "72x72",
|
"sizes": "32x32",
|
||||||
"type": "image/png",
|
"type": "image/png"
|
||||||
"purpose": "maskable any"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"src": "/icons/icon-96x96.png",
|
"src": "/apple-icon",
|
||||||
"sizes": "96x96",
|
"sizes": "180x180",
|
||||||
"type": "image/png",
|
"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"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"categories": ["business", "productivity", "utilities"],
|
"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": [],
|
"related_applications": [],
|
||||||
"prefer_related_applications": false
|
"prefer_related_applications": false
|
||||||
}
|
}
|
||||||
|
|||||||
26
src/app/apple-icon.tsx
Normal file
26
src/app/apple-icon.tsx
Normal file
@@ -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(
|
||||||
|
(
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
width: '100%',
|
||||||
|
height: '100%',
|
||||||
|
display: 'flex',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
background: 'linear-gradient(135deg, #00D4FF 0%, #0891b2 100%)',
|
||||||
|
borderRadius: '36px',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={{ fontSize: '100px' }}>🐱</div>
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
{ ...size }
|
||||||
|
);
|
||||||
|
}
|
||||||
26
src/app/icon.tsx
Normal file
26
src/app/icon.tsx
Normal file
@@ -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(
|
||||||
|
(
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
width: '100%',
|
||||||
|
height: '100%',
|
||||||
|
display: 'flex',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
background: 'linear-gradient(135deg, #00D4FF 0%, #0891b2 100%)',
|
||||||
|
borderRadius: '6px',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={{ fontSize: '20px' }}>🐱</div>
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
{ ...size }
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
import type { Metadata, Viewport } from "next";
|
import type { Metadata, Viewport } from "next";
|
||||||
import { Inter, Orbitron } from "next/font/google";
|
import { Inter, Orbitron } from "next/font/google";
|
||||||
import { Analytics } from '@vercel/analytics/next';
|
import { Analytics } from '@vercel/analytics/next';
|
||||||
|
import { LocaleProvider } from '@/context/LocaleContext';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import "./globals.css";
|
import "./globals.css";
|
||||||
|
|
||||||
@@ -92,14 +93,16 @@ export default function RootLayout({
|
|||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin="anonymous" />
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin="anonymous" />
|
||||||
</head>
|
</head>
|
||||||
<body className={`${inter.variable} ${orbitron.variable} font-sans bg-zsl-bg text-zsl-text`}>
|
<body className={`${inter.variable} ${orbitron.variable} font-sans bg-zsl-bg text-zsl-text`}>
|
||||||
|
<LocaleProvider>
|
||||||
<a href="#main-content" className="skip-link">
|
<a href="#main-content" className="skip-link">
|
||||||
Ana içeriğe atla
|
Ana i\u00e7eri\u011fe atla
|
||||||
</a>
|
</a>
|
||||||
<main id="main-content">
|
<main id="main-content">
|
||||||
{children}
|
{children}
|
||||||
</main>
|
</main>
|
||||||
<Analytics />
|
<Analytics />
|
||||||
<div className="scanlines"></div>
|
<div className="scanlines"></div>
|
||||||
|
</LocaleProvider>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
);
|
);
|
||||||
|
|||||||
168
src/app/opengraph-image.tsx
Normal file
168
src/app/opengraph-image.tsx
Normal file
@@ -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(
|
||||||
|
(
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
height: '100%',
|
||||||
|
width: '100%',
|
||||||
|
display: 'flex',
|
||||||
|
flexDirection: 'column',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
backgroundColor: '#050B14',
|
||||||
|
backgroundImage: 'radial-gradient(circle at 25% 25%, #0a192f 0%, #050B14 50%)',
|
||||||
|
position: 'relative',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{/* Grid Pattern */}
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
position: 'absolute',
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
right: 0,
|
||||||
|
bottom: 0,
|
||||||
|
backgroundImage: 'linear-gradient(rgba(0,212,255,0.03) 1px, transparent 1px), linear-gradient(90deg, rgba(0,212,255,0.03) 1px, transparent 1px)',
|
||||||
|
backgroundSize: '50px 50px',
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{/* Glow Effect */}
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
position: 'absolute',
|
||||||
|
top: '50%',
|
||||||
|
left: '50%',
|
||||||
|
transform: 'translate(-50%, -50%)',
|
||||||
|
width: '600px',
|
||||||
|
height: '600px',
|
||||||
|
background: 'radial-gradient(circle, rgba(0,212,255,0.15) 0%, transparent 70%)',
|
||||||
|
borderRadius: '50%',
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{/* Logo/Brand */}
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
display: 'flex',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
marginBottom: '30px',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{/* Cat Icon */}
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
display: 'flex',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
width: '120px',
|
||||||
|
height: '120px',
|
||||||
|
borderRadius: '24px',
|
||||||
|
background: 'linear-gradient(135deg, #00D4FF 0%, #0891b2 100%)',
|
||||||
|
marginRight: '24px',
|
||||||
|
fontSize: '60px',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
🐱
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Text */}
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
display: 'flex',
|
||||||
|
flexDirection: 'column',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
style={{
|
||||||
|
fontSize: '72px',
|
||||||
|
fontWeight: 'bold',
|
||||||
|
color: 'white',
|
||||||
|
letterSpacing: '-2px',
|
||||||
|
lineHeight: 1,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
ZeroSixLab
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
style={{
|
||||||
|
fontSize: '24px',
|
||||||
|
color: '#00D4FF',
|
||||||
|
letterSpacing: '8px',
|
||||||
|
textTransform: 'uppercase',
|
||||||
|
marginTop: '8px',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
SOFTWARE LAB
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Tagline */}
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
fontSize: '32px',
|
||||||
|
color: '#94A3B8',
|
||||||
|
marginTop: '20px',
|
||||||
|
textAlign: 'center',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Geleceği Kodlayan Laboratuvar
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Tech Tags */}
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
display: 'flex',
|
||||||
|
gap: '16px',
|
||||||
|
marginTop: '40px',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{['Web', 'Mobil', 'AI', 'Blockchain'].map((tag) => (
|
||||||
|
<div
|
||||||
|
key={tag}
|
||||||
|
style={{
|
||||||
|
padding: '8px 20px',
|
||||||
|
borderRadius: '20px',
|
||||||
|
border: '1px solid rgba(0,212,255,0.3)',
|
||||||
|
color: '#00D4FF',
|
||||||
|
fontSize: '18px',
|
||||||
|
background: 'rgba(0,212,255,0.1)',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{tag}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Bottom URL */}
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
position: 'absolute',
|
||||||
|
bottom: '40px',
|
||||||
|
fontSize: '20px',
|
||||||
|
color: '#64748b',
|
||||||
|
letterSpacing: '2px',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
zerosixlab.com
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
{
|
||||||
|
...size,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -15,6 +15,7 @@ import { PartnerLogos } from '@/components/PartnerLogos';
|
|||||||
import { ScrollAnimation } from '@/components/ScrollAnimation';
|
import { ScrollAnimation } from '@/components/ScrollAnimation';
|
||||||
import { CookieBanner } from '@/components/CookieBanner';
|
import { CookieBanner } from '@/components/CookieBanner';
|
||||||
import { ProjectModal } from '@/components/ProjectModal';
|
import { ProjectModal } from '@/components/ProjectModal';
|
||||||
|
import { LanguageSwitcher } from '@/components/LanguageSwitcher';
|
||||||
import { NavPage } from '@/types';
|
import { NavPage } from '@/types';
|
||||||
|
|
||||||
// Social Links
|
// Social Links
|
||||||
@@ -207,6 +208,54 @@ export default function Home() {
|
|||||||
color: "primary",
|
color: "primary",
|
||||||
desc: "Temiz kod prensipleriyle çalışan güçlü algoritma geliştiricisi.",
|
desc: "Temiz kod prensipleriyle çalışan güçlü algoritma geliştiricisi.",
|
||||||
stats: { java: 90, backend: 95, bugs: 0 }
|
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() {
|
|||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Language Switcher */}
|
||||||
|
<div className="hidden md:block">
|
||||||
|
<LanguageSwitcher />
|
||||||
|
</div>
|
||||||
|
|
||||||
{/* Mobile Menu Button */}
|
{/* Mobile Menu Button */}
|
||||||
<div className="md:hidden z-50">
|
<div className="md:hidden z-50">
|
||||||
<button onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)} className="text-white p-2">
|
<button onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)} className="text-white p-2">
|
||||||
|
|||||||
168
src/app/twitter-image.tsx
Normal file
168
src/app/twitter-image.tsx
Normal file
@@ -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(
|
||||||
|
(
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
height: '100%',
|
||||||
|
width: '100%',
|
||||||
|
display: 'flex',
|
||||||
|
flexDirection: 'column',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
backgroundColor: '#050B14',
|
||||||
|
backgroundImage: 'radial-gradient(circle at 25% 25%, #0a192f 0%, #050B14 50%)',
|
||||||
|
position: 'relative',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{/* Grid Pattern */}
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
position: 'absolute',
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
right: 0,
|
||||||
|
bottom: 0,
|
||||||
|
backgroundImage: 'linear-gradient(rgba(0,212,255,0.03) 1px, transparent 1px), linear-gradient(90deg, rgba(0,212,255,0.03) 1px, transparent 1px)',
|
||||||
|
backgroundSize: '50px 50px',
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{/* Glow Effect */}
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
position: 'absolute',
|
||||||
|
top: '50%',
|
||||||
|
left: '50%',
|
||||||
|
transform: 'translate(-50%, -50%)',
|
||||||
|
width: '600px',
|
||||||
|
height: '600px',
|
||||||
|
background: 'radial-gradient(circle, rgba(0,212,255,0.15) 0%, transparent 70%)',
|
||||||
|
borderRadius: '50%',
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{/* Logo/Brand */}
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
display: 'flex',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
marginBottom: '30px',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{/* Cat Icon */}
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
display: 'flex',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
width: '120px',
|
||||||
|
height: '120px',
|
||||||
|
borderRadius: '24px',
|
||||||
|
background: 'linear-gradient(135deg, #00D4FF 0%, #0891b2 100%)',
|
||||||
|
marginRight: '24px',
|
||||||
|
fontSize: '60px',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
🐱
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Text */}
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
display: 'flex',
|
||||||
|
flexDirection: 'column',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
style={{
|
||||||
|
fontSize: '72px',
|
||||||
|
fontWeight: 'bold',
|
||||||
|
color: 'white',
|
||||||
|
letterSpacing: '-2px',
|
||||||
|
lineHeight: 1,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
ZeroSixLab
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
style={{
|
||||||
|
fontSize: '24px',
|
||||||
|
color: '#00D4FF',
|
||||||
|
letterSpacing: '8px',
|
||||||
|
textTransform: 'uppercase',
|
||||||
|
marginTop: '8px',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
SOFTWARE LAB
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Tagline */}
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
fontSize: '32px',
|
||||||
|
color: '#94A3B8',
|
||||||
|
marginTop: '20px',
|
||||||
|
textAlign: 'center',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Geleceği Kodlayan Laboratuvar
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Tech Tags */}
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
display: 'flex',
|
||||||
|
gap: '16px',
|
||||||
|
marginTop: '40px',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{['Web', 'Mobil', 'AI', 'Blockchain'].map((tag) => (
|
||||||
|
<div
|
||||||
|
key={tag}
|
||||||
|
style={{
|
||||||
|
padding: '8px 20px',
|
||||||
|
borderRadius: '20px',
|
||||||
|
border: '1px solid rgba(0,212,255,0.3)',
|
||||||
|
color: '#00D4FF',
|
||||||
|
fontSize: '18px',
|
||||||
|
background: 'rgba(0,212,255,0.1)',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{tag}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Bottom URL */}
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
position: 'absolute',
|
||||||
|
bottom: '40px',
|
||||||
|
fontSize: '20px',
|
||||||
|
color: '#64748b',
|
||||||
|
letterSpacing: '2px',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
zerosixlab.com
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
{
|
||||||
|
...size,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
74
src/components/LanguageSwitcher.tsx
Normal file
74
src/components/LanguageSwitcher.tsx
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
'use client';
|
||||||
|
|
||||||
|
import { useState, useRef, useEffect } from 'react';
|
||||||
|
import { useLocale } from '@/context/LocaleContext';
|
||||||
|
import { locales, localeNames, localeFlags, Locale } from '@/i18n/config';
|
||||||
|
|
||||||
|
export function LanguageSwitcher() {
|
||||||
|
const { locale, setLocale } = useLocale();
|
||||||
|
const [isOpen, setIsOpen] = useState(false);
|
||||||
|
const dropdownRef = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
|
// Close dropdown when clicking outside
|
||||||
|
useEffect(() => {
|
||||||
|
function handleClickOutside(event: MouseEvent) {
|
||||||
|
if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {
|
||||||
|
setIsOpen(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener('mousedown', handleClickOutside);
|
||||||
|
return () => document.removeEventListener('mousedown', handleClickOutside);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const handleSelect = (newLocale: Locale) => {
|
||||||
|
setLocale(newLocale);
|
||||||
|
setIsOpen(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="relative" ref={dropdownRef}>
|
||||||
|
<button
|
||||||
|
onClick={() => setIsOpen(!isOpen)}
|
||||||
|
className="flex items-center gap-2 px-3 py-2 bg-white/5 border border-white/10 rounded-lg hover:border-zsl-primary/50 transition-all font-mono text-sm"
|
||||||
|
aria-label="Dil seçin"
|
||||||
|
aria-expanded={isOpen}
|
||||||
|
>
|
||||||
|
<span className="text-lg">{localeFlags[locale]}</span>
|
||||||
|
<span className="text-white hidden sm:inline">{localeNames[locale]}</span>
|
||||||
|
<svg
|
||||||
|
className={`w-4 h-4 text-slate-400 transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}`}
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
>
|
||||||
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" />
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
{isOpen && (
|
||||||
|
<div className="absolute right-0 mt-2 w-40 bg-[#0a0f1a] border border-white/10 rounded-lg shadow-xl overflow-hidden z-50 animate-in fade-in slide-in-from-top-2 duration-200">
|
||||||
|
{locales.map((loc) => (
|
||||||
|
<button
|
||||||
|
key={loc}
|
||||||
|
onClick={() => handleSelect(loc)}
|
||||||
|
className={`w-full flex items-center gap-3 px-4 py-3 font-mono text-sm transition-colors ${
|
||||||
|
locale === loc
|
||||||
|
? 'bg-zsl-primary/20 text-zsl-primary'
|
||||||
|
: 'text-slate-300 hover:bg-white/5 hover:text-white'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
<span className="text-lg">{localeFlags[loc]}</span>
|
||||||
|
<span>{localeNames[loc]}</span>
|
||||||
|
{locale === loc && (
|
||||||
|
<svg className="w-4 h-4 ml-auto" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" />
|
||||||
|
</svg>
|
||||||
|
)}
|
||||||
|
</button>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
61
src/context/LocaleContext.tsx
Normal file
61
src/context/LocaleContext.tsx
Normal file
@@ -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<LocaleContextType | undefined>(undefined);
|
||||||
|
|
||||||
|
const LOCALE_STORAGE_KEY = 'zsl-locale';
|
||||||
|
|
||||||
|
export function LocaleProvider({ children }: { children: ReactNode }) {
|
||||||
|
const [locale, setLocaleState] = useState<Locale>(defaultLocale);
|
||||||
|
const [translations, setTranslations] = useState<TranslationKeys>(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 (
|
||||||
|
<LocaleContext.Provider value={{ locale, setLocale, t: translations }}>
|
||||||
|
{children}
|
||||||
|
</LocaleContext.Provider>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useLocale() {
|
||||||
|
const context = useContext(LocaleContext);
|
||||||
|
if (context === undefined) {
|
||||||
|
throw new Error('useLocale must be used within a LocaleProvider');
|
||||||
|
}
|
||||||
|
return context;
|
||||||
|
}
|
||||||
14
src/i18n/config.ts
Normal file
14
src/i18n/config.ts
Normal file
@@ -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<Locale, string> = {
|
||||||
|
tr: 'Türkçe',
|
||||||
|
en: 'English',
|
||||||
|
};
|
||||||
|
|
||||||
|
export const localeFlags: Record<Locale, string> = {
|
||||||
|
tr: '🇹🇷',
|
||||||
|
en: '🇬🇧',
|
||||||
|
};
|
||||||
31
src/i18n/index.ts
Normal file
31
src/i18n/index.ts
Normal file
@@ -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<string, unknown>)[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';
|
||||||
142
src/i18n/locales/en.ts
Normal file
142
src/i18n/locales/en.ts
Normal file
@@ -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',
|
||||||
|
},
|
||||||
|
};
|
||||||
142
src/i18n/locales/tr.ts
Normal file
142
src/i18n/locales/tr.ts
Normal file
@@ -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;
|
||||||
Reference in New Issue
Block a user