Compare commits

..

No commits in common. "b04567bab6db8cd84e279af32e2b220a8efc8162" and "1e2466fd37f8a22063f0e7c957aa06ea9342c982" have entirely different histories.

67 changed files with 190 additions and 11962 deletions

View file

@ -1,5 +1,5 @@
{
"name": "Kadifeteks Workflow",
"name": "My workflow",
"nodes": [
{
"parameters": {
@ -21,7 +21,7 @@
},
{
"parameters": {
"jsCode": "const q = $('Webhook').item.json.body.question.toLowerCase();\n\nif (q.includes(\"tahmin\") || q.includes(\"gelecek\") || q.includes(\"trend\")) {\n return [{ json: { type: \"analyze\", question: q } }];\n}\n\nif (q.includes(\"getir\") || q.includes(\"liste\") || q.includes(\"kaç\") || q.includes(\"göster\")) {\n return [{ json: { type: \"query\", question: q } }];\n}\n\nreturn [{ json: { type: \"chat\", question: q } }];"
"jsCode": "const q = $('Webhook').item.json.body.question.toLowerCase();\n\nif (q.includes(\"tahmin\") || q.includes(\"gelecek\") || q.includes(\"trend\")) {\n return [{ json: { type: \"analyze\", question: q } }];\n}\n\nif (q.includes(\"getir\") || q.includes(\"liste\") || q.includes(\"kaç\")) {\n return [{ json: { type: \"query\", question: q } }];\n}\n\nreturn [{ json: { type: \"chat\", question: q } }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
@ -211,6 +211,26 @@
"id": "0f14a81e-5f75-4093-ab93-a24a3315ebda",
"name": "AI Query"
},
{
"parameters": {
"modelName": "models/gemini-2.0-flash",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"typeVersion": 1,
"position": [
80,
40
],
"id": "3b370555-d453-4eaf-8cf7-c04722350774",
"name": "Google Gemini Chat Model2",
"credentials": {
"googlePalmApi": {
"id": "g7Ev8dkuHaLU7JbG",
"name": "Google Gemini(PaLM) Api account"
}
}
},
{
"parameters": {
"options": {}
@ -233,12 +253,32 @@
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"typeVersion": 1.3,
"position": [
-660,
260
-700,
340
],
"id": "72d1f63a-4385-4892-a37c-396b07a7e40c",
"name": "Simple Memory"
},
{
"parameters": {
"modelName": "models/gemini-2.0-flash",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"typeVersion": 1,
"position": [
100,
480
],
"id": "922eb62e-090d-4bee-80e4-a6c82a155922",
"name": "Google Gemini Chat Model4",
"credentials": {
"googlePalmApi": {
"id": "g7Ev8dkuHaLU7JbG",
"name": "Google Gemini(PaLM) Api account"
}
}
},
{
"parameters": {
"promptType": "define",
@ -303,6 +343,26 @@
"alwaysOutputData": true,
"onError": "continueRegularOutput"
},
{
"parameters": {
"modelName": "models/gemini-2.0-flash",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"typeVersion": 1,
"position": [
100,
-260
],
"id": "0cddf53c-45c8-4bbb-89e2-41f08ed25999",
"name": "Google Gemini Chat Model1",
"credentials": {
"googlePalmApi": {
"id": "g7Ev8dkuHaLU7JbG",
"name": "Google Gemini(PaLM) Api account"
}
}
},
{
"parameters": {
"assignments": {
@ -350,7 +410,7 @@
},
{
"parameters": {
"functionCode": "import matplotlib.pyplot as plt\nimport io\nimport base64\nimport json\n\n# items listesindeki verilere ulaşırken hata kontrolü ekleyelim\nif len(items) > 0:\n question = items[0].get('question', 'Soru sağlanmadı') # Webhook'tan gelen soru\n sql = items[0].get('sql', 'SQL Sorgusu sağlanmadı') # AI Query'den gelen SQL sorgusu\nelse:\n question = \"Soru sağlanmadı\"\n sql = \"SQL Sorgusu sağlanmadı\"\n\n# SQL Query node'undan alınan sonuçlar\nresultItems = [\n {key: item[key] for key in item if key not in [\"question\", \"sql\"]}\n for item in items\n]\n\n# Dinamik sütun isimlerini almak için ilk öğeyi kullanıyoruz\nif resultItems and isinstance(resultItems[0], dict):\n columns = list(resultItems[0].keys()) # İlk öğedeki tüm sütunları alıyoruz\n\n # Dinamik olarak etiket ve veri sütunlarını belirliyoruz\n labels_column = None\n data_column = None\n\n # Etiket sütunu genellikle metin türünde (string) olacak, veri sütunu ise sayısal türde (int, float) olacak\n for col in columns:\n # Etiket sütunu olarak metin (string) türünde olan sütunu seçiyoruz\n if isinstance(resultItems[0].get(col), str):\n labels_column = col\n\n # Veri sütunu olarak sayısal (int veya float) türünde olan sütunu seçiyoruz\n elif isinstance(resultItems[0].get(col), (int, float)):\n data_column = col\n\n # Etiket ve veri sütunları bulunursa, verileri çekiyoruz\n labels = [item.get(labels_column, \"Bilinmeyen\") for item in resultItems if item.get(labels_column) is not None]\n data = [item.get(data_column, 0) for item in resultItems if item.get(data_column) is not None]\n\nelse:\n labels, data = [], [] # Eğer veri boşsa, etiketsiz ve veri içermeyen bir liste döneriz\n\n# **Önemli**: labels ve data uzunluklarını kontrol etme\nif len(labels) != len(data):\n print(f\"Veri uyumsuzluğu: labels uzunluğu: {len(labels)}, data uzunluğu: {len(data)}\")\n # Aynı uzunluktaki verilere göre filtreleme yapabilirsiniz\n min_length = min(len(labels), len(data))\n labels = labels[:min_length]\n data = data[:min_length]\n\nbase64_image = None\n\n# Eğer etiketsiz veya veri boşsa, görsel oluşturma\nif not labels or not data:\n print(\"Etiketler veya veri listesi boş. Grafik oluşturulamaz.\")\nelse:\n # Grafik oluşturucu fonksiyonu\n def generate_base64_image(labels, data):\n # Grafik boyutunu ve başlıkları ayarlama\n fig, ax = plt.subplots(figsize=(10, 6)) # Grafik boyutunu ayarlama\n bars = ax.bar(labels, data, width=0.6) # Bar grafiği çizme\n\n # Etiketleri döndürme ve sıkışıklığı engelleme\n plt.xticks(rotation=45, ha='right')\n plt.tight_layout()\n\n # Verileri çubukların üstüne yerleştirme (değerlerin büyük olmasını engellemek için formatlama)\n for bar in bars:\n height = bar.get_height() # Her çubuğun yüksekliği\n # Burada sayıları doğru bir formatta gösteriyoruz\n formatted_height = f\"{height:,.0f}\" # Sayıyı binlik ayraçlarla biçimlendiriyoruz\n ax.text(bar.get_x() + bar.get_width() / 2, height, formatted_height, \n ha='center', va='bottom', fontsize=10, color='black')\n\n # Base64 olarak görseli kaydetme\n buf = io.BytesIO()\n plt.savefig(buf, format='png', dpi=72) # Görseli base64'e dönüştürmek için\n buf.seek(0)\n base64_image = base64.b64encode(buf.read()).decode('utf-8')\n buf.close()\n plt.close()\n\n return base64_image\n\n # Grafik görselini base64 formatında almak\n if len(resultItems[0].keys()) <= 3:\n base64_image = generate_base64_image(labels, data)\n\n# Sonuçları döndür\nreturn [{\n \"type\": \"query\",\n \"question\": question,\n \"sql\": sql,\n \"answer\": resultItems,\n \"chart\": base64_image, # Grafik base64 formatında dönüyor\n}]\n"
"functionCode": "import matplotlib.pyplot as plt\nimport io\nimport base64\nimport json\n\n# items listesindeki verilere ulaşırken hata kontrolü ekleyelim\nif len(items) > 0:\n question = items[0].get('question', 'Soru sağlanmadı') # Webhook'tan gelen soru\n sql = items[0].get('sql', 'SQL Sorgusu sağlanmadı') # AI Query'den gelen SQL sorgusu\nelse:\n question = \"Soru sağlanmadı\"\n sql = \"SQL Sorgusu sağlanmadı\"\n\n# SQL Query node'undan alınan sonuçlar\nresultItems = [\n {key: item[key] for key in item if key not in [\"question\", \"sql\"]}\n for item in items\n]\n\n# Dinamik sütun isimlerini almak için ilk öğeyi kullanıyoruz\nif resultItems and isinstance(resultItems[0], dict):\n columns = list(resultItems[0].keys()) # İlk öğedeki tüm sütunları alıyoruz\n\n # Dinamik olarak etiket ve veri sütunlarını belirliyoruz\n labels_column = None\n data_column = None\n\n # Etiket sütunu genellikle metin türünde (string) olacak, veri sütunu ise sayısal türde (int, float) olacak\n for col in columns:\n # Etiket sütunu olarak metin (string) türünde olan sütunu seçiyoruz\n if isinstance(resultItems[0].get(col), str):\n labels_column = col\n\n # Veri sütunu olarak sayısal (int veya float) türünde olan sütunu seçiyoruz\n elif isinstance(resultItems[0].get(col), (int, float)):\n data_column = col\n\n # Etiket ve veri sütunları bulunursa, verileri çekiyoruz\n labels = [item.get(labels_column, \"Bilinmeyen\") for item in resultItems if item.get(labels_column) is not None]\n data = [item.get(data_column, 0) for item in resultItems if item.get(data_column) is not None]\n\nelse:\n labels, data = [], [] # Eğer veri boşsa, etiketsiz ve veri içermeyen bir liste döneriz\n\n# **Önemli**: labels ve data uzunluklarını kontrol etme\nif len(labels) != len(data):\n print(f\"Veri uyumsuzluğu: labels uzunluğu: {len(labels)}, data uzunluğu: {len(data)}\")\n # Aynı uzunluktaki verilere göre filtreleme yapabilirsiniz\n min_length = min(len(labels), len(data))\n labels = labels[:min_length]\n data = data[:min_length]\n\n# Eğer etiketsiz veya veri boşsa, görsel oluşturma\nif not labels or not data:\n print(\"Etiketler veya veri listesi boş. Grafik oluşturulamaz.\")\n base64_image = None\nelse:\n # Grafik oluşturucu fonksiyonu\n def generate_base64_image(labels, data):\n # Grafik boyutunu ve başlıkları ayarlama\n fig, ax = plt.subplots(figsize=(10, 6)) # Grafik boyutunu ayarlama\n bars = ax.bar(labels, data, width=0.6) # Bar grafiği çizme\n\n # Etiketleri döndürme ve sıkışıklığı engelleme\n plt.xticks(rotation=45, ha='right')\n plt.tight_layout()\n\n # Verileri çubukların üstüne yerleştirme (değerlerin büyük olmasını engellemek için formatlama)\n for bar in bars:\n height = bar.get_height() # Her çubuğun yüksekliği\n # Burada sayıları doğru bir formatta gösteriyoruz\n formatted_height = f\"{height:,.0f}\" # Sayıyı binlik ayraçlarla biçimlendiriyoruz\n ax.text(bar.get_x() + bar.get_width() / 2, height, formatted_height, \n ha='center', va='bottom', fontsize=10, color='black')\n\n # Base64 olarak görseli kaydetme\n buf = io.BytesIO()\n plt.savefig(buf, format='png', dpi=72) # Görseli base64'e dönüştürmek için\n buf.seek(0)\n base64_image = base64.b64encode(buf.read()).decode('utf-8')\n buf.close()\n plt.close()\n\n return base64_image\n\n # Grafik görselini base64 formatında almak\n base64_image = generate_base64_image(labels, data)\n\n# Sonuçları döndür\nreturn [{\n \"type\": \"query\",\n \"question\": question,\n \"sql\": sql,\n \"answer\": resultItems,\n \"chart\": base64_image, # Grafik base64 formatında dönüyor\n}]\n"
},
"type": "n8n-nodes-python.pythonFunction",
"typeVersion": 1,
@ -373,66 +433,6 @@
],
"id": "b9c551d0-5011-492a-9ae1-9a585b059073",
"name": "Analyze Python"
},
{
"parameters": {
"modelName": "models/gemini-2.0-flash",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"typeVersion": 1,
"position": [
60,
-320
],
"id": "5ca631b2-0132-4cd3-b8c2-40408600f798",
"name": "Google Gemini Chat Model",
"credentials": {
"googlePalmApi": {
"id": "g7Ev8dkuHaLU7JbG",
"name": "Google Gemini(PaLM) Api account"
}
}
},
{
"parameters": {
"modelName": "models/gemini-2.0-flash",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"typeVersion": 1,
"position": [
100,
100
],
"id": "61fa96f5-e48c-41ea-ad41-a721810f9512",
"name": "Google Gemini Chat Model1",
"credentials": {
"googlePalmApi": {
"id": "g7Ev8dkuHaLU7JbG",
"name": "Google Gemini(PaLM) Api account"
}
}
},
{
"parameters": {
"modelName": "models/gemini-2.0-flash",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"typeVersion": 1,
"position": [
40,
480
],
"id": "479edfdb-252e-42a4-8292-7b35119a492d",
"name": "Google Gemini Chat Model2",
"credentials": {
"googlePalmApi": {
"id": "g7Ev8dkuHaLU7JbG",
"name": "Google Gemini(PaLM) Api account"
}
}
}
],
"pinData": {},
@ -538,6 +538,17 @@
]
]
},
"Google Gemini Chat Model2": {
"ai_languageModel": [
[
{
"node": "AI Query",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"AI Query": {
"main": [
[
@ -591,6 +602,17 @@
]
]
},
"Google Gemini Chat Model4": {
"ai_languageModel": [
[
{
"node": "AI Analyze",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"AI Analyze": {
"main": [
[
@ -629,6 +651,17 @@
]
]
},
"Google Gemini Chat Model1": {
"ai_languageModel": [
[
{
"node": "AI Chat",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Edit Fields1": {
"main": [
[
@ -651,46 +684,13 @@
],
[]
]
},
"Google Gemini Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Chat",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Google Gemini Chat Model1": {
"ai_languageModel": [
[
{
"node": "AI Query",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Google Gemini Chat Model2": {
"ai_languageModel": [
[
{
"node": "AI Analyze",
"type": "ai_languageModel",
"index": 0
}
]
]
}
},
"active": true,
"settings": {
"executionOrder": "v1"
},
"versionId": "3ad2edbb-1c87-4819-a5ed-6cf4c542b4aa",
"versionId": "8231e31d-59e4-488a-b55f-b7b23209223d",
"meta": {
"templateCredsSetupCompleted": true,
"instanceId": "98a3b71e44c71f7839b97fa3055c6c36b0c5f88cbb523bd18d164bd856e39632"

25
company/.gitignore vendored
View file

@ -1,25 +0,0 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
.env

View file

@ -1,12 +0,0 @@
ARG ENV="dev"
FROM node:22-alpine
ARG ENV=$ENV
ENV GENERATE_SOURCEMAP=false
ENV NODE_OPTIONS=--max-old-space-size=16384
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm i
COPY . .
RUN npm run build -- --mode $ENV
CMD ["npm", "run", "preview"]

View file

@ -1 +0,0 @@
# website

View file

@ -1,28 +0,0 @@
import js from '@eslint/js';
import globals from 'globals';
import reactHooks from 'eslint-plugin-react-hooks';
import reactRefresh from 'eslint-plugin-react-refresh';
import tseslint from 'typescript-eslint';
export default tseslint.config(
{ ignores: ['dist'] },
{
extends: [js.configs.recommended, ...tseslint.configs.recommended],
files: ['**/*.{ts,tsx}'],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
},
plugins: {
'react-hooks': reactHooks,
'react-refresh': reactRefresh,
},
rules: {
...reactHooks.configs.recommended.rules,
'react-refresh/only-export-components': [
'warn',
{ allowConstantExport: true },
],
},
}
);

View file

@ -1,13 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Sözsoft</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>

8477
company/package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,44 +0,0 @@
{
"name": "sozsoft",
"private": true,
"version": "1.0.0",
"type": "module",
"scripts": {
"start": "vite",
"build": "vite build",
"preview": "vite preview",
"lint": "eslint . --ext .js,.jsx,.ts,.tsx,.json",
"lint:fix": "npm run lint -- --fix",
"prettier": "prettier --ignore-path .gitignore src --check",
"prettier:fix": "npm run prettier -- --write",
"format": "npm run prettier:fix && npm run lint:fix"
},
"dependencies": {
"glob": "^10.4.5",
"lucide-react": "^0.344.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-router-dom": "^6.22.2",
"react-slick": "^0.30.3",
"rimraf": "^4.4.1",
"slick-carousel": "^1.8.1"
},
"devDependencies": {
"@types/react": "^18.2.55",
"@types/react-dom": "^18.2.19",
"@types/slick-carousel": "^1.6.40",
"@typescript-eslint/eslint-plugin": "^6.21.0",
"@typescript-eslint/parser": "^6.21.0",
"@vitejs/plugin-react": "^4.2.1",
"autoprefixer": "^10.4.17",
"eslint": "^8.57.1",
"eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-react-refresh": "^0.4.5",
"postcss": "^8.4.35",
"tailwindcss": "^3.4.1",
"typescript": "^5.2.2",
"vite": "^5.4.11",
"vite-plugin-dynamic-import": "^1.5.0",
"vite-plugin-pwa": "^0.21.1"
}
}

View file

@ -1,6 +0,0 @@
export default {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

View file

@ -1,33 +0,0 @@
import React from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Layout from './components/layout/Layout';
import Home from './pages/Home';
import Products from './pages/Products';
import Services from './pages/Services';
import About from './pages/About';
import Blog from './pages/Blog';
import Contact from './pages/Contact';
import BlogDetail from './pages/BlogDetail';
import { LanguageProvider } from './context/LanguageContext';
function App() {
return (
<LanguageProvider>
<Router>
<Layout>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/products" element={<Products />} />
<Route path="/services" element={<Services />} />
<Route path="/about" element={<About />} />
<Route path="/blog" element={<Blog />} />
<Route path="/contact" element={<Contact />} />
<Route path="/blog/:id" element={<BlogDetail />} />
</Routes>
</Layout>
</Router>
</LanguageProvider>
);
}
export default App;

View file

@ -1,27 +0,0 @@
import React from 'react';
import { Link } from 'react-router-dom';
import { useLanguage } from '../../context/LanguageContext';
const CallToAction: React.FC = () => {
const { t } = useLanguage();
return (
<section className="bg-blue-600 py-16">
<div className="container mx-auto px-4">
<div className="text-center">
<h2 className="text-3xl font-bold text-white mb-4">
{t('common.getStarted')}
</h2>
<p className="text-white text-lg mb-8">
{t('common.contact')}
</p>
<Link to="/contact" className="bg-white text-blue-600 px-8 py-3 rounded-lg font-semibold hover:bg-blue-50 transition-colors">
{t('common.learnMore')}
</Link>
</div>
</div>
</section>
);
};
export default CallToAction;

View file

@ -1,35 +0,0 @@
import React from 'react';
const CaseStudies: React.FC = () => {
return (
<section className="py-16 bg-gray-50">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="text-center">
<h2 className="text-3xl font-bold text-gray-900 sm:text-4xl">
Case Studies
</h2>
<p className="mt-4 text-lg text-gray-600">
See how we've helped businesses achieve their goals
</p>
</div>
<div className="mt-12 grid gap-8 md:grid-cols-2 lg:grid-cols-3">
{/* Placeholder for case study cards */}
<div className="bg-white rounded-lg shadow-md p-6">
<h3 className="text-xl font-semibold text-gray-900">Case Study 1</h3>
<p className="mt-2 text-gray-600">Coming soon...</p>
</div>
<div className="bg-white rounded-lg shadow-md p-6">
<h3 className="text-xl font-semibold text-gray-900">Case Study 2</h3>
<p className="mt-2 text-gray-600">Coming soon...</p>
</div>
<div className="bg-white rounded-lg shadow-md p-6">
<h3 className="text-xl font-semibold text-gray-900">Case Study 3</h3>
<p className="mt-2 text-gray-600">Coming soon...</p>
</div>
</div>
</div>
</section>
);
};
export default CaseStudies;

View file

@ -1,84 +0,0 @@
import React from 'react';
import { Zap, Users, BarChart, Calendar, BookOpen, CreditCard, MessageSquare, Phone, Shield } from 'lucide-react';
import { useLanguage } from '../../context/LanguageContext';
const Features: React.FC = () => {
const { t } = useLanguage();
const features = [
{
icon: <Users className="w-12 h-12 text-blue-500" />,
title: t('features.reliable'),
description: t('features.reliable.desc')
},
{
icon: <Calendar className="w-12 h-12 text-blue-500" />,
title: t('features.rapid'),
description: t('features.rapid.desc')
},
{
icon: <BookOpen className="w-12 h-12 text-blue-500" />,
title: t('features.expert'),
description: t('features.expert.desc')
},
{
icon: <CreditCard className="w-12 h-12 text-blue-500" />,
title: t('features.muhasebe'),
description: t('features.muhasebe.desc')
},
{
icon: <MessageSquare className="w-12 h-12 text-blue-500" />,
title: t('features.iletisim'),
description: t('features.iletisim.desc'),
},
{
icon: <Phone className="w-12 h-12 text-blue-500" />,
title: t('features.mobil'),
description: t('features.mobil.desc'),
},
{
icon: <BarChart className="w-12 h-12 text-blue-500" />,
title: t('features.scalable'),
description: t('features.scalable.desc')
},
{
icon: <Shield className="w-12 h-12 text-blue-500" />,
title: t('features.guvenlik'),
description: t('features.guvenlik.desc'),
}
];
return (
<section className="py-20 bg-white">
<div className="container mx-auto px-4">
<div className="text-center mb-16">
<h2 className="text-4xl font-bold text-gray-900 mb-4">
{t('features.title')}
</h2>
<p className="text-xl text-gray-600 max-w-2xl mx-auto">
{t('features.subtitle')}
</p>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8">
{features.map((feature, index) => (
<div
key={index}
className="p-8 bg-white rounded-xl shadow-lg hover:shadow-xl transition-shadow duration-300"
>
<div className="mb-6">{feature.icon}</div>
<h3 className="text-xl font-semibold text-gray-900 mb-4">
{feature.title}
</h3>
<p className="text-gray-600">
{feature.description}
</p>
</div>
))}
</div>
</div>
</section>
);
};
export default Features;

View file

@ -1,69 +0,0 @@
import React from 'react';
import { ArrowRight, Code, Globe2, Cpu, Calendar, Users, Shield } from 'lucide-react';
import { Link } from 'react-router-dom';
import { useLanguage } from '../../context/LanguageContext';
const Hero: React.FC = () => {
const { t } = useLanguage();
return (
<div className="relative min-h-screen">
<div className="absolute inset-0 bg-gradient-to-br from-blue-900 via-indigo-900 to-purple-900"></div>
<div className="absolute inset-0 opacity-20" style={{
backgroundImage: 'url("https://images.pexels.com/photos/3183150/pexels-photo-3183150.jpeg?auto=compress&cs=tinysrgb&w=1920")',
backgroundSize: 'cover',
backgroundPosition: 'center',
}}></div>
<div className="relative container mx-auto px-4 pt-32 pb-16">
<div className="max-w-4xl mx-auto text-center text-white">
<h1 className="text-3xl md:text-6xl font-bold mb-6 leading-tight">
{t('hero.title')}
</h1>
<p className="text-xl md:text-2xl text-gray-300 mb-12 leading-relaxed">
{t('hero.subtitle')}
</p>
<div className="flex flex-col md:flex-row justify-center gap-6 mb-16">
<Link
to="/demo"
className="inline-flex items-center justify-center px-8 py-4 bg-gradient-to-r from-blue-500 to-purple-500 hover:from-blue-600 hover:to-purple-600 text-white rounded-lg font-semibold transition-all transform hover:scale-105"
>
{t('hero.cta.consultation')}
<ArrowRight className="ml-2" size={20} />
</Link>
<Link
to="/products"
className="inline-flex items-center justify-center px-8 py-4 bg-white/10 hover:bg-white/20 text-white rounded-lg font-semibold backdrop-blur-sm transition-all transform hover:scale-105"
>
{t('hero.cta.discover')}
</Link>
</div>
<div className="grid grid-cols-1 md:grid-cols-3 gap-8 max-w-4xl mx-auto">
<div className="bg-white/5 backdrop-blur-sm rounded-2xl p-8 text-center transform transition-all hover:scale-105 hover:bg-white/10">
<Calendar className="mx-auto mb-4 text-blue-400" size={40} />
<h3 className="text-xl font-semibold mb-3">{t('hero.service1.title')}</h3>
<p className="text-gray-300">{t('hero.service1.desc')}</p>
</div>
<div className="bg-white/5 backdrop-blur-sm rounded-2xl p-8 text-center transform transition-all hover:scale-105 hover:bg-white/10">
<Users className="mx-auto mb-4 text-purple-400" size={40} />
<h3 className="text-xl font-semibold mb-3">{t('hero.service2.title')}</h3>
<p className="text-gray-300">{t('hero.service2.desc')}</p>
</div>
<div className="bg-white/5 backdrop-blur-sm rounded-2xl p-8 text-center transform transition-all hover:scale-105 hover:bg-white/10">
<Shield className="mx-auto mb-4 text-indigo-400" size={40} />
<h3 className="text-xl font-semibold mb-3">{t('hero.service3.title')}</h3>
<p className="text-gray-300">{t('hero.service3.desc')}</p>
</div>
</div>
</div>
</div>
</div>
);
};
export default Hero;

View file

@ -1,70 +0,0 @@
import React from 'react';
import { Monitor, Smartphone, Server, Database } from 'lucide-react';
import { useLanguage } from '../../context/LanguageContext';
const Solutions: React.FC = () => {
const { t } = useLanguage();
const solutions = [
{
icon: <Monitor className="w-16 h-16 text-white" />,
title: t('solutions.web.title'),
description: t('solutions.web.desc'),
color: 'bg-blue-600'
},
{
icon: <Smartphone className="w-16 h-16 text-white" />,
title: t('solutions.mobile.title'),
description: t('solutions.mobile.desc'),
color: 'bg-purple-600'
},
{
icon: <Server className="w-16 h-16 text-white" />,
title: t('solutions.custom.title'),
description: t('solutions.custom.desc'),
color: 'bg-green-600'
},
{
icon: <Database className="w-16 h-16 text-white" />,
title: t('solutions.database.title'),
description: t('solutions.database.desc'),
color: 'bg-red-600'
}
];
return (
<section className="py-20 bg-gray-50">
<div className="container mx-auto px-4">
<div className="text-center mb-16">
<h2 className="text-4xl font-bold text-gray-900 mb-4">
{t('solutions.title')}
</h2>
<p className="text-xl text-gray-600 max-w-2xl mx-auto">
{t('solutions.subtitle')}
</p>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8">
{solutions.map((solution, index) => (
<div
key={index}
className="group relative overflow-hidden rounded-2xl transition-all duration-300 hover:scale-105"
>
<div className={`${solution.color} p-8 h-full`}>
<div className="mb-6">{solution.icon}</div>
<h3 className="text-2xl font-semibold text-white mb-4">
{solution.title}
</h3>
<p className="text-white/90">
{solution.description}
</p>
</div>
</div>
))}
</div>
</div>
</section>
);
};
export default Solutions;

View file

@ -1,44 +0,0 @@
import React from 'react';
import Slider from 'react-slick';
import 'slick-carousel/slick/slick.css';
import 'slick-carousel/slick/slick-theme.css';
import { useLanguage } from '../../context/LanguageContext';
import { testimonials } from '../../locales/testimonials';
const Testimonials: React.FC = () => {
const { t, language } = useLanguage();
const testimonialsData = testimonials[language];
const settings = {
dots: true,
infinite: true,
speed: 500,
slidesToShow: 3,
slidesToScroll: 1,
autoplay: true,
autoplaySpeed: 5000,
cssEase: "linear"
};
return (
<section className="py-16 bg-gray-50">
<div className="container mx-auto px-4">
<h2 className="text-3xl font-bold text-center mb-12">{t('testimonials.title')}</h2>
<Slider {...settings}>
{testimonialsData.map((testimonial, index) => (
<div key={index} className="px-2">
<div className="bg-white p-6 rounded-lg shadow-md">
<p className="text-gray-600 mb-4">"{testimonial.quote}"</p>
<div className="font-semibold">{testimonial.author}</div>
<div className="text-sm text-gray-500">{testimonial.title}</div>
</div>
</div>
))}
</Slider>
</div>
</section>
);
};
export default Testimonials;

View file

@ -1,151 +0,0 @@
import React from 'react';
import { Mail, Phone, MapPin, Facebook, Twitter, Linkedin, Instagram } from 'lucide-react';
import Logo from './Logo';
import { Link } from 'react-router-dom';
import { useLanguage } from '../../context/LanguageContext';
const Footer: React.FC = () => {
const { t } = useLanguage();
const currentYear = new Date().getFullYear();
return (
<footer className="bg-gray-900 text-white pt-16 pb-8">
<div className="container mx-auto px-4">
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8">
{/* Company Info */}
<div>
<Logo color="#ffffff" />
<p className="mt-4 text-gray-400 text-sm">
{t('footer.companyInfo')}
</p>
<div className="flex space-x-4 mt-6">
<a href="https://facebook.com/sozsoft" target="_blank" rel="noopener noreferrer" className="text-gray-400 hover:text-white transition-colors">
<Facebook size={20} />
</a>
<a href="https://twitter.com/sozsoft" target="_blank" rel="noopener noreferrer" className="text-gray-400 hover:text-white transition-colors">
<Twitter size={20} />
</a>
<a href="https://linkedin.com/sozsoft" target="_blank" rel="noopener noreferrer" className="text-gray-400 hover:text-white transition-colors">
<Linkedin size={20} />
</a>
<a href="https://instagram.com/sozsoft" target="_blank" rel="noopener noreferrer" className="text-gray-400 hover:text-white transition-colors">
<Instagram size={20} />
</a>
</div>
</div>
{/* Quick Links */}
<div>
<h3 className="text-lg font-bold mb-4">{t('footer.quickLinksTitle')}</h3>
<ul className="space-y-2">
<li>
<Link to="/" className="text-gray-400 hover:text-white transition-colors">{t('nav.home')}</Link>
</li>
<li>
<Link to="/products" className="text-gray-400 hover:text-white transition-colors">{t('nav.products')}</Link>
</li>
<li>
<Link to="/services" className="text-gray-400 hover:text-white transition-colors">{t('nav.services')}</Link>
</li>
<li>
<Link to="/about" className="text-gray-400 hover:text-white transition-colors">{t('nav.about')}</Link>
</li>
<li>
<Link to="/blog" className="text-gray-400 hover:text-white transition-colors">{t('nav.blog')}</Link>
</li>
<li>
<Link to="/contact" className="text-gray-400 hover:text-white transition-colors">{t('nav.contact')}</Link>
</li>
</ul>
</div>
{/* Services */}
<div>
<h3 className="text-lg font-bold mb-4">{t('footer.servicesTitle')}</h3>
<ul className="space-y-2">
<li>
<Link to="/services" className="text-gray-400 hover:text-white transition-colors">
{t('services.software.title')}
</Link>
</li>
<li>
<Link to="/services" className="text-gray-400 hover:text-white transition-colors">
{t('services.web.title')}
</Link>
</li>
<li>
<Link to="/services" className="text-gray-400 hover:text-white transition-colors">
{t('services.mobile.title')}
</Link>
</li>
<li>
<Link to="/services" className="text-gray-400 hover:text-white transition-colors">
{t('services.consulting.title')}
</Link>
</li>
<li>
<Link to="/services" className="text-gray-400 hover:text-white transition-colors">
{t('services.maintenance.title')}
</Link>
</li>
</ul>
</div>
{/* Contact Info */}
<div>
<h3 className="text-lg font-bold mb-4">{t('nav.contact')}</h3>
<ul className="space-y-3">
<li className="flex items-start space-x-3">
<MapPin size={20} className="text-gray-400 mt-1 flex-shrink-0" />
<span className="text-gray-400">
{t('footer.address')}
</span>
</li>
<li className="flex items-center space-x-3">
<Phone size={20} className="text-gray-400 flex-shrink-0" />
<a href="tel:+905447697638" className="text-gray-400 hover:text-white transition-colors">
+90 (544) 769 7 638
</a>
</li>
<li className="flex items-center space-x-3">
<Mail size={20} className="text-gray-400 flex-shrink-0" />
<a href="mailto:destek@sozsoft.com" className="text-gray-400 hover:text-white transition-colors">
destek@sozsoft.com
</a>
</li>
</ul>
</div>
</div>
<div className="border-t border-gray-800 mt-12 pt-8">
<div className="flex flex-col md:flex-row justify-between items-center">
<p className="text-gray-400 text-sm">
&copy; {currentYear} Sözsoft. {t('footer.copyright')}
</p>
<div className="mt-4 md:mt-0">
<ul className="flex space-x-6 text-sm">
<li>
<Link to="/about" className="text-gray-400 hover:text-white transition-colors">
{t('footer.privacyPolicy')}
</Link>
</li>
<li>
<Link to="/about" className="text-gray-400 hover:text-white transition-colors">
{t('footer.termsOfUse')}
</Link>
</li>
<li>
<Link to="/sitemap" className="text-gray-400 hover:text-white transition-colors">
{t('footer.sitemap')}
</Link>
</li>
</ul>
</div>
</div>
</div>
</div>
</footer>
);
};
export default Footer;

View file

@ -1,116 +0,0 @@
import React, { useState, useEffect } from "react";
import { Menu, X, Globe } from "lucide-react";
import Logo from "./Logo";
import { Link } from "react-router-dom";
import { useLanguage } from "../../context/LanguageContext";
const Header: React.FC = () => {
const [isOpen, setIsOpen] = useState(false);
const [scrolled, setScrolled] = useState(false);
const { language, setLanguage, t } = useLanguage();
useEffect(() => {
const handleScroll = () => {
const isScrolled = window.scrollY > 10;
if (isScrolled !== scrolled) {
setScrolled(isScrolled);
}
};
window.addEventListener("scroll", handleScroll);
return () => window.removeEventListener("scroll", handleScroll);
}, [scrolled]);
const toggleMenu = () => setIsOpen(!isOpen);
const toggleLanguage = () => setLanguage(language === "en" ? "tr" : "en");
const navLinks = [
{ name: t("nav.home"), path: "/" },
{ name: t("nav.about"), path: "/about" },
{ name: t("nav.products"), path: "/products" },
{ name: t("nav.services"), path: "/services" },
{ name: t("nav.blog"), path: "/blog" },
{ name: t("nav.contact"), path: "/contact" },
{ name: t("nav.demo"), path: "https://kurs.sozsoft.com" },
];
return (
<header
className={`fixed w-full z-50 transition-all duration-300 ${
scrolled
? "bg-gray-900/95 backdrop-blur-sm shadow-md py-2"
: "bg-gray-900/80 backdrop-blur-sm py-4"
}`}
>
<div className="container mx-auto px-4 flex items-center justify-between">
<Link to="/">
<Logo color="#ffffff" />
</Link>
{/* Desktop Navigation */}
<nav className="hidden md:flex items-center space-x-8">
{navLinks.map((link) => (
<Link
key={link.path}
to={link.path}
className={`font-medium text-sm text-white hover:text-blue-400 transition-colors ${
link.name === "Giriş" || link.name === "Login" ? "bg-blue-600 rounded px-2 py-1" : ""
}`}
>
{link.name}
</Link>
))}
<button
onClick={toggleLanguage}
className="flex items-center space-x-1 font-medium text-sm text-white hover:text-blue-400 transition-colors"
>
<Globe size={16} />
<span>{language.toUpperCase()}</span>
</button>
</nav>
{/* Mobile Menu Button */}
<button
className="md:hidden text-white"
onClick={toggleMenu}
aria-label="Toggle menu"
>
{isOpen ? <X size={24} /> : <Menu size={24} />}
</button>
</div>
{/* Mobile Navigation */}
{isOpen && (
<div className="md:hidden bg-gray-900/95 backdrop-blur-sm shadow-lg">
<div className="container mx-auto px-4 py-2">
<nav className="flex flex-col space-y-4 py-4">
{navLinks.map((link) => (
<Link
key={link.path}
to={link.path}
className={`font-medium text-white hover:text-blue-400 transition-colors ${
link.name === "Giriş" || link.name === "Login" ? "bg-blue-600 rounded px-2 py-1" : ""
}`}
onClick={toggleMenu}
>
{link.name}
</Link>
))}
<button
onClick={toggleLanguage}
className="flex items-center space-x-1 font-medium text-white hover:text-blue-400 transition-colors"
>
<Globe size={16} />
<span>{language.toUpperCase()}</span>
</button>
</nav>
</div>
</div>
)}
</header>
);
};
export default Header;

View file

@ -1,28 +0,0 @@
import React, { useEffect } from 'react';
import { useLocation } from 'react-router-dom';
import Header from './Header';
import Footer from './Footer';
interface LayoutProps {
children: React.ReactNode;
}
const Layout: React.FC<LayoutProps> = ({ children }) => {
const location = useLocation();
useEffect(() => {
window.scrollTo(0, 0);
}, [location.pathname]);
return (
<div className="flex flex-col min-h-screen">
<Header />
<main className="flex-grow">
{children}
</main>
<Footer />
</div>
);
};
export default Layout;

View file

@ -1,15 +0,0 @@
import React from 'react';
interface LogoProps {
color?: string;
}
const Logo: React.FC<LogoProps> = ({ color = '#000' }) => {
return (
<div className="flex items-center">
<img src="/img/logo.png" alt="Logo" className="h-14 mr-2" />
</div>
);
};
export default Logo;

View file

@ -1,805 +0,0 @@
import React, { createContext, useContext, useState } from "react";
type Language = "tr" | "en";
interface LanguageContextType {
language: Language;
setLanguage: (lang: Language) => void;
t: (key: string) => string;
}
const translations = {
tr: {
// Navigation
"nav.home": "Ana Sayfa",
"nav.about": "Hakkımızda",
"nav.products": "Ürünler",
"nav.services": "Hizmetler",
"nav.demo": "Giriş",
"nav.blog": "Blog",
"nav.contact": "İletişim",
// Hero Section
"hero.title": "Türkiye'nin Lider Dil Kursu Yazılımı",
"hero.subtitle":
"20 yılı aşkın tecrübemizle, yabancı dil okulları ve kurslar için özel olarak geliştirdiğimiz yazılım çözümlerimizle işletmenizi dijital dünyada bir adım öne taşıyoruz.",
"hero.cta.consultation": "Ücretsiz Demo İsteyin",
"hero.cta.discover": "Ürünlerimizi Keşfedin",
"hero.service1.title": "Kullandıkça Öde",
"hero.service1.desc":
"Aylık veya yıllık esnek ödeme seçenekleriyle, ihtiyacınız kadar kullanın",
"hero.service2.title": "Çoklu Şube Yönetimi",
"hero.service2.desc": "Tüm şubelerinizi tek bir sistemden kolayca yönetin",
"hero.service3.title": "7/24 Güvenli Erişim",
"hero.service3.desc": "İnternetin olduğu her yerden güvenli erişim imkanı",
// Features Section
"features.title": "Neden Sözsoft?",
"features.subtitle":
"Türkiye'de sadece yabancı dil okulları ve kurslar için özel olarak geliştirilmiş, kapsamlı yönetim yazılımı",
"features.reliable": "Öğrenci Yönetimi",
"features.reliable.desc":
"Öğrenci kayıtları, devam takibi, sınav sonuçları ve ödemeler tek platformda",
"features.rapid": "Sınıf Planlaması",
"features.rapid.desc":
"Kolay sınıf oluşturma, öğretmen atama ve ders programı yönetimi",
"features.expert": "Eğitim Takibi",
"features.expert.desc":
"Seviye bazlı eğitim takibi, sınav ve ödev yönetimi",
"features.scalable": "Detaylı Raporlama",
"features.scalable.desc":
"Performans analizi, finansal raporlar ve istatistikler",
"features.muhasebe": "Muhasebe Yönetimi",
"features.muhasebe.desc":
"Gelir-gider takibi, taksit planları ve otomatik maaş hesaplama",
"features.iletisim": "İletişim Araçları",
"features.iletisim.desc":
"Toplu SMS ve e-posta gönderimi, veli bilgilendirme sistemi",
"features.mobil": "Mobil Erişim",
"features.mobil.desc":
"iOS ve Android uygulamalarıyla her yerden yönetim imkanı",
"features.guvenlik": "Güvenlik",
"features.guvenlik.desc":
"IP kısıtlama, yetkilendirme ve veri yedekleme özellikleri",
// Solutions Section
"solutions.title": "Çözümlerimiz",
"solutions.subtitle": "İşletmenizin ihtiyaçlarına özel teknoloji çözümleri",
"solutions.web.title": "Web Uygulamaları",
"solutions.web.desc":
"Modern ve kullanıcı dostu web uygulamaları geliştiriyoruz.",
"solutions.mobile.title": "Mobil Uygulamalar",
"solutions.mobile.desc":
"iOS ve Android için native mobil uygulamalar geliştiriyoruz.",
"solutions.custom.title": "Özel Yazılımlar",
"solutions.custom.desc": "İşletmenize özel yazılım çözümleri sunuyoruz.",
"solutions.database.title": "Veritabanı Sistemleri",
"solutions.database.desc":
"Güvenli ve performanslı veritabanı sistemleri kuruyoruz.",
// Products Page
"products.title": "Ürünlerimiz",
"products.subtitle":
"İşletmenizin ihtiyaçlarına özel geliştirdiğimiz yazılım çözümleri",
"products.kurs.title": "Kurs Yönetim Otomasyonu",
"products.kurs.desc":
"İşletmenizin tüm süreçlerini tek bir platformdan yönetin.",
"products.crm.title": "CRM Sistemi",
"products.crm.desc": "Müşteri ilişkilerinizi etkin bir şekilde yönetin.",
"products.ecommerce.title": "E-Ticaret Platformu",
"products.ecommerce.desc": "Online satış kanalınızı güçlendirin.",
"products.hr.title": "İnsan Kaynakları Yazılımı",
"products.hr.desc": "İK süreçlerinizi dijitalleştirin.",
"products.kurs.features.inventory": "Stok Yönetimi",
"products.kurs.features.purchasing": "Satın Alma Yönetimi",
"products.kurs.features.sales": "Satış Yönetimi",
"products.kurs.features.accounting": "Muhasebe Yönetimi",
"products.kurs.features.reporting": "Raporlama",
"products.kurs.features.mobile": "Mobil Erişim",
"products.crm.features.tracking": "Müşteri Takibi",
"products.crm.features.opportunities": "Fırsat Yönetimi",
"products.crm.features.email": "E-posta Entegrasyonu",
"products.crm.features.tasks": "Görev Yönetimi",
"products.crm.features.calendar": "Takvim Entegrasyonu",
"products.crm.features.analytics": "Analitik Raporlama",
"products.ecommerce.features.responsive": "Duyarlı Tasarım",
"products.ecommerce.features.payment": "Güvenli Ödeme Sistemleri",
"products.ecommerce.features.inventory": "Stok Yönetimi",
"products.ecommerce.features.seo": "SEO Optimizasyonu",
"products.ecommerce.features.analytics": "E-ticaret Analitiği",
"products.ecommerce.features.marketplace": "Pazar Yeri Entegrasyonu",
"products.hr.features.personnel": "Personel Yönetimi",
"products.hr.features.leave": "İzin Yönetimi",
"products.hr.features.performance": "Performans Yönetimi",
"products.hr.features.payroll": "Bordro Yönetimi",
"products.hr.features.training": "Eğitim Yönetimi",
"products.hr.features.digital": "Dijital İK Süreçleri",
"products.cta.title": "Daha Fazla Bilgi",
"products.cta.description":
"İşletmenizin ihtiyaçlarına en uygun çözümleri keşfetmek için ürünlerimizi inceleyin veya bizimle iletişime geçin.",
"products.cta.demo": "Demo Talep Edin",
"services.cta.title": "Dijital Dönüşüm Yolculuğunuza Başlayın",
"services.cta.description":
"İşletmenizin ihtiyaçlarına özel çözümlerimizle rekabette öne geçin. Danışmanlık için bize ulaşın.",
"services.cta.contact": "İletişime Geçin",
"demo.form.title": "Demo Talep Formu",
"demo.subtitle":
"Sorularınız için bizimle iletişime geçin. Size yardımcı olmaktan mutluluk duyarız.",
// Services Page
"services.title": "Hizmetlerimiz",
"services.subtitle":
"İşletmenizin dijital dönüşüm yolculuğunda ihtiyaç duyduğu tüm teknoloji çözümleri",
"services.software.title": "Yazılım Kurulum ve Entegrasyon",
"services.software.desc":
"Kurumunuza özel kurulum ve entegrasyon hizmetleri",
"services.web.title": "Kullanıcı Eğitimi",
"services.web.desc": "Kapsamlı eğitim ve destek hizmetleri",
"services.mobile.title": "Güvenlik Hizmetleri",
"services.mobile.desc": "Verilerinizin güvenliği için kapsamlı çözümler",
"services.database.title": "Hosting ve Barındırma",
"services.database.desc": "Güvenilir hosting ve barındırma hizmetleri",
"services.software.features.analysis": "Sistem kurulumu ve yapılandırma",
"services.software.features.design": "Mevcut verilerinizin aktarımı",
"services.software.features.development": "Özel raporlama ayarları",
"services.software.features.testing": "Kullanıcı yetkilendirme",
"services.software.features.maintenance": "Şube entegrasyonları",
"services.web.features.frontend": "Uzaktan eğitim (5 saat)",
"services.web.features.backend": "Yerinde eğitim seçeneği",
"services.web.features.api": "Kullanım kılavuzları",
"services.web.features.seo": "Sürekli teknik destek",
"services.web.features.performance": "Performans Optimizasyonu",
"services.mobile.features.design": "Veri yedekleme hizmeti",
"services.mobile.features.native": "IP kısıtlama ayarları",
"services.mobile.features.cross": "Kullanıcı erişim kontrolü",
"services.mobile.features.push": "SSL sertifika yönetimi",
"services.mobile.features.store": "Güvenlik duvarı yapılandırması",
"services.database.features.design": "Yüksek performanslı sunucular",
"services.database.features.optimization": "7/24 sunucu izleme",
"services.database.features.migration": "Otomatik yedekleme",
"services.database.features.backup": "DDoS koruması",
"services.database.features.recovery": "Teknik destek",
"services.integration.title": "SMS ve İletişim Hizmetleri",
"services.integration.desc": "Toplu iletişim çözümleri",
"services.integration.features.api": "Toplu SMS paketleri",
"services.integration.features.middleware": "E-posta entegrasyonu",
"services.integration.features.legacy": "Otomatik bildirimler",
"services.integration.features.realtime": "Veli bilgilendirme sistemi",
"services.integration.features.monitoring": "SMS şablonları",
"services.consulting.title": "Bakım ve Destek",
"services.consulting.desc": "Sürekli teknik destek ve bakım hizmetleri",
"services.consulting.features.tech": "7/24 teknik destek",
"services.consulting.features.project": "Periyodik bakım",
"services.consulting.features.digital": "Sistem güncellemeleri",
"services.consulting.features.risk": "Sorun giderme",
"services.consulting.features.training": "Performans optimizasyonu",
"services.security.title": "Siber Güvenlik",
"services.security.desc": "İşletmenizin dijital varlıklarını siber tehditlere karşı koruma",
"services.security.features.analysis": "Güvenlik Açığı Analizi",
"services.security.features.penetration": "Sızma Testleri",
"services.security.features.firewall": "Güvenlik Duvarı Yönetimi",
"services.security.features.ssl": "SSL Sertifikası Yönetimi",
"services.security.features.training": "Siber Güvenlik Eğitimleri",
"services.maintenance.title": "Bakım ve Destek",
"services.maintenance.desc":
"Yazılım sistemlerinizin sürekli çalışır durumda olması için kapsamlı bakım ve destek hizmetleri",
"services.maintenance.features.monitoring": "Sistem İzleme",
"services.maintenance.features.bugfix": "Hata Giderme",
"services.maintenance.features.performance": "Performans İyileştirme",
"services.maintenance.features.updates": "Güncelleme Yönetimi",
"services.maintenance.features.support": "Teknik Destek",
// Services Page - Support Plans
"services.support.title": "Destek Paketleri",
"services.support.branchRemote.title": "Şube Uzaktan Destek",
"services.support.branchRemote.price": "4,200 ₺",
"services.support.branchRemote.period": "/ Ay",
"services.support.branchRemote.features.priority": "7/24 öncelikli destek",
"services.support.branchRemote.features.remote": "Uzaktan sorun çözümü",
"services.support.branchRemote.features.optimization": "Sistem optimizasyonu",
"services.support.branchRemote.features.maintenance": "Düzenli bakım",
"services.support.branchRemote.features.consulting": "Özel danışmanlık",
"services.support.backup.title": "Veri Yedekleme",
"services.support.backup.price": "1,700 ₺",
"services.support.backup.period": "/ Yıl",
"services.support.backup.features.daily": "Günlük yedekleme",
"services.support.backup.features.encrypted": "Şifreli depolama",
"services.support.backup.features.recovery": "Hızlı veri kurtarma",
"services.support.backup.features.verification": "Yedek doğrulama",
"services.support.backup.features.access": "7/24 erişim",
"services.support.sms.title": "SMS Paketleri",
"services.support.sms.price": "750 ₺",
"services.support.sms.period": "'den başlayan",
"services.support.sms.features.packages": "5.000 SMS'den başlayan paketler",
"services.support.sms.features.bulk": "Toplu gönderim",
"services.support.sms.features.template": "Şablon yönetimi",
"services.support.sms.features.reporting": "Raporlama",
"services.support.sms.features.api": "API desteği",
"services.support.contactButton": "İletişime Geçin",
// Products Page - Modules
"products.modules.sales.title": "Satış ve Reklam Yönetimi",
"products.modules.sales.features.appointment": "Randevu takibi",
"products.modules.sales.features.meeting": "Görüşme takibi",
"products.modules.sales.features.campaign": "Kampanya yönetimi",
"products.modules.sales.features.adStats": "Reklam geri dönüş istatistikleri",
"products.modules.sales.features.applicant": "Aday başvuru takibi",
"products.modules.sales.features.corporate": "Kurumsal satış yönetimi",
"products.modules.sales.features.consultant": "Danışman performans takibi",
"products.modules.student.title": "Öğrenci Yönetimi",
"products.modules.student.features.sales": "Program satışları ve takibi",
"products.modules.student.features.contract": "Kayıt sözleşmesi ve evrak yönetimi",
"products.modules.student.features.installment": "Taksit ve ödeme planı",
"products.modules.student.features.level": "Seviye takibi",
"products.modules.student.features.attendance": "Yoklama takibi",
"products.modules.student.features.exam": "Sınav sonuçları",
"products.modules.student.features.homework": "Ödev takibi",
"products.modules.accounting.title": "Muhasebe Yönetimi",
"products.modules.accounting.features.cash": "Anlık kasa takibi",
"products.modules.accounting.features.bank": "Banka hesap takibi",
"products.modules.accounting.features.current": "Cari hesap yönetimi",
"products.modules.accounting.features.teacherFee": "Öğretmen ücretleri hesaplama",
"products.modules.accounting.features.consultantCommission": "Danışman prim hesaplama",
"products.modules.accounting.features.personnelSalary": "Personel maaş yönetimi",
"products.modules.accounting.features.incomeExpense": "Gelir/gider tablosu",
"products.modules.reporting.title": "Raporlama ve Analiz",
"products.modules.reporting.features.dynamic": "Dinamik raporlama",
"products.modules.reporting.features.ready": "İstatistiki hazır raporlar",
"products.modules.reporting.features.periodic": "Periyodik mail bildirimleri",
"products.modules.reporting.features.performance": "Performans analizleri",
"products.modules.reporting.features.branch": "Şube bazlı raporlar",
"products.modules.reporting.features.financial": "Finansal analizler",
"products.modules.reporting.features.studentSuccess": "Öğrenci başarı takibi",
// Products Page - Pricing
"products.pricing.title": "Lisans Seçenekleri",
"products.pricing.user.title": "Kullanıcı Lisansı",
"products.pricing.user.price": "750 ₺",
"products.pricing.user.period": "/ Ay",
"products.pricing.user.yearlyPrice": "2,900 ₺ / Yıl",
"products.pricing.user.description": "Şube personelleri için temel kullanıcı lisansı",
"products.pricing.teacher.title": "Öğretmen Lisansı",
"products.pricing.teacher.price": "350 ₺",
"products.pricing.teacher.period": "/ Ay",
"products.pricing.teacher.yearlyPrice": "1,400 ₺ / Yıl",
"products.pricing.teacher.description": "Öğretmenler için özel yetkilendirilmiş lisans",
"products.pricing.founder.title": "Kurucu Lisansı",
"products.pricing.founder.price": "300 ₺",
"products.pricing.founder.period": "/ Ay",
"products.pricing.founder.yearlyPrice": "1,100 ₺ / Yıl",
"products.pricing.founder.description": "iOS ve Android üzerinden yönetim imkanı",
// Contact Page
"contact.title": "İletişim",
"contact.subtitle": "Sorularınız için bizimle iletişime geçin",
"contact.info.title": "İletişim Bilgileri",
"contact.address": "Adres",
"contact.address.full":
"Barbaros Mah. Ahlat Sok. Varyap Meridian Sitesi D1 Blok Daire 115 Kat 14 PK:34746 Ataşehir İstanbul",
"contact.phone": "Telefon",
"contact.email": "E-posta",
"contact.taxOffice": "Vergi Dairesi",
"contact.taxNumber": "Vergi Numarası",
"contact.bank.title": "Banka Bilgileri",
"contact.workHours": "Çalışma Saatleri",
"contact.workHours.weekday": "Hafta İçi: 09:00 - 18:00",
"contact.workHours.weekend": "Hafta Sonu: Kapalı",
"contact.workHours.whatsapp": "Whatsapp: 7/24",
"contact.transferForm": "Havale/EFT Bildirim Formu",
"contact.location": "Konumumuz",
// About Page
"about.title": "Hakkımızda",
"about.subtitle":
"2012 yılından bu yana yazılım sektöründe faaliyet gösteriyoruz",
"about.stats.clients": "Mutlu Müşteri",
"about.stats.experience": "Yıllık Tecrübe",
"about.stats.support": "7/24 Destek",
"about.stats.countries": "Ülke",
"about.description.part1":
"Sözsoft Bilişim Hizmetleri, eğitim sektörünün dijital dönüşümüne katkı sağlamak amacıyla 2012 yılında sozsoft.com markasıyla kurulmuştur. Kuruluşumuzun temelinde, 15 yılı aşkın yazılım tecrübesi ve farklı sektörlerde edinilen güçlü bir birikim yatmaktadır. Uzun yıllar boyunca tekstil sektörünün önde gelen markalarına büyük ölçekli yazılım çözümleri sunan uzman kadromuz, bu tecrübesini eğitim sektörünün dinamik ihtiyaçlarıyla harmanlayarak yenilikçi projelere imza atmaktadır. Sözsoft, sadece yazılım geliştirmekle kalmaz; kurumlara özel, sürdürülebilir ve kullanıcı dostu sistemler geliştirerek gerçek iş değeri yaratmayı hedefler. “Alışılagelmişin dışında ayrıcalıklı hizmet ve her an ulaşılabilirlik” ilkesiyle hareket eden ekibimiz, eğitim kurumlarının operasyonel süreçlerini dijitalleştirerek, verimliliklerini artırmalarına ve çağın gerekliliklerine uyum sağlamalarına destek olmaktadır. Bugün Sözsoft, Türkiyenin dört bir yanındaki eğitim kurumlarının güvenilir teknoloji çözüm ortağı olmanın gururunu taşımaktadır.",
"about.description.motto":
'"Tutkumuz teknoloji, hedefimiz sürdürülebilir verimliliktir."',
"about.description.part2":
"Sözsoft olarak, yazılım çözümlerimizi sunmadan önce işimize sizi tanımakla başlıyoruz. İhtiyaçlarınızı doğru analiz edebilmek, karşılaştığınız sorunlara kalıcı ve sürdürülebilir çözümler üretebilmek amacıyla sadece teknik bir bakış açısıyla değil, işletmenizin işleyişine bütüncül bir perspektifle yaklaşıyoruz. İletişimimizi yalnızca yüzeyde bırakmıyor, sizinle aynı dili konuşan bir çözüm ortağı olmayı benimsiyoruz. Türkiyede yalnızca yabancı dil okulları ve kurslara özel yazılım çözümleri sunan, bu alanda uzmanlaşmış bir yazılım evi olarak faaliyet gösteriyoruz. 15 yılı aşkın sektör tecrübemizi, eğitim kurumlarının günlük operasyonlarına değer katan, esnek ve kullanıcı dostu yazılımlara dönüştürüyoruz. Amacımız; kurumunuzu sadece bilgisayarınızdan değil, akıllı telefonunuzdan da rahatlıkla yönetebileceğiniz şekilde, size özel olarak tasarlanmış yazılımlar aracılığıyla yönetim süreçlerinizi kolaylaştırmaktır. Günümüzde zaman yönetimi ve rekabetin her geçen gün daha kritik hale geldiği bir ortamda, size maddi ve zaman açısından tasarruf sağlayacak, aynı zamanda operasyonel verimliliğinizi artıracak konforlu, güvenli ve rekabetçi sistemler sunmanın memnuniyetini yaşıyoruz. Yazılımlarımızı kullanmaya başladığınız andan itibaren, kurumunuzda görev alan eğitim danışmanları, koordinatörler, muhasebe birimi, yöneticiler ve kurucular; bilgi kirliliğinden uzak, düzenli ve entegre bir yapının getirdiği iş birliği ve verimliliği doğrudan hissedecektir. Sunduğumuz çözümler yalnızca teknik değil, aynı zamanda sizin iş yapış şeklinize uygun olarak geliştirilmiştir. Kolay, hızlı ve güvenlik aşamaları titizlikle düşünülmüş bir yapı sunuyor; aynı zamanda satış, kampanya ve reklam yönetiminizi destekleyecek, gelirlerinizi artırmanıza katkı sağlayacak araçlarla donatılmış yazılımlar geliştiriyoruz. Eğitim koordinatörlerinizin sınıf planlamalarında yaşadığı zorluklara çözüm sunan ve kurum içi tüm süreçlere entegre şekilde çalışan bu sistemle, işinize özel kalıcı bir çözüm sunuyoruz.",
"about.description.closing":
"Sizin için yazılım geliştiriyor, kurumunuz için çözümler üretiyoruz.",
"about.mission": "Misyonumuz",
"about.mission.desc":
"Müşterilerimizin dijital dönüşüm süreçlerinde yanlarında olarak, onların iş süreçlerini optimize etmek ve rekabet güçlerini artırmak için yenilikçi çözümler sunmak.",
"about.vision": "Vizyonumuz",
"about.vision.desc":
"Türkiye'nin ve bölgenin önde gelen yazılım şirketlerinden biri olarak, global pazarda söz sahibi olmak ve teknoloji dünyasına yön veren şirketler arasında yer almak.",
"about.team": "Ekibimiz",
"about.team.salesDirector": "Satış Direktörü",
"about.team.projectDirector": "Proje Direktörü",
"about.team.techDirector": "Teknik Koordinatör",
// Blog Page
"blog.title": "Blog",
"blog.subtitle":
"Teknoloji dünyasındaki son gelişmeler ve yazılım trendleri",
"blog.posts.ai.title": "Yapay Zeka ve İş Dünyası",
"blog.posts.ai.excerpt":
"Yapay zekanın iş süreçlerine etkileri ve geleceği...",
"blog.posts.ai.date": "10 Mayıs 2024",
"blog.categories.technology": "Teknoloji",
"blog.posts.web.title": "Web Geliştirmede Son Trendler",
"blog.posts.web.excerpt": "Modern web geliştirme teknikleri ve araçları...",
"blog.posts.web.date": "5 Mayıs 2024",
"blog.categories.webdev": "Web Geliştirme",
"blog.posts.security.title": "Siber Güvenlik İpuçları",
"blog.posts.security.excerpt":
"İşletmenizi siber tehditlere karşı koruyun...",
"blog.posts.security.date": "1 Mayıs 2024",
"blog.categories.security": "Siber Güvenlik",
"blog.posts.mobile.title": "Mobil Uygulama Geliştirme Rehberi",
"blog.posts.mobile.excerpt":
"Başarılı bir mobil uygulama geliştirmek için ipuçları...",
"blog.posts.mobile.date": "25 Nisan 2024",
"blog.categories.mobile": "Mobil",
"blog.posts.database.title": "Veritabanı Yönetimi Temelleri",
"blog.posts.database.excerpt": "Veritabanı tasarımı ve optimizasyonu...",
"blog.posts.database.date": "20 Nisan 2024",
"blog.categories.database": "Veritabanı",
"blog.posts.digital.title": "Dijital Pazarlama Stratejileri",
"blog.posts.digital.excerpt": "İşletmenizi dijital dünyada büyütün...",
"blog.posts.digital.date": "April 15, 2024",
"blog.categories.digital": "Dijital Pazarlama",
"blog.subscribe": "Bültene Abone Ol",
"blog.subscribe.desc":
"Teknoloji ve yazılım dünyasındaki güncel gelişmelerden haberdar olmak için bültenimize abone olun.",
"blog.backToBlog": "Bloglar",
// Testimonials Section
"testimonials.title": "Müşteri Yorumları",
// Common
"common.learnMore": "Detaylı Bilgi",
"common.contact":
"Bugün bize katılın ve çözümlerimizle işinizi dönüştürün.",
"common.getStarted": "Başlamaya Hazır Mısınız?",
"common.readMore": "Devamını Oku",
"common.subscribe": "Abone Ol",
"common.send": "Gönder",
"common.name": "Ad",
"common.surname": "Soyad",
"common.email": "E-posta",
"common.phone": "Telefon",
"common.message": "Mesaj",
"common.address": "Adres",
"common.city": "Şehir",
"common.company": "Şirket Adı",
"common.fullName": "Adınız Soyadınız",
"common.branchCount": "Şube Adedi",
"common.userCount": "Kullanıcı Adedi",
// Footer
"footer.companyInfo":
"20 yılı aşkın tecrübemizle işletmenizi dijital dünyada bir adım öne taşıyoruz. Yenilikçi çözümlerle geleceğin teknolojilerini bugünden sunuyoruz.",
"footer.quickLinksTitle": "Hızlı Bağlantılar",
"footer.servicesTitle": "Hizmetlerimiz",
"footer.address":
"Barbaros Mah. Ahlat Sok. Varyap Meridian Sitesi D1 Blok Daire 115 Kat 14 PK:34746 Ataşehir İstanbul",
"footer.copyright": "Tüm hakları saklıdır.",
"footer.privacyPolicy": "Gizlilik Politikası",
"footer.termsOfUse": "Kullanım Şartları",
"footer.sitemap": "Site Haritası",
},
en: {
// Navigation
"nav.home": "Home",
"nav.about": "About Us",
"nav.products": "Products",
"nav.services": "Services",
"nav.demo": "Login",
"nav.blog": "Blog",
"nav.contact": "Contact",
// Hero Section
// Hero Section
"hero.title": "The World's Leading Language Course Software",
"hero.subtitle":
"With over 20 years of experience, we help you take your business one step ahead in the digital world with our software solutions developed specifically for language schools and courses.",
"hero.cta.consultation": "Request a Free Demo",
"hero.cta.discover": "Explore Our Products",
"hero.service1.title": "Pay As You Go",
"hero.service1.desc":
"Use as much as you need with flexible monthly or annual payment options",
"hero.service2.title": "Multi-Branch Management",
"hero.service2.desc":
"Easily manage all your branches from a single system",
"hero.service3.title": "24/7 Secure Access",
"hero.service3.desc":
"Enjoy secure access from anywhere with an internet connection",
// Features Section
"features.title": "Why Sözsoft?",
"features.subtitle":
"A comprehensive management software developed exclusively for language schools and courses in Turkey",
"features.reliable": "Student Management",
"features.reliable.desc":
"Student registrations, attendance tracking, exam results, and payments all on one platform",
"features.rapid": "Class Planning",
"features.rapid.desc":
"Easy class creation, teacher assignment, and lesson schedule management",
"features.expert": "Education Tracking",
"features.expert.desc":
"Level-based education tracking, exam and homework management",
"features.scalable": "Detailed Reporting",
"features.scalable.desc":
"Performance analysis, financial reports, and statistics",
"features.muhasebe": "Accounting Management",
"features.muhasebe.desc":
"Income-expense tracking, installment plans, and automatic salary calculation",
"features.iletisim": "Communication Tools",
"features.iletisim.desc":
"Bulk SMS and email sending, parent notification system",
"features.mobil": "Mobile Access",
"features.mobil.desc":
"Management access from anywhere via iOS and Android apps",
"features.guvenlik": "Security",
"features.guvenlik.desc":
"IP restriction, authorization, and data backup features",
// Solutions Section
"solutions.title": "Our Solutions",
"solutions.subtitle":
"Technology solutions customized for your business needs",
"solutions.web.title": "Web Applications",
"solutions.web.desc": "We build modern and user-friendly web applications.",
"solutions.mobile.title": "Mobile Applications",
"solutions.mobile.desc":
"We develop native mobile applications for iOS and Android.",
"solutions.custom.title": "Custom Software",
"solutions.custom.desc":
"We provide software solutions tailored to your business.",
"solutions.database.title": "Database Systems",
"solutions.database.desc":
"We set up secure and high-performance database systems.",
// Products Page
"products.title": "Our Products",
"products.subtitle":
"Software solutions developed specifically for your business needs",
"products.kurs.title": "Course Management Automation",
"products.kurs.desc":
"Manage all your business processes from a single platform.",
"products.crm.title": "CRM System",
"products.crm.desc": "Manage your customer relationships effectively.",
"products.ecommerce.title": "E-Commerce Platform",
"products.ecommerce.desc": "Strengthen your online sales channel.",
"products.hr.title": "Human Resources Software",
"products.hr.desc": "Digitize your HR processes.",
"products.kurs.features.inventory": "Inventory Management",
"products.kurs.features.purchasing": "Purchasing Management",
"products.kurs.features.sales": "Sales Management",
"products.kurs.features.accounting": "Accounting Management",
"products.kurs.features.reporting": "Reporting",
"products.kurs.features.mobile": "Mobile Access",
"products.crm.features.tracking": "Customer Tracking",
"products.crm.features.opportunities": "Opportunity Management",
"products.crm.features.email": "Email Integration",
"products.crm.features.tasks": "Task Management",
"products.crm.features.calendar": "Calendar Integration",
"products.crm.features.analytics": "Analytics Reporting",
"products.ecommerce.features.responsive": "Responsive Design",
"products.ecommerce.features.payment": "Secure Payment Systems",
"products.ecommerce.features.inventory": "Inventory Management",
"products.ecommerce.features.seo": "SEO Optimization",
"products.ecommerce.features.analytics": "E-Commerce Analytics",
"products.ecommerce.features.marketplace": "Marketplace Integration",
"products.hr.features.personnel": "Personnel Management",
"products.hr.features.leave": "Leave Management",
"products.hr.features.performance": "Performance Management",
"products.hr.features.payroll": "Payroll Management",
"products.hr.features.training": "Training Management",
"products.hr.features.digital": "Digital HR Processes",
"products.cta.title": "Learn More",
"products.cta.description":
"Explore our products to find the best solutions for your business needs or contact us.",
"products.cta.demo": "Request a Demo",
"services.cta.title": "Start Your Digital Transformation Journey",
"services.cta.description":
"Gain a competitive edge with our tailored solutions. Contact us for a consultation.",
"services.cta.contact": "Get in Touch",
"demo.form.title": "Demo Request Form",
"demo.subtitle":
"Contact us for any inquiries. We are happy to assist you.",
// Services Page
"services.title": "Our Services",
"services.subtitle":
"All the technology solutions your business needs on its digital transformation journey",
"services.software.title": "Custom Software Development",
"services.software.desc":
"Software solutions tailored to your business needs",
"services.web.title": "Web Applications",
"services.web.desc": "Modern and user-friendly web applications",
"services.mobile.title": "Mobile Applications",
"services.mobile.desc": "Native applications for iOS and Android",
"services.database.title": "Database Solutions",
"services.database.desc": "Secure and scalable database systems",
"services.software.features.analysis": "Analysis and Planning",
"services.software.features.design": "Design and Architecture",
"services.software.features.development": "Software Development",
"services.software.features.testing": "Testing and Quality Assurance",
"services.software.features.maintenance": "Maintenance and Support",
"services.web.features.frontend": "Frontend Development",
"services.web.features.backend": "Backend Development",
"services.web.features.api": "API Development",
"services.web.features.seo": "SEO Optimization",
"services.web.features.performance": "Performance Optimization",
"services.mobile.features.design": "Mobile App Design",
"services.mobile.features.native": "Native Mobile App Development",
"services.mobile.features.cross": "Cross-Platform Mobile App Development",
"services.mobile.features.push": "Push Notification Integration",
"services.mobile.features.store": "App Store & Google Play Deployment",
"services.database.features.design": "Database Design",
"services.database.features.optimization": "Database Optimization",
"services.database.features.migration": "Database Migration",
"services.database.features.backup": "Database Backup",
"services.database.features.recovery": "Database Recovery",
"services.integration.title": "System Integration",
"services.integration.desc":
"Data flow and integration solutions between different systems",
"services.integration.features.api": "API Integration",
"services.integration.features.middleware": "Middleware Development",
"services.integration.features.legacy": "Legacy System Integration",
"services.integration.features.realtime": "Real-Time Data Integration",
"services.integration.features.monitoring":
"Integration Monitoring & Management",
"services.consulting.title": "Technology Consulting",
"services.consulting.desc":
"Expert consulting for your technology strategy and roadmap",
"services.consulting.features.tech": "Technology Strategy",
"services.consulting.features.project": "Project Management Consulting",
"services.consulting.features.digital": "Digital Transformation Consulting",
"services.consulting.features.risk": "Risk Management Consulting",
"services.consulting.features.training": "Technology Training",
"services.security.title": "Cybersecurity",
"services.security.desc":
"Protect your digital assets against cyber threats",
"services.security.features.analysis": "Vulnerability Analysis",
"services.security.features.penetration": "Penetration Testing",
"services.security.features.firewall": "Firewall Management",
"services.security.features.ssl": "SSL Certificate Management",
"services.security.features.training": "Cybersecurity Training",
"services.maintenance.title": "Maintenance & Support",
"services.maintenance.desc":
"Comprehensive maintenance and support services to keep your software running smoothly",
"services.maintenance.features.monitoring": "System Monitoring",
"services.maintenance.features.bugfix": "Bug Fixing",
"services.maintenance.features.performance": "Performance Improvement",
"services.maintenance.features.updates": "Update Management",
"services.maintenance.features.support": "Technical Support",
// Services Page - Support Plans
"services.support.title": "Support Packages",
"services.support.branchRemote.title": "Branch Remote Support",
"services.support.branchRemote.price": "₺4,200",
"services.support.branchRemote.period": "/ Month",
"services.support.branchRemote.features.priority": "24/7 priority support",
"services.support.branchRemote.features.remote": "Remote troubleshooting",
"services.support.branchRemote.features.optimization": "System optimization",
"services.support.branchRemote.features.maintenance": "Regular maintenance",
"services.support.branchRemote.features.consulting": "Specialized consulting",
"services.support.backup.title": "Data Backup",
"services.support.backup.price": "₺1,700",
"services.support.backup.period": "/ Year",
"services.support.backup.features.daily": "Daily backup",
"services.support.backup.features.encrypted": "Encrypted storage",
"services.support.backup.features.recovery": "Fast data recovery",
"services.support.backup.features.verification": "Backup verification",
"services.support.backup.features.access": "24/7 access",
"services.support.sms.title": "SMS Packages",
"services.support.sms.price": "₺750",
"services.support.sms.period": "starting from",
"services.support.sms.features.packages": "Packages starting from 5,000 SMS",
"services.support.sms.features.bulk": "Bulk sending",
"services.support.sms.features.template": "Template management",
"services.support.sms.features.reporting": "Reporting",
"services.support.sms.features.api": "API support",
"services.support.contactButton": "Get in Touch",
// Products Page - Modules
"products.modules.sales.title": "Sales and Advertising Management",
"products.modules.sales.features.appointment": "Appointment tracking",
"products.modules.sales.features.meeting": "Meeting tracking",
"products.modules.sales.features.campaign": "Campaign management",
"products.modules.sales.features.adStats": "Advertising return statistics",
"products.modules.sales.features.applicant": "Applicant tracking",
"products.modules.sales.features.corporate": "Corporate sales management",
"products.modules.sales.features.consultant": "Consultant performance tracking",
"products.modules.student.title": "Student Management",
"products.modules.student.features.sales": "Program sales and tracking",
"products.modules.student.features.contract": "Registration contract and document management",
"products.modules.student.features.installment": "Installment and payment plan",
"products.modules.student.features.level": "Level tracking",
"products.modules.student.features.attendance": "Attendance tracking",
"products.modules.student.features.exam": "Exam results",
"products.modules.student.features.homework": "Homework tracking",
"products.modules.accounting.title": "Accounting Management",
"products.modules.accounting.features.cash": "Instant cash tracking",
"products.modules.accounting.features.bank": "Bank account tracking",
"products.modules.accounting.features.current": "Current account management",
"products.modules.accounting.features.teacherFee": "Teacher fee calculation",
"products.modules.accounting.features.consultantCommission": "Consultant commission calculation",
"products.modules.accounting.features.personnelSalary": "Personnel salary management",
"products.modules.accounting.features.incomeExpense": "Income/expense statement",
"products.modules.reporting.title": "Reporting and Analysis",
"products.modules.reporting.features.dynamic": "Dynamic reporting",
"products.modules.reporting.features.ready": "Ready statistical reports",
"products.modules.reporting.features.periodic": "Periodic email notifications",
"products.modules.reporting.features.performance": "Performance analysis",
"products.modules.reporting.features.branch": "Branch-based reports",
"products.modules.reporting.features.financial": "Financial analysis",
"products.modules.reporting.features.studentSuccess": "Student success tracking",
// Products Page - Pricing
"products.pricing.title": "License Options",
"products.pricing.user.title": "User License",
"products.pricing.user.price": "₺750",
"products.pricing.user.period": "/ Month",
"products.pricing.user.yearlyPrice": "₺2,900 / Year",
"products.pricing.user.description": "Basic user license for branch personnel",
"products.pricing.teacher.title": "Teacher License",
"products.pricing.teacher.price": "₺350",
"products.pricing.teacher.period": "/ Month",
"products.pricing.teacher.yearlyPrice": "₺1,400 / Year",
"products.pricing.teacher.description": "Special authorized license for teachers",
"products.pricing.founder.title": "Founder License",
"products.pricing.founder.price": "₺300",
"products.pricing.founder.period": "/ Month",
"products.pricing.founder.yearlyPrice": "₺1,100 / Year",
"products.pricing.founder.description": "Management capability via iOS and Android",
// Contact Page
"contact.title": "Contact",
"contact.subtitle": "Get in touch with us for any inquiries",
"contact.info.title": "Contact Information",
"contact.address": "Address",
"contact.address.full":
"Barbaros Mah. Ahlat Sok. Varyap Meridian Sitesi D1 Blok Daire 115 Kat 14 PK:34746 Ataşehir İstanbul",
"contact.phone": "Phone",
"contact.email": "Email",
"contact.taxOffice": "Tax Office",
"contact.taxNumber": "Tax Number",
"contact.bank.title": "Bank Details",
"contact.workHours": "Working Hours",
"contact.workHours.weekday": "Weekdays: 09:00 - 18:00",
"contact.workHours.weekend": "Weekend: Closed",
"contact.workHours.whatsapp": "24/7",
"contact.transferForm": "Wire Transfer Notification Form",
"contact.location": "Our Location",
// About Page
"about.title": "About Us",
"about.subtitle":
"We have been operating in the software industry since 2012",
"about.stats.clients": "Happy Clients",
"about.stats.experience": "Years of Experience",
"about.stats.support": "24/7 Support",
"about.stats.countries": "Countries",
"about.description.part1":
"Sözsoft Information Technologies was founded in 2012 under the brand sozsoft.com to contribute to the digital transformation of the education sector. Our foundation is built on over 15 years of software experience and a strong background gained across various industries. Our expert team, which has developed large-scale software solutions for leading textile companies for many years, now channels its experience into the dynamic needs of the education sector by delivering innovative projects. At Sözsoft, we dont just develop software; we aim to create real business value by building sustainable and user-friendly systems tailored to institutions. Guided by the principle of 'exclusive service beyond the ordinary and constant accessibility', our team supports educational institutions in digitizing their operational processes to enhance efficiency and adapt to the demands of the modern age. Today, Sözsoft proudly serves as a trusted technology partner for educational institutions across Turkey.",
"about.description.motto":
'"Our passion is technology, our goal is sustainable efficiency."',
"about.description.part2":
"At Sözsoft, we start by understanding you before offering our software solutions. To analyze your needs accurately and provide permanent, sustainable solutions to the problems you face, we approach your organization not just from a technical angle, but with a holistic perspective. We aim to be more than a service provider—your strategic partner who speaks your language. As a specialized software house serving only language schools and educational centers in Turkey, we transform over 15 years of industry experience into flexible, user-friendly software that adds value to your operations. Our goal is to simplify your management processes with customized software you can manage even from your smartphone. In an age where time management and competition are more critical than ever, we take pride in delivering comfortable, secure, and competitive systems that save you both time and resources. From the moment you begin using our software, your education consultants, coordinators, accounting staff, managers, and founders will experience the power of an organized, integrated structure free from information overload. Our solutions are not only technical but tailored to your operational style. We provide a system designed with simplicity, speed, and security in mind—offering tools to support your sales, marketing, and advertising efforts while helping you increase revenue. With full integration into all institutional processes and the ability to solve planning issues for education coordinators, we deliver a lasting solution designed specifically for your business.",
"about.description.closing":
"We develop software for you and create solutions for your institution.",
"about.mission": "Our Mission",
"about.mission.desc":
"To support our clients in their digital transformation journeys by providing innovative solutions that optimize their business processes and enhance their competitive strength.",
"about.vision": "Our Vision",
"about.vision.desc":
"To become one of the leading software companies in Turkey and the region, and to take our place among the global leaders shaping the world of technology.",
"about.team": "Our Team",
"about.team.salesDirector": "Sales Director",
"about.team.projectDirector": "Project Director",
"about.team.techDirector": "Technic Coordinator",
// Blog Page
"blog.title": "Blog",
"blog.subtitle":
"Latest developments and software trends in the tech world",
"blog.posts.ai.title": "Artificial Intelligence and Business",
"blog.posts.ai.excerpt":
"The impacts and future of AI in business processes...",
"blog.posts.ai.date": "May 10, 2024",
"blog.categories.technology": "Technology",
"blog.posts.web.title": "Latest Trends in Web Development",
"blog.posts.web.excerpt": "Modern web development techniques and tools...",
"blog.posts.web.date": "May 5, 2024",
"blog.categories.webdev": "Web Development",
"blog.posts.security.title": "Cybersecurity Tips",
"blog.posts.security.excerpt":
"Protect your business against cyber threats...",
"blog.posts.security.date": "May 1, 2024",
"blog.categories.security": "Cybersecurity",
"blog.posts.mobile.title": "Mobile App Development Guide",
"blog.posts.mobile.excerpt": "Tips for building a successful mobile app...",
"blog.posts.mobile.date": "April 25, 2024",
"blog.categories.mobile": "Mobile",
"blog.posts.database.title": "Fundamentals of Database Management",
"blog.posts.database.excerpt": "Database design and optimization...",
"blog.posts.database.date": "April 20, 2024",
"blog.categories.database": "Database",
"blog.posts.digital.title": "Digital Marketing Strategies",
"blog.posts.digital.excerpt": "Grow your business in the digital world...",
"blog.posts.digital.date": "April 15, 2024",
"blog.categories.digital": "Digital Marketing",
"blog.subscribe": "Subscribe to Newsletter",
"blog.subscribe.desc":
"Subscribe to our newsletter to stay updated on the latest tech and software news.",
"blog.backToBlog": "Blogs",
// Testimonials Section
"testimonials.title": "Testimonials",
// Common
"common.learnMore": "Learn More",
"common.contact":
"Join us today and transform your business with our solutions.",
"common.getStarted": "Ready to Get Started?",
"common.readMore": "Read More",
"common.subscribe": "Subscribe",
"common.send": "Send",
"common.name": "First Name",
"common.surname": "Last Name",
"common.email": "Email",
"common.phone": "Phone",
"common.message": "Message",
"common.address": "Address",
"common.city": "City",
"common.company": "Company Name",
"common.fullName": "Full Name",
"common.branchCount": "Number of Branches",
"common.userCount": "Number of Users",
// Footer
"footer.companyInfo":
"With over 20 years of experience, we take your business one step ahead in the digital world. We deliver tomorrows technologies today with innovative solutions.",
"footer.quickLinksTitle": "Quick Links",
"footer.servicesTitle": "Our Services",
"footer.address":
"Barbaros Mah. Ahlat Sok. Varyap Meridian Sitesi D1 Blok Daire 115 Kat 14 PK:34746 Ataşehir İstanbul",
"footer.copyright": "All rights reserved.",
"footer.privacyPolicy": "Privacy Policy",
"footer.termsOfUse": "Terms of Use",
"footer.sitemap": "Sitemap",
},
};
const LanguageContext = createContext<LanguageContextType>({
language: "tr",
setLanguage: () => {},
t: () => "",
});
export const LanguageProvider: React.FC<{ children: React.ReactNode }> = ({
children,
}) => {
const [language, setLanguage] = useState<Language>("tr");
const t = (key: string): string => {
return (
translations[language][
key as keyof (typeof translations)[typeof language]
] || key
);
};
return (
<LanguageContext.Provider value={{ language, setLanguage, t }}>
{children}
</LanguageContext.Provider>
);
};
export const useLanguage = () => useContext(LanguageContext);

View file

@ -1,3 +0,0 @@
@tailwind base;
@tailwind components;
@tailwind utilities;

View file

@ -1,203 +0,0 @@
export interface BlogPostContent {
title: string;
excerpt: string;
content: string;
date: string;
category: string;
readTime: string;
}
export interface BlogPosts {
[key: string]: {
tr: BlogPostContent;
en: BlogPostContent;
image: string;
author: string;
};
}
export const blogContent: BlogPosts = {
'ai-ve-gelecegi': {
tr: {
title: 'blog.posts.ai.title',
excerpt: 'blog.posts.ai.excerpt',
content: `Yapay zeka (YZ), günümüzün en hızlı gelişen ve dönüştürücü teknolojilerinden biridir. Makine öğrenimi, doğal dil işleme ve bilgisayar görüşü gibi alanlardaki ilerlemeler, YZ'nin hayatımızın birçok alanında etkili olmasını sağlamıştır. Akıllı asistanlardan otonom araçlara, tıbbi teşhislerden finansal analizlere kadar geniş bir yelpazede YZ uygulamalarıyla karşılaşıyoruz.
YZ'nin geleceği parlak görünmekle birlikte, beraberinde önemli etik, sosyal ve ekonomik zorlukları da getiriyor. YZ'nin karar alma süreçlerindeki şeffaflık, algoritmik yanlılık, gücü piyasası üzerindeki potansiyel etkileri ve YZ'nin kötüye kullanımı gibi konular, küresel düzeyde dikkatle ele alınması gereken meselelerdir.
Bu blog yazısında, yapay zekanın mevcut yeteneklerini, farklı sektörlerdeki kullanım alanlarını ve gelecekteki potansiyelini detaylı bir şekilde inceleyeceğiz. Ayrıca, YZ'nin sorumlu bir şekilde geliştirilmesi ve kullanılması için atılması gereken adımları ve bu alandaki güncel tartışmaları ele alarak, yapay zekanın geleceğine dair kapsamlı bir bakış sunacağız.`,
date: 'blog.posts.ai.date',
category: 'blog.categories.technology',
readTime: "5 dk",
},
en: {
title: 'blog.posts.ai.title',
excerpt: 'blog.posts.ai.excerpt',
content: `Artificial Intelligence (AI) is one of the fastest-growing and most transformative technologies today. Advances in areas such as machine learning, natural language processing, and computer vision have enabled AI to be effective in many areas of our lives. We encounter AI applications in a wide range of fields, from smart assistants to autonomous vehicles, medical diagnostics to financial analysis.
While the future of AI looks bright, it also brings significant ethical, social, and economic challenges. Issues such as transparency in AI decision-making processes, algorithmic bias, potential impacts on the labor market, and the misuse of AI are matters that need to be carefully addressed globally.
In this blog post, we will delve into the current capabilities of artificial intelligence, its applications in various sectors, and its future potential. Furthermore, we will discuss the steps that need to be taken for the responsible development and use of AI and the current debates in this field, providing a comprehensive outlook on the future of artificial intelligence.`,
date: 'blog.posts.ai.date',
category: 'blog.categories.technology',
readTime: "5 dk",
},
image: 'https://images.pexels.com/photos/8386434/pexels-photo-8386434.jpeg?auto=compress&cs=tinysrgb&w=1920',
author: "Ahmet Yılmaz",
},
'web-gelistirmede-son-trendler': {
tr: {
title: 'blog.posts.web.title',
excerpt: 'blog.posts.web.excerpt',
content: `Web geliştirme dünyası sürekli bir değişim ve evrim içinde. Her yıl yeni teknolojiler, frameworkler ve yaklaşımlar ortaya çıkıyor, bu da web geliştiricilerinin sürekli öğrenmesini ve adapte olmasını gerektiriyor. 2024 yılı da bu açıdan farklı değil; heyecan verici yeni trendler ve gelişmeler web ekosistemini şekillendiriyor.
Bu yılın öne çıkan trendlerinden biri Serverless mimarilerin yükselişi. Geliştiricilerin sunucu yönetimiyle uğraşmadan uygulama geliştirmesine olanak tanıyan Serverless, maliyet etkinliği ve ölçeklenebilirlik gibi avantajlar sunuyor. Bir diğer önemli trend ise WebAssembly (Wasm). Web tarayıcılarında yüksek performanslı kod çalıştırmayı mümkün kılan Wasm, oyunlar, video düzenleyiciler ve CAD yazılımları gibi daha karmaşık uygulamaların web'e taşınmasını sağlıyor.
Mikro ön uçlar da büyük ölçekli web uygulamalarının yönetimini kolaylaştıran bir mimari desen olarak popülerlik kazanıyor. Bu yaklaşım, büyük ön projelerini daha küçük, bağımsız parçalara ayırarak farklı ekiplerin aynı proje üzerinde paralel çalışmasına imkan tanıyor. Bu blog yazısında, bu ve benzeri web geliştirme trendlerini daha detaylı inceleyerek, geleceğin web uygulamalarını şekillendiren teknolojilere derinlemesine bir bakış sunacağız.`,
date: 'blog.posts.web.date',
category: 'blog.categories.webdev',
readTime: "7 dk",
},
en: {
title: 'blog.posts.web.title',
excerpt: 'blog.posts.web.excerpt',
content: `The world of web development is in a constant state of change and evolution. Every year, new technologies, frameworks, and approaches emerge, requiring web developers to continuously learn and adapt. 2024 is no different in this regard; exciting new trends and developments are shaping the web ecosystem.
One of the prominent trends this year is the rise of Serverless architectures. Enabling developers to build applications without managing servers, Serverless offers advantages such as cost-effectiveness and scalability. Another significant trend is WebAssembly (Wasm). Allowing high-performance code to run in web browsers, Wasm makes it possible to bring more complex applications like games, video editors, and CAD software to the web.
Micro frontends are also gaining popularity as an architectural pattern that simplifies the management of large-scale web applications. This approach allows breaking down large frontend projects into smaller, independent pieces, enabling different teams to work on the same project in parallel. In this blog post, we will delve deeper into these and similar web development trends, providing an in-depth look at the technologies shaping the future of web applications.`,
date: 'blog.posts.web.date',
category: 'blog.categories.webdev',
readTime: "7 dk",
},
image: 'https://images.pexels.com/photos/11035471/pexels-photo-11035471.jpeg?auto=compress&cs=tinysrgb&w=1920',
author: "Mehmet Kaya",
},
'siber-guvenlik-tehditleri-ve-korunma-yollari': {
tr: {
title: 'blog.posts.security.title',
excerpt: 'blog.posts.security.excerpt',
content: `Dijitalleşmenin hızla artmasıyla birlikte, siber güvenlik tehditlerinin sayısı ve karmaşıklığı da eş zamanlı olarak artmaktadır. Artık sadece büyük şirketler değil, bireyler ve küçük işletmeler de siber saldırganların hedefi haline gelmiştir. Kişisel verilerin çalınması, kimlik avı (phishing) saldırıları, fidye yazılımları (ransomware) ve dağıtılmış hizmet engelleme (DDoS) saldırıları gibi tehditler, hem maddi hem de manevi zararlara yol açabilmektedir.
Bu tehditlere karşı korunmak, dijital dünyada güvende kalmak için hayati öneme sahiptir. Güçlü ve benzersiz şifreler kullanmak, iki faktörlü kimlik doğrulama yöntemlerini benimsemek ve yazılımlarımızı düzenli olarak güncellemek, alabileceğimiz temel önlemler arasındadır. Ayrıca, bilinmeyen kaynaklardan gelen e-postalara ve linklere karşı dikkatli olmak, halka ık Wi-Fi ağlarında hassas işlemler yapmaktan kaçınmak da önemlidir.
Bu blog yazısında, güncel siber güvenlik tehditlerini daha detaylı bir şekilde inceleyeceğiz. Her bir tehdit türünün nasıl çalıştığını, potansiyel etkilerini ve bu tehditlere karşı bireysel ve kurumsal düzeyde alınabilecek en etkili korunma yollarını ele alacağız. Siber güvenlik bilincini artırmak ve dijital varlıklarımızı korumak için pratik ipuçları sunarak, daha güvenli bir çevrimiçi deneyim için rehberlik edeceğiz.`,
date: 'blog.posts.security.date',
category: 'blog.categories.security',
readTime: "6 dk",
},
en: {
title: 'blog.posts.security.title',
excerpt: 'blog.posts.security.excerpt',
content: `With the rapid increase in digitalization, the number and complexity of cyber security threats are also increasing simultaneously. Not only large corporations but also individuals and small businesses have become targets for cyber attackers. Threats such as personal data theft, phishing attacks, ransomware, and distributed denial-of-service (DDoS) attacks can cause both financial and emotional damage.
Protecting against these threats is vital for staying safe in the digital world. Using strong and unique passwords, adopting two-factor authentication methods, and regularly updating our software are among the basic precautions we can take. Furthermore, it is important to be cautious about emails and links from unknown sources and to avoid performing sensitive transactions on public Wi-Fi networks.
In this blog post, we will examine current cyber security threats in more detail. We will discuss how each type of threat works, its potential impacts, and the most effective ways to protect against these threats at both individual and organizational levels. By providing practical tips to increase cyber security awareness and protect our digital assets, we will offer guidance for a safer online experience.`,
date: 'blog.posts.security.date',
category: 'blog.categories.security',
readTime: "6 dk",
},
image: 'https://images.pexels.com/photos/5380642/pexels-photo-5380642.jpeg?auto=compress&cs=tinysrgb&w=1920',
author: "Ayşe Demir",
},
'mobil-uygulama-gelistirmede-cross-platform-cozumler': {
tr: {
title: 'blog.posts.mobile.title',
excerpt: 'blog.posts.mobile.excerpt',
content: `Mobil uygulama geliştirme, günümüzün en dinamik ve talep gören yazılım alanlarından biridir. Akıllı telefonların yaygınlaşmasıyla birlikte, işletmeler ve bireyler mobil platformlarda yer almak için sürekli yeni uygulamalar geliştirmektedir. Geleneksel olarak, iOS ve Android gibi farklı mobil işletim sistemleri için ayrı ayrı native uygulamalar geliştirmek gerekiyordu, bu da zaman ve kaynak açısından maliyetli olabiliyordu.
Ancak son yıllarda, cross-platform (çapraz platform) mobil geliştirme frameworkleri popülerlik kazanmıştır. Bu frameworkler, geliştiricilerin tek bir kod tabanı kullanarak hem iOS hem de Android platformları için uygulama geliştirmesine olanak tanır. Bu yaklaşım, geliştirme sürecini hızlandırır, maliyetleri düşürür ve bakım kolaylığı sağlar. React Native, Flutter ve Xamarin gibi frameworkler, cross-platform geliştirme alanında öne çıkan çözümlerdir.
Bu blog yazısında, cross-platform mobil geliştirmenin avantajlarını ve dezavantajlarını detaylı bir şekilde inceleyeceğiz. Farklı frameworklerin özelliklerini, performanslarını ve hangi senaryolarda daha uygun olduklarını karşılaştıracağız. Mobil uygulama geliştirme projeniz için en doğru cross-platform çözümü seçmenize yardımcı olacak bilgiler sunarak, geliştirme sürecinizi daha verimli hale getirmeniz için rehberlik edeceğiz.`,
date: 'blog.posts.mobile.date',
category: 'blog.categories.mobile',
readTime: "4 dk",
},
en: {
title: 'blog.posts.mobile.title',
excerpt: 'blog.posts.mobile.excerpt',
content: `Mobile application development is one of the most dynamic and in-demand software fields today. With the widespread adoption of smartphones, businesses and individuals are constantly developing new applications to have a presence on mobile platforms. Traditionally, it was necessary to develop separate native applications for different mobile operating systems like iOS and Android, which could be costly in terms of time and resources.
However, in recent years, cross-platform mobile development frameworks have gained popularity. These frameworks allow developers to build applications for both iOS and Android platforms using a single codebase. This approach accelerates the development process, reduces costs, and provides ease of maintenance. Frameworks like React Native, Flutter, and Xamarin are prominent solutions in the field of cross-platform development.
In this blog post, we will delve into the advantages and disadvantages of cross-platform mobile development in detail. We will compare the features and performance of different frameworks and discuss in which scenarios they are more suitable. By providing information to help you choose the right cross-platform solution for your mobile application development project, we will guide you to make your development process more efficient.`,
date: 'blog.posts.mobile.date',
category: 'blog.categories.mobile',
readTime: "4 dk",
},
image: 'https://images.pexels.com/photos/13017583/pexels-photo-13017583.jpeg?auto=compress&cs=tinysrgb&w=1920',
author: "Can Öztürk",
},
'veritabani-yonetim-sistemleri-karsilastirmasi': {
tr: {
title: 'blog.posts.database.title',
excerpt: 'blog.posts.database.excerpt',
content: `Veritabanları, modern yazılım uygulamalarının kalbidir. Uygulamaların veriyi depolaması, yönetmesi ve erişmesi için güvenilir ve etkili bir veritabanı yönetim sistemi (VTYS) seçimi kritik öneme sahiptir. Piyasada birçok farklı türde VTYS bulunmaktadır ve her birinin kendine özgü avantajları ve dezavantajları vardır. Doğru VTYS seçimi, uygulamanın performansı, ölçeklenebilirliği, güvenliği ve geliştirme süreci üzerinde doğrudan bir etkiye sahiptir.
İlişkisel veritabanları (RDBMS), veriyi tablolar halinde düzenler ve SQL (Yapısal Sorgu Dili) kullanarak verilere erişim sağlar. MySQL, PostgreSQL, Oracle ve SQL Server gibi sistemler bu kategoriye girer. RDBMS'ler, veri tutarlılığı ve karmaşık sorgular için güçlü yetenekler sunar. Ancak, büyük ölçekli ve yapısal olmayan verilerle çalışırken performans sorunları yaşanabilir.
NoSQL (Not Only SQL) veritabanları ise daha esnek veri modelleri sunar ve genellikle büyük ölçekli, dağıtık sistemler ve hızlı veri erişimi gerektiren uygulamalar için tercih edilir. MongoDB (belge tabanlı), Cassandra (geniş sütunlu) ve Redis (anahtar-değer) gibi sistemler NoSQL kategorisine örnektir. NoSQL veritabanları, yatay ölçeklenebilirlik ve yüksek erişilebilirlik sağlama konusunda genellikle RDBMS'lerden daha iyidir. Bu blog yazısında, ilişkisel ve NoSQL veritabanı yönetim sistemlerini detaylı bir şekilde karşılaştırarak, farklı kullanım senaryolarına göre hangi VTYS'nin daha uygun olduğunu ele alacağız.`,
date: 'blog.posts.database.date',
readTime: "8 dk",
category: 'blog.categories.database',
},
en: {
title: 'blog.posts.database.title',
excerpt: 'blog.posts.database.excerpt',
content: `Databases are the heart of modern software applications. Choosing a reliable and effective database management system (DBMS) is crucial for applications to store, manage, and access data. There are many different types of DBMS available in the market, each with its own unique advantages and disadvantages. The right DBMS choice has a direct impact on the application's performance, scalability, security, and development process.
Relational database management systems (RDBMS) organize data in tables and provide access to data using SQL (Structured Query Language). Systems like MySQL, PostgreSQL, Oracle, and SQL Server fall into this category. RDBMSs offer strong capabilities for data consistency and complex queries. However, performance issues can arise when working with large-scale and unstructured data.
NoSQL (Not Only SQL) databases, on the other hand, offer more flexible data models and are generally preferred for large-scale, distributed systems and applications requiring fast data access. Systems like MongoDB (document-based), Cassandra (wide-column), and Redis (key-value) are examples of NoSQL databases. NoSQL databases are generally better than RDBMSs at providing horizontal scalability and high availability. In this blog post, we will compare relational and NoSQL database management systems in detail, discussing which DBMS is more suitable for different use cases.`,
date: 'blog.posts.database.date',
readTime: "8 dk",
category: 'blog.categories.database',
},
image: 'https://images.pexels.com/photos/325229/pexels-photo-325229.jpeg?auto=compress&cs=tinysrgb&w=1920',
author: "Zeynep Yıldız",
},
'dijital-pazarlamada-veri-analizi': {
tr: {
title: 'blog.posts.digital.title',
excerpt: 'blog.posts.digital.excerpt',
content: `Dijital pazarlama dünyası, sürekli değişen algoritmalar, yeni platformlar ve gelişen tüketici davranışlarıyla dinamik bir yapıya sahiptir. Bu karmaşık ortamda başarılı olmak için, pazarlamacıların verilere dayalı kararlar alması ve stratejilerini sürekli olarak optimize etmesi gerekmektedir. İşte tam bu noktada veri analizi devreye girer. Dijital pazarlamada veri analizi, kampanyaların performansını ölçmek, müşteri davranışlarını anlamak, hedef kitleyi daha iyi tanımak ve pazarlama yatırımlarının geri dönüşünü (ROI) maksimize etmek için kritik bir araçtır.
Veri analizi sayesinde, hangi pazarlama kanallarının en etkili olduğunu belirleyebilir, hangi içerik türlerinin daha fazla etkileşim aldığını anlayabilir ve müşteri yolculuğunun farklı aşamalarındaki performans darboğazlarını tespit edebiliriz. Google Analytics, Adobe Analytics gibi web analizi araçları, sosyal medya analiz platformları ve müşteri ilişkileri yönetimi (CRM) sistemleri, dijital pazarlamacılara değerli veriler sunar. Bu verilerin doğru bir şekilde toplanması, temizlenmesi, analiz edilmesi ve yorumlanması, daha bilinçli ve etkili pazarlama stratejileri oluşturmanın temelini oluşturur.
Bu blog yazısında, dijital pazarlamada veri analizinin neden bu kadar önemli olduğunu detaylı bir şekilde ele alacağız. Kullanılan temel metrikleri (örneğin, dönüşüm oranı, tıklama oranı, müşteri edinme maliyeti), farklı analiz yöntemlerini ve veri görselleştirme tekniklerini inceleyeceğiz. Ayrıca, veri analizinden elde edilen içgörüleri pazarlama stratejilerine nasıl entegre edebileceğinize dair pratik ipuçları sunarak, dijital pazarlama çabalarınızın etkinliğini artırmanız için rehberlik edeceğiz.`,
date: 'blog.posts.digital.date',
readTime: "6 dk",
category: 'blog.categories.digital',
},
en: {
title: 'blog.posts.digital.title',
excerpt: 'blog.posts.digital.excerpt',
content: `The world of digital marketing is dynamic, with constantly changing algorithms, new platforms, and evolving consumer behavior. To succeed in this complex environment, marketers need to make data-driven decisions and continuously optimize their strategies. This is where data analysis comes into play. In digital marketing, data analysis is a critical tool for measuring campaign performance, understanding customer behavior, getting to know the target audience better, and maximizing the return on marketing investments (ROI).
Through data analysis, we can determine which marketing channels are most effective, understand which types of content receive more engagement, and identify performance bottlenecks at different stages of the customer journey. Web analytics tools like Google Analytics and Adobe Analytics, social media analytics platforms, and customer relationship management (CRM) systems provide valuable data to digital marketers. The accurate collection, cleaning, analysis, and interpretation of this data form the basis for creating more informed and effective marketing strategies.
In this blog post, we will delve into why data analysis is so important in digital marketing. We will examine key metrics used (e.g., conversion rate, click-through rate, customer acquisition cost), different analysis methods, and data visualization techniques. Furthermore, we will provide practical tips on how to integrate insights gained from data analysis into your marketing strategies, guiding you to increase the effectiveness of your digital marketing efforts.`,
date: 'blog.posts.digital.date',
readTime: "6 dk",
category: 'blog.categories.digital',
},
image: 'https://images.pexels.com/photos/7681091/pexels-photo-7681091.jpeg?auto=compress&cs=tinysrgb&w=1920',
author: "Ali Kara",
},
};
// Blog yazılarının listesi (Blog.tsx'te kullanılacak)
export const blogPostsList = Object.keys(blogContent).map(slug => {
const post = blogContent[slug].tr; // Varsayılan olarak Türkçe içeriği kullanıyoruz, dil bağlamına göre değiştirilebilir
return {
slug,
title: post.title,
excerpt: post.excerpt,
image: blogContent[slug].image, // Görsel bilgisi blogContent'ten alındı
author: blogContent[slug].author, // Yazar bilgisi blogContent'ten alındı
date: post.date,
readTime: post.readTime,
category: post.category,
};
});

View file

@ -1,56 +0,0 @@
export const team = {
en: [
{
name: "Özlem Öztürk",
title: "Founder",
imageUrl: "/img/women.png"
},
{
name: "Sefa Öztürk",
title: "CTO",
imageUrl: "/img/men.png"
},
{
name: "Ahmet Öztürk",
title: "Sales Director",
imageUrl: "/img/men.png"
},
{
name: "Esra Öztürk",
title: "Project Director",
imageUrl: "/img/women.png"
},
{
name: "Eva Öztürk",
title: "Tech Director",
imageUrl: "/img/women.png"
}
],
tr: [
{
name: "Özlem Öztürk",
title: "Kurucu",
imageUrl: "/img/women.png"
},
{
name: "Sefa Öztürk",
title: "CTO",
imageUrl: "/img/men.png"
},
{
name: "Ahmet Öztürk",
title: "Satış Direktörü",
imageUrl: "/img/men.png"
},
{
name: "Esra Öztürk",
title: "Proje Direktörü",
imageUrl: "/img/women.png"
},
{
name: "Eva Öztürk",
title: "Teknoloji Direktörü",
imageUrl: "/img/women.png"
}
]
};

View file

@ -1,106 +0,0 @@
export const testimonials = {
en: [
{
quote: "Outstanding service and results. Highly recommended!",
author: "John Doe",
title: "CEO, Example Corp"
},
{
quote: "Exceeded our expectations in every way.",
author: "Jane Smith",
title: "Director, Tech Solutions"
},
{
quote: "A game-changer for our business operations.",
author: "Mike Johnson",
title: "Founder, Innovation Labs"
},
{
quote: "The team was incredibly responsive and helpful.",
author: "Emily White",
title: "Marketing Manager, Global Corp"
},
{
quote: "We saw a significant increase in efficiency after implementing their solutions.",
author: "David Brown",
title: "Operations Manager, Tech Forward"
},
{
quote: "Their expertise and dedication are unmatched.",
author: "Sarah Green",
title: "Head of Product, Innovatech"
},
{
quote: "Incredible support and a fantastic product.",
author: "Kevin Black",
title: "Sales Director, LeadGen Inc."
},
{
quote: "Transformed our business with their innovative approach.",
author: "Linda Gray",
title: "Business Owner, Creative Solutions"
},
{
quote: "Exceptional service and a pleasure to work with.",
author: "Brian Blue",
title: "Project Lead, FutureTech"
},
{
quote: "Highly professional and delivered on every promise.",
author: "Jessica Red",
title: "Customer Success Manager, Prime Corp"
}
],
tr: [
{
quote: "Üstün hizmet ve sonuçlar. Şiddetle tavsiye edilir!",
author: "John Doe",
title: "CEO, Example Corp"
},
{
quote: "Beklentilerimizi her yönden aştılar.",
author: "Jane Smith",
title: "Direktör, Tech Solutions"
},
{
quote: "İş operasyonlarımız için ezber bozan bir gelişme.",
author: "Mike Johnson",
title: "Kurucu, Innovation Labs"
},
{
quote: "Ekip inanılmaz derecede duyarlı ve yardımseverdi.",
author: "Emily White",
title: "Pazarlama Müdürü, Global Corp"
},
{
quote: "Çözümlerini uyguladıktan sonra verimlilikte önemli bir artış gördük.",
author: "David Brown",
title: "Operasyon Müdürü, Tech Forward"
},
{
quote: "Uzmanlıkları ve özverileri eşsiz.",
author: "Sarah Green",
title: "Ürün Müdürü, Innovatech"
},
{
quote: "İnanılmaz destek ve harika bir ürün.",
author: "Kevin Black",
title: "Satış Direktörü, LeadGen Inc."
},
{
quote: "Yenilikçi yaklaşımlarıyla işimizi dönüştürdüler.",
author: "Linda Gray",
title: "İşletme Sahibi, Creative Solutions"
},
{
quote: "Olağanüstü hizmet ve çalışması keyifli.",
author: "Brian Blue",
title: "Proje Lideri, FutureTech"
},
{
quote: "Son derece profesyonel ve verdikleri her sözü tuttular.",
author: "Jessica Red",
title: "Müşteri Başarı Yöneticisi, Prime Corp"
}
]
};

View file

@ -1,10 +0,0 @@
import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import App from './App.tsx';
import './index.css';
createRoot(document.getElementById('root')!).render(
<StrictMode>
<App />
</StrictMode>
);

View file

@ -1,111 +0,0 @@
import React from 'react';
import { Users, Award, Clock, Globe2 } from 'lucide-react';
import { useLanguage } from '../context/LanguageContext';
import { team } from '../locales/team';
const About: React.FC = () => {
const { t, language } = useLanguage();
const teamData = team[language];
return (
<div className="min-h-screen bg-gray-50">
{/* Hero Section */}
<div className="relative bg-blue-900 text-white py-24">
<div className="absolute inset-0 opacity-20" style={{
backgroundImage: 'url("https://images.pexels.com/photos/3183183/pexels-photo-3183183.jpeg?auto=compress&cs=tinysrgb&w=1920")',
backgroundSize: 'cover',
backgroundPosition: 'center',
}}></div>
<div className="container mx-auto pt-16 px-4 relative">
<h1 className="text-5xl font-bold mb-6">{t('about.title')}</h1>
<p className="text-xl max-w-3xl">
{t('about.subtitle')}
</p>
</div>
</div>
{/* Stats Section */}
<div className="py-16 bg-white">
<div className="container mx-auto px-4">
<div className="grid grid-cols-1 md:grid-cols-4 gap-8">
<div className="text-center">
<Users className="w-12 h-12 text-blue-600 mx-auto mb-4" />
<div className="text-4xl font-bold text-gray-900 mb-2">300+</div>
<div className="text-gray-600">{t('about.stats.clients')}</div>
</div>
<div className="text-center">
<Award className="w-12 h-12 text-blue-600 mx-auto mb-4" />
<div className="text-4xl font-bold text-gray-900 mb-2">20+</div>
<div className="text-gray-600">{t('about.stats.experience')}</div>
</div>
<div className="text-center">
<Clock className="w-12 h-12 text-blue-600 mx-auto mb-4" />
<div className="text-4xl font-bold text-gray-900 mb-2">7/24</div>
<div className="text-gray-600">{t('about.stats.support')}</div>
</div>
<div className="text-center">
<Globe2 className="w-12 h-12 text-blue-600 mx-auto mb-4" />
<div className="text-4xl font-bold text-gray-900 mb-2">3</div>
<div className="text-gray-600">{t('about.stats.countries')}</div>
</div>
</div>
</div>
</div>
{/* Main Content */}
<div className="py-6">
<div className="container mx-auto px-4">
<div className="mb-6">
<div className="space-y-6 mx-auto mx-auto text-gray-800 text-lg leading-relaxed">
<p className="bg-white p-5 shadow-md border-l-4 border-blue-600">
{t('about.description.part1')}
</p>
<p className="italic text-center text-blue-700 font-semibold">
{t('about.description.motto')}
</p>
<p className="bg-white p-5 shadow-md border-l-4 border-blue-600">
{t('about.description.part2')}
</p>
<p className="text-center text-blue-700 font-medium">
{t('about.description.closing')}
</p>
</div>
</div>
<div className="grid grid-cols-1 lg:grid-cols-2 gap-12">
<div className="bg-white p-8 rounded-xl shadow-lg">
<h3 className="text-2xl font-bold text-gray-900 mb-4">{t('about.mission')}</h3>
<p className="text-gray-700">{t('about.mission.desc')}</p>
</div>
<div className="bg-white p-8 rounded-xl shadow-lg">
<h3 className="text-2xl font-bold text-gray-900 mb-4">{t('about.vision')}</h3>
<p className="text-gray-700">{t('about.vision.desc')}</p>
</div>
</div>
</div>
</div>
{/* Team Section */}
<div className="py-16 bg-white">
<div className="container mx-auto px-4">
<h2 className="text-3xl font-bold text-gray-900 text-center mb-12">
{t('about.team')}
</h2>
<div className="grid grid-cols-1 md:grid-cols-5 gap-8">
{teamData.map((member, index) => (
<div key={index} className="text-center">
<img src={member.imageUrl} alt={member.name} className="w-32 h-32 rounded-full mx-auto mb-4 object-cover" />
<h3 className="text-xl font-semibold text-gray-900">{member.name}</h3>
<p className="text-gray-600">{member.title}</p>
</div>
))}
</div>
</div>
</div>
</div>
);
};
export default About;

View file

@ -1,102 +0,0 @@
import React from 'react';
import { Calendar, Clock, User } from 'lucide-react';
import { useLanguage } from '../context/LanguageContext';
import { Link } from 'react-router-dom';
import { blogPostsList, BlogPostContent } from '../locales/blogContent'; // blogPostsList ve BlogPostContent interface'ini import et
const Blog: React.FC = () => {
const { t } = useLanguage();
// Basit slug oluşturma fonksiyonu
const createSlug = (title: string) => {
return title
.toLowerCase()
.replace(/ /g, '-')
.replace(/[^\w-]+/g, '');
};
return (
<div className="min-h-screen bg-gray-50">
{/* Hero Section */}
<div className="relative bg-blue-900 text-white py-24">
<div className="absolute inset-0 opacity-20" style={{
backgroundImage: 'url("https://images.pexels.com/photos/3183160/pexels-photo-3183160.jpeg?auto=compress&cs=tinysrgb&w=1920")',
backgroundSize: 'cover',
backgroundPosition: 'center',
}}></div>
<div className="container mx-auto pt-16 px-4 relative">
<h1 className="text-5xl font-bold mb-6">{t('blog.title')}</h1>
<p className="text-xl max-w-3xl">
{t('blog.subtitle')}
</p>
</div>
</div>
{/* Blog Posts Grid */}
<div className="container mx-auto px-4 py-16">
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
{blogPostsList.map((post, index) => (
<Link to={`/blog/${post.slug}`} key={index} className="block">
<article className="bg-white rounded-xl shadow-lg overflow-hidden hover:shadow-xl transition-shadow">
<div className="aspect-w-16 aspect-h-9 relative">
<img
src={post.image} // Görsel bilgisi doğrudan post objesinden alınıyor
alt={t(post.title)}
className="object-cover w-full h-48"
/>
<div className="absolute top-4 right-4 bg-blue-600 text-white px-3 py-1 rounded-full text-sm">
{t(post.category)}
</div>
</div>
<div className="p-6">
<h2 className="text-xl font-bold text-gray-900 mb-3 hover:text-blue-600 transition-colors">
{t(post.title)}
</h2>
<p className="text-gray-600 mb-4">
{t(post.excerpt)}
</p>
<div className="flex items-center text-sm text-gray-500 space-x-4">
<div className="flex items-center">
<User size={16} className="mr-1" />
{post.author} {/* Yazar bilgisi doğrudan post objesinden alınıyor */}
</div>
<div className="flex items-center">
<Calendar size={16} className="mr-1" />
{t(post.date)}
</div>
<div className="flex items-center">
<Clock size={16} className="mr-1" />
{post.readTime}
</div>
</div>
</div>
</article>
</Link>
))}
</div>
</div>
{/* Newsletter Section */}
<div className="bg-white py-16">
<div className="container mx-auto px-4 text-center">
<h2 className="text-3xl font-bold text-gray-900 mb-4">{t('blog.subscribe')}</h2>
<p className="text-gray-600 mb-8 max-w-2xl mx-auto">
{t('blog.subscribe.desc')}
</p>
<div className="max-w-md mx-auto flex gap-4">
<input
type="email"
placeholder={t('common.email')}
className="flex-1 px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
/>
<button className="bg-blue-600 text-white px-6 py-2 rounded-lg hover:bg-blue-700 transition-colors">
{t('common.subscribe')}
</button>
</div>
</div>
</div>
</div>
);
};
export default Blog;

View file

@ -1,70 +0,0 @@
import React from 'react';
import { Link, useParams } from 'react-router-dom'; // Link ve useParams'ı import et
import { useLanguage } from '../context/LanguageContext'; // useLanguage hook'unu import et
import { blogContent, BlogPostContent } from '../locales/blogContent'; // blogContent ve BlogPostContent interface'ini import et
const BlogDetail: React.FC = () => {
const { id } = useParams<{ id: string }>();
const { t, language } = useLanguage(); // useLanguage hook'unu kullan ve dil bilgisini al
// Basit slug oluşturma fonksiyonu (Blog.tsx'teki ile aynı olmalı)
const createSlug = (title: string) => {
return title
.toLowerCase()
.replace(/ /g, '-')
.replace(/[^\w-]+/g, '');
};
// URL'deki slug'a göre blog yazısını bul
// blogContent objesinden slug'a karşılık gelen blog yazısını ve mevcut dile göre içeriğini al
const postData = blogContent[id || '']; // id undefined olabilir, boş string ile kontrol et
const blogPost = postData ? postData[language as 'tr' | 'en'] : undefined; // Mevcut dile göre içeriği al
if (!blogPost) {
return (
<div className="min-h-screen bg-gray-50 flex items-center justify-center">
<h1 className="text-2xl font-bold text-gray-900">{t('blog.notFound')}</h1> {/* Çeviri kullan */}
</div>
);
}
return (
<div className="min-h-screen bg-gray-50 pt-32 pb-16"> {/* py-16 yerine pt-32 pb-16 kullanıldı */}
<div className="container mx-auto px-4">
<Link to="/blog" className="text-blue-600 hover:underline mb-4 inline-block">
&larr; {t('blog.backToBlog')} {/* Geri dönüş butonu */}
</Link>
{/* Blog yazısı görseli */}
{postData.image && (
<img
src={postData.image} // Görsel bilgisi blogContent'ten alınıyor
alt={t(blogPost.title)} // Alt metni çevir
className="w-full h-96 object-cover rounded-lg mb-8"
/>
)}
<h1 className="text-4xl font-bold text-gray-900 mb-6">{t(blogPost.title)}</h1> {/* Çeviri kullan */}
{/* Yazar, tarih, okuma süresi gibi bilgiler eklenebilir */}
<div className="flex items-center text-sm text-gray-500 space-x-4 mb-8">
<div className="flex items-center">
{/* <User size={16} className="mr-1" /> */} {/* İkonlar eklenebilir */}
<span>{postData.author}</span> {/* Yazar bilgisi blogContent'ten alınıyor */}
</div>
<div className="flex items-center">
{/* <Calendar size={16} className="mr-1" /> */}
{t(blogPost.date)} {/* Çeviri kullan */}
</div>
<div className="flex items-center">
{/* <Clock size={16} className="mr-1" /> */}
{blogPost.readTime}
</div>
</div>
<div className="prose max-w-none text-gray-800"> {/* Tailwind Typography eklentisi kuruluysa kullanılabilir */}
<p>{t(blogPost.content)}</p> {/* Tam içeriği çevirerek göster */}
{/* Daha uzun içerik burada paragraflar halinde yer alabilir */}
</div>
</div>
</div>
);
};
export default BlogDetail;

View file

@ -1,312 +0,0 @@
import React from "react";
import {
Mail,
Phone,
MapPin,
Clock,
Globe,
FileText,
Building,
CalendarDays,
CalendarCheck,
MessageCircle,
} from "lucide-react";
import { useLanguage } from "../context/LanguageContext";
const Contact: React.FC = () => {
const { t } = useLanguage();
return (
<div className="min-h-screen bg-gray-50">
{/* Hero Section */}
<div className="relative bg-blue-900 text-white py-24">
<div
className="absolute inset-0 opacity-20"
style={{
backgroundImage:
'url("https://images.pexels.com/photos/3183171/pexels-photo-3183171.jpeg?auto=compress&cs=tinysrgb&w=1920")',
backgroundSize: "cover",
backgroundPosition: "center",
}}
></div>
<div className="container mx-auto pt-16 px-4 relative">
<h1 className="text-5xl font-bold mb-6">{t("contact.title")}</h1>
<p className="text-xl max-w-3xl">{t("contact.subtitle")}</p>
</div>
</div>
<div className="py-16">
<div className="container mx-auto px-4">
<div className="grid grid-cols-1 lg:grid-cols-2 gap-12">
{/* Contact Information */}
<div className="space-y-4">
<div className="bg-white rounded-xl shadow-lg p-8">
<h2 className="text-2xl font-bold text-gray-900 mb-6">
{t("contact.info.title")}
</h2>
<div className="space-y-6">
<div className="flex items-start space-x-4">
<MapPin className="w-6 h-6 text-blue-600 flex-shrink-0 mt-1" />
<div>
<p className="text-gray-600">
{t("contact.address.full")}
</p>
</div>
</div>
<div className="flex items-start space-x-4">
<Phone className="w-6 h-6 text-blue-600 flex-shrink-0" />
<div>
<p className="text-gray-600">+90 (544) 769 7 638</p>
</div>
</div>
<div className="flex items-start space-x-4">
<Mail className="w-6 h-6 text-blue-600 flex-shrink-0" />
<div>
<p className="text-gray-600">
<a
href="mailto:destek@sozsoft.com"
className="hover:underline text-blue-600"
>
destek@sozsoft.com
</a>
</p>
</div>
</div>
<div className="flex items-start space-x-4">
<Building className="w-6 h-6 text-blue-600 flex-shrink-0" />
<div>
<p className="text-gray-600">Kozyatağı</p>
</div>
</div>
<div className="flex items-start space-x-4">
<FileText className="w-6 h-6 text-blue-600 flex-shrink-0" />
<div>
<p className="text-gray-600">32374982750</p>
</div>
</div>
</div>
</div>
<div className="bg-white rounded-xl shadow-lg p-8">
<h2 className="text-2xl font-bold text-gray-900 mb-6">
{t("contact.bank.title")}
</h2>
<div className="space-y-4">
<img
src="/img/enpara.svg"
alt="Enpara Logo"
className="w-24 object-contain mt-1 flex-shrink-0"
/>
<div>
<h3 className="font-semibold text-gray-900">
Özlem Öztürk
</h3>
<p className="text-gray-600">
03663 / Enpara
<br />
73941177
<br />
TR65 0011 1000 0000 0073 9411 77
</p>
</div>
</div>
</div>
{/* Bank Information */}
<div className="bg-white rounded-xl shadow-lg p-8">
<h2 className="text-2xl font-bold text-gray-900 mb-6">
{t("contact.workHours")}
</h2>
<div className="space-y-4">
<div className="flex items-start space-x-4">
<div className="space-y-2">
<div className="flex items-center space-x-2">
<CalendarDays className="w-5 h-5 text-blue-500" />
<p className="text-gray-600">
{t("contact.workHours.weekday")}
</p>
</div>
<div className="flex items-center space-x-2">
<CalendarCheck className="w-5 h-5 text-blue-500" />
<p className="text-gray-600">
{t("contact.workHours.weekend")}
</p>
</div>
<div className="flex items-center space-x-2">
<MessageCircle className="w-5 h-5 text-green-500" />
<p className="text-gray-600">
{t("contact.workHours.whatsapp")}
</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div className="space-y-8">
<div className="bg-white rounded-xl shadow-lg p-8">
<h2 className="text-2xl font-bold text-gray-900 mb-6">
{t("demo.form.title")}
</h2>
<form className="space-y-6">
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<label
htmlFor="company"
className="block text-sm font-medium text-gray-700 mb-2"
>
{t("common.company") || "Şirket Adı"}
</label>
<input
type="text"
id="company"
name="company"
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
/>
</div>
<div>
<label
htmlFor="fullName"
className="block text-sm font-medium text-gray-700 mb-2"
>
{t("common.fullName") || "Adınız Soyadınız"}
</label>
<input
type="text"
id="fullName"
name="fullName"
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
/>
</div>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<label
htmlFor="email"
className="block text-sm font-medium text-gray-700 mb-2"
>
{t("common.email")}
</label>
<input
type="email"
id="email"
name="email"
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
/>
</div>
<div>
<label
htmlFor="phone"
className="block text-sm font-medium text-gray-700 mb-2"
>
{t("common.phone")}
</label>
<input
type="tel"
id="phone"
name="phone"
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
/>
</div>
</div>
<div>
<label
htmlFor="address"
className="block text-sm font-medium text-gray-700 mb-2"
>
{t("common.address")}
</label>
<input
type="text"
id="address"
name="address"
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
/>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<label
htmlFor="branchCount"
className="block text-sm font-medium text-gray-700 mb-2"
>
{t("common.branchCount") || "Şube Adedi"}
</label>
<input
type="number"
id="branchCount"
name="branchCount"
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
/>
</div>
<div>
<label
htmlFor="userCount"
className="block text-sm font-medium text-gray-700 mb-2"
>
{t("common.userCount") || "Kullanıcı Adedi"}
</label>
<input
type="number"
id="userCount"
name="userCount"
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
/>
</div>
</div>
<div>
<label
htmlFor="message"
className="block text-sm font-medium text-gray-700 mb-2"
>
{t("common.message")}
</label>
<textarea
id="message"
name="message"
rows="10"
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
/>
</div>
<button
type="submit"
className="w-full bg-blue-600 text-white py-3 px-6 rounded-lg hover:bg-blue-700 transition-colors font-semibold"
>
{t("common.send")}
</button>
</form>
</div>
</div>
</div>
</div>
</div>
{/* Map Section */}
<div className="bg-white py-16">
<div className="container mx-auto px-4">
<h2 className="text-2xl font-bold text-gray-900 mb-8 text-center">
{t("contact.location")}
</h2>
<div className="aspect-w-16 aspect-h-9 bg-gray-200 rounded-xl overflow-hidden">
<iframe
src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3006.209566407676!2d28.757000999999992!3d41.10811400000001!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x0%3A0x8a0bbbdfcfd3fd24!2zU8O2enNvZnQ!5e0!3m2!1str!2str!4v1450816303558"
width="100%"
height="450"
style={{ border: 0 }}
allowFullScreen
loading="lazy"
referrerPolicy="no-referrer-when-downgrade"
></iframe>
</div>
</div>
</div>
</div>
);
};
export default Contact;

View file

@ -1,21 +0,0 @@
import React from "react";
import Hero from "../components/home/Hero";
import Features from "../components/home/Features";
import Solutions from "../components/home/Solutions";
import Testimonials from "../components/home/Testimonials";
import CallToAction from "../components/home/CallToAction";
import { Code, Cpu, Globe2 } from "lucide-react";
const Home: React.FC = () => {
return (
<div className="min-h-screen">
<Hero />
<Features />
<Solutions />
<Testimonials />
<CallToAction />
</div>
);
};
export default Home;

View file

@ -1,243 +0,0 @@
import React from "react";
import {
ArrowRight,
BarChart,
BookOpen,
CheckCircle,
CreditCard,
Users,
} from "lucide-react";
import { Link } from "react-router-dom";
import { useLanguage } from "../context/LanguageContext";
const Products: React.FC = () => {
const { t } = useLanguage();
const products = [
{
title: t("products.kurs.title"),
description: t("products.kurs.desc"),
image:
"https://images.pexels.com/photos/3183183/pexels-photo-3183183.jpeg?auto=compress&cs=tinysrgb&w=1920",
features: [
t("products.kurs.features.inventory"),
t("products.kurs.features.purchasing"),
t("products.kurs.features.sales"),
t("products.kurs.features.accounting"),
t("products.kurs.features.reporting"),
t("products.kurs.features.mobile"),
],
},
];
const modules = [
{
image:
"https://images.pexels.com/photos/3183183/pexels-photo-3183183.jpeg?auto=compress&cs=tinysrgb&w=1920",
title: t("products.modules.sales.title"),
icon: <Users className="w-16 h-16 text-white" />,
features: [
t("products.modules.sales.features.appointment"),
t("products.modules.sales.features.meeting"),
t("products.modules.sales.features.campaign"),
t("products.modules.sales.features.adStats"),
t("products.modules.sales.features.applicant"),
t("products.modules.sales.features.corporate"),
t("products.modules.sales.features.consultant"),
],
color: "bg-blue-600",
},
{
description: t("products.crm.desc"),
image:
"https://images.pexels.com/photos/3184291/pexels-photo-3184291.jpeg?auto=compress&cs=tinysrgb&w=1920",
title: t("products.modules.student.title"),
icon: <BookOpen className="w-16 h-16 text-white" />,
features: [
t("products.modules.student.features.sales"),
t("products.modules.student.features.contract"),
t("products.modules.student.features.installment"),
t("products.modules.student.features.level"),
t("products.modules.student.features.attendance"),
t("products.modules.student.features.exam"),
t("products.modules.student.features.homework"),
],
color: "bg-purple-600",
},
{
description: t("products.ecommerce.desc"),
image:
"https://images.pexels.com/photos/3183132/pexels-photo-3183132.jpeg?auto=compress&cs=tinysrgb&w=1920",
title: t("products.modules.accounting.title"),
icon: <CreditCard className="w-16 h-16 text-white" />,
features: [
t("products.modules.accounting.features.cash"),
t("products.modules.accounting.features.bank"),
t("products.modules.accounting.features.current"),
t("products.modules.accounting.features.teacherFee"),
t("products.modules.accounting.features.consultantCommission"),
t("products.modules.accounting.features.personnelSalary"),
t("products.modules.accounting.features.incomeExpense"),
],
color: "bg-green-600",
},
{
description: t("products.hr.desc"),
image:
"https://images.pexels.com/photos/3184292/pexels-photo-3184292.jpeg?auto=compress&cs=tinysrgb&w=1920",
title: t("products.modules.reporting.title"),
icon: <BarChart className="w-16 h-16 text-white" />,
features: [
t("products.modules.reporting.features.dynamic"),
t("products.modules.reporting.features.ready"),
t("products.modules.reporting.features.periodic"),
t("products.modules.reporting.features.performance"),
t("products.modules.reporting.features.branch"),
t("products.modules.reporting.features.financial"),
t("products.modules.reporting.features.studentSuccess"),
],
color: "bg-red-600",
},
];
const pricing = [
{
title: t("products.pricing.user.title"),
price: t("products.pricing.user.price"),
period: t("products.pricing.user.period"),
yearlyPrice: t("products.pricing.user.yearlyPrice"),
description: t("products.pricing.user.description"),
},
{
title: t("products.pricing.teacher.title"),
price: t("products.pricing.teacher.price"),
period: t("products.pricing.teacher.period"),
yearlyPrice: t("products.pricing.teacher.yearlyPrice"),
description: t("products.pricing.teacher.description"),
},
{
title: t("products.pricing.founder.title"),
price: t("products.pricing.founder.price"),
period: t("products.pricing.founder.period"),
yearlyPrice: t("products.pricing.founder.yearlyPrice"),
description: t("products.pricing.founder.description"),
},
];
return (
<div className="min-h-screen bg-gray-50">
{/* Hero Section */}
<div className="relative bg-blue-900 text-white py-24">
<div
className="absolute inset-0 opacity-20"
style={{
backgroundImage:
'url("https://images.pexels.com/photos/3183150/pexels-photo-3183150.jpeg?auto=compress&cs=tinysrgb&w=1920")',
backgroundSize: "cover",
backgroundPosition: "center",
}}
></div>
<div className="container mx-auto pt-16 px-4 relative">
<h1 className="text-5xl font-bold mb-6">{t("products.title")}</h1>
<p className="text-xl max-w-3xl">{t("products.subtitle")}</p>
</div>
</div>
{/* Products Grid */}
<div className="py-10">
<div className="container mx-auto px-4">
<div className="grid grid-cols-1 lg:grid-cols-1 gap-8">
{products.map((product, index) => (
<div
key={index}
className="bg-white rounded-xl shadow-lg overflow-hidden"
>
<div className="aspect-w-16 aspect-h-9">
<img
src={product.image}
alt={product.title}
className="object-cover w-full h-64"
/>
</div>
<div className="p-8">
<h2 className="text-2xl font-bold text-gray-900 mb-4">
{product.title}
</h2>
<p className="text-gray-600 mb-6">{product.description}</p>
<div className="space-y-3">
{product.features.map((feature, fIndex) => (
<div key={fIndex} className="flex items-center space-x-2">
<CheckCircle className="w-5 h-5 text-green-500" />
<span className="text-gray-700">{feature}</span>
</div>
))}
</div>
</div>
</div>
))}
</div>
</div>
</div>
{/* Modules Grid */}
<div className="py-10">
<div className="container mx-auto px-4">
<div className="grid grid-cols-1 md:grid-cols-2 gap-8">
{modules.map((module, index) => (
<div
key={index}
className={`${module.color} rounded-xl p-8 text-white`}
>
<div className="mb-6">{module.icon}</div>
<h3 className="text-2xl font-bold mb-6">{module.title}</h3>
<ul className="space-y-3">
{module.features.map((feature, fIndex) => (
<li key={fIndex} className="flex items-center space-x-2">
<CheckCircle className="w-5 h-5 flex-shrink-0" />
<span>{feature}</span>
</li>
))}
</ul>
</div>
))}
</div>
</div>
</div>
{/* Pricing Section */}
<div className="py-10 bg-white">
<div className="container mx-auto px-4">
<h2 className="text-3xl font-bold text-center mb-10">
{t("products.pricing.title")}
</h2>
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
{pricing.map((plan, index) => (
<div key={index} className="bg-white rounded-xl shadow-lg p-8 hover:shadow-xl transition-shadow">
<h3 className="text-xl font-bold mb-4">{plan.title}</h3>
<p className="text-gray-600 mb-8">{plan.description}</p>
</div>
))}
</div>
</div>
</div>
{/* Call to Action */}
<div className="bg-blue-900 text-white py-16">
<div className="container mx-auto px-4 text-center">
<h2 className="text-3xl font-bold mb-6">{t("products.cta.title")}</h2>
<p className="text-xl mb-8 max-w-2xl mx-auto">
{t("products.cta.description")}
</p>
<Link
to="/contact"
className="bg-white text-blue-900 px-8 py-3 rounded-lg font-semibold hover:bg-blue-50 transition-colors"
>
{t("products.cta.demo")}
</Link>
</div>
</div>
</div>
);
};
export default Products;

View file

@ -1,239 +0,0 @@
import React from "react";
import {
Code2,
Database,
Globe2,
Smartphone,
Server,
Users,
Shield,
Settings,
CheckCircle,
} from "lucide-react";
import { Link } from "react-router-dom";
import { useLanguage } from "../context/LanguageContext";
const Services: React.FC = () => {
const { t } = useLanguage();
const services = [
{
icon: <Code2 className="w-12 h-12 text-blue-600" />,
title: t("services.software.title"),
description: t("services.software.desc"),
features: [
t("services.software.features.analysis"),
t("services.software.features.design"),
t("services.software.features.development"),
t("services.software.features.testing"),
t("services.software.features.maintenance"),
],
},
{
icon: <Users className="w-12 h-12 text-purple-600" />,
title: t("services.web.title"),
description: t("services.web.desc"),
features: [
t("services.web.features.frontend"),
t("services.web.features.backend"),
t("services.web.features.api"),
t("services.web.features.seo"),
t("services.web.features.performance"),
],
},
{
icon: <Shield className="w-12 h-12 text-green-600" />,
title: t("services.mobile.title"),
description: t("services.mobile.desc"),
features: [
t("services.mobile.features.design"),
t("services.mobile.features.native"),
t("services.mobile.features.cross"),
t("services.mobile.features.push"),
t("services.mobile.features.store"),
],
},
{
icon: <Server className="w-12 h-12 text-red-600" />,
title: t("services.database.title"),
description: t("services.database.desc"),
features: [
t("services.database.features.design"),
t("services.database.features.optimization"),
t("services.database.features.migration"),
t("services.database.features.backup"),
t("services.database.features.recovery"),
],
},
{
icon: <Globe2 className="w-12 h-12 text-yellow-600" />,
title: t("services.integration.title"),
description: t("services.integration.desc"),
features: [
t("services.integration.features.api"),
t("services.integration.features.middleware"),
t("services.integration.features.legacy"),
t("services.integration.features.realtime"),
t("services.integration.features.monitoring"),
],
},
{
icon: <Settings className="w-12 h-12 text-indigo-600" />,
title: t("services.consulting.title"),
description: t("services.consulting.desc"),
features: [
t("services.consulting.features.tech"),
t("services.consulting.features.project"),
t("services.consulting.features.digital"),
t("services.consulting.features.risk"),
t("services.consulting.features.training"),
],
},
];
const supportPlans = [
{
title: t("services.support.branchRemote.title"),
price: t("services.support.branchRemote.price"),
period: t("services.support.branchRemote.period"),
features: [
t("services.support.branchRemote.features.priority"),
t("services.support.branchRemote.features.remote"),
t("services.support.branchRemote.features.optimization"),
t("services.support.branchRemote.features.maintenance"),
t("services.support.branchRemote.features.consulting"),
],
},
{
title: t("services.support.backup.title"),
price: t("services.support.backup.price"),
period: t("services.support.backup.period"),
features: [
t("services.support.backup.features.daily"),
t("services.support.backup.features.encrypted"),
t("services.support.backup.features.recovery"),
t("services.support.backup.features.verification"),
t("services.support.backup.features.access"),
],
},
{
title: t("services.support.sms.title"),
price: t("services.support.sms.price"),
period: t("services.support.sms.period"),
features: [
t("services.support.sms.features.packages"),
t("services.support.sms.features.bulk"),
t("services.support.sms.features.template"),
t("services.support.sms.features.reporting"),
t("services.support.sms.features.api"),
],
},
];
return (
<div className="min-h-screen bg-gray-50">
{/* Hero Section */}
<div className="relative bg-blue-900 text-white py-24">
<div
className="absolute inset-0 opacity-20"
style={{
backgroundImage:
'url("https://images.pexels.com/photos/3183173/pexels-photo-3183173.jpeg?auto=compress&cs=tinysrgb&w=1920")',
backgroundSize: "cover",
backgroundPosition: "center",
}}
></div>
<div className="container mx-auto pt-16 px-4 relative">
<h1 className="text-5xl font-bold mb-6">{t("services.title")}</h1>
<p className="text-xl max-w-3xl">{t("services.subtitle")}</p>
</div>
</div>
{/* Services Grid */}
<div className="py-16">
<div className="container mx-auto px-4">
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
{services.map((service, index) => (
<div
key={index}
className="bg-white rounded-xl shadow-lg p-8 hover:shadow-xl transition-shadow"
>
<div className="mb-6">{service.icon}</div>
<h3 className="text-2xl font-bold text-gray-900 mb-4">
{service.title}
</h3>
<p className="text-gray-600 mb-6">{service.description}</p>
<ul className="space-y-2">
{service.features.map((feature, fIndex) => (
<li
key={fIndex}
className="flex items-center text-gray-700"
>
<span className="w-2 h-2 bg-blue-600 rounded-full mr-2"></span>
{feature}
</li>
))}
</ul>
</div>
))}
</div>
</div>
</div>
{/* Support Plans */}
<div className="bg-white py-10">
<div className="container mx-auto px-4">
<h2 className="text-3xl font-bold text-center mb-10">
{t("services.support.title")}
</h2>
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
{supportPlans.map((plan, index) => (
<div
key={index}
className="bg-white rounded-xl shadow-lg p-8 border border-gray-200"
>
<h3 className="text-xl font-bold mb-4">{plan.title}</h3>
<ul className="space-y-3 mb-8">
{plan.features.map((feature, fIndex) => (
<li
key={fIndex}
className="flex items-center space-x-2 text-gray-700"
>
<CheckCircle className="w-5 h-5 text-green-500 flex-shrink-0" />
<span>{feature}</span>
</li>
))}
</ul>
<Link
to="/contact"
className="block text-center bg-blue-600 text-white px-6 py-3 rounded-lg hover:bg-blue-700 transition-colors"
>
{t("services.support.contactButton")}
</Link>
</div>
))}
</div>
</div>
</div>
{/* Call to Action */}
<div className="bg-blue-900 text-white py-16">
<div className="container mx-auto px-4 text-center">
<h2 className="text-3xl font-bold mb-6">{t("services.cta.title")}</h2>
<p className="text-xl mb-8 max-w-2xl mx-auto">
{t("services.cta.description")}
</p>
<Link
to="/contact"
className="bg-white text-blue-900 px-8 py-3 rounded-lg font-semibold hover:bg-blue-50 transition-colors"
>
{t("services.cta.contact")}
</Link>
</div>
</div>
</div>
);
};
export default Services;

View file

@ -1 +0,0 @@
/// <reference types="vite/client" />

View file

@ -1,8 +0,0 @@
/** @type {import('tailwindcss').Config} */
export default {
content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],
theme: {
extend: {},
},
plugins: [],
};

View file

@ -1,24 +0,0 @@
{
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"module": "ESNext",
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": true,
"jsx": "react-jsx",
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true
},
"include": ["src"]
}

View file

@ -1,7 +0,0 @@
{
"files": [],
"references": [
{ "path": "./tsconfig.app.json" },
{ "path": "./tsconfig.node.json" }
]
}

View file

@ -1,22 +0,0 @@
{
"compilerOptions": {
"target": "ES2022",
"lib": ["ES2023"],
"module": "ESNext",
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": true,
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true
},
"include": ["vite.config.ts"]
}

View file

@ -1,24 +0,0 @@
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
// https://vitejs.dev/config/
export default defineConfig({
plugins: [react()],
server: {
open: true,
port: 3003,
},
optimizeDeps: {
exclude: ['lucide-react'],
},
build: {
outDir: 'dist',
sourcemap: false,
},
preview: {
host: '0.0.0.0',
port: 80,
open: false,
allowedHosts: ['sozsoft.com', 'localhost'],
},
});

View file

@ -51,38 +51,6 @@
- cd sozsoft.com/
- sudo chmod 775 *
## Git Kurulumu
- cd ~
- git config --global http.sslVerify false
- git clone https://github.com/iamsedatozturk/kurs-platform.git
- cd kurs-platform/
- git config core.fileMode false
- chmod 775 *
- cd configs/deployment
- chmod 775 *
- cd configs
- chmod 775 *
- cd ..
- cd scripts
- chmod 775 *
- cd ~/kurs-platform/configs/deployment/scripts/
- İçerisindeki ihtiyaç olan scriptler çalıştırılır.
- n8n çalışmayınca n8n containerını çalıştırır ve hızlıca `docker run --rm -v kurs-devops_n8n_data:/data alpine chown -R 1000:1000 /data` kodu çalıştırılacak.
## Nginx Kurulumu
- sudo apt update
- sudo apt install nginx -y
- sudo systemctl status nginx
- sudo rm /etc/nginx/sites-enabled/default
- sudo rm /etc/nginx/sites-enabled/nginx.conf
- sudo cp ~/kurs-platform/configs/deployment/configs/nginx.conf /etc/nginx/sites-available/
- sudo ln -s /etc/nginx/sites-available/nginx.conf /etc/nginx/sites-enabled/
- sudo cp -r ./sozsoft.com /etc/ssl/sozsoft.com
- sudo systemctl restart nginx
- sudo nginx -t
## Forgejo kurulumu ayarları yapılacak
- home klasöründeki `cd ~/forgejo/data/gitea/conf` klasörün altındaki app.ini dosyasına aşağıdaki satırlar eklenecek.
@ -131,17 +99,24 @@
chmod 775 *
cd ~/kurs-platform
docker compose -f ./docker-compose-devops.yml up -d
n8n çalışmayınca `docker run --rm -v kurs-devops_n8n_data:/data alpine chown -R 1000:1000 /data` kodu çalıştırılacak.
docker compose -f ./docker-compose-devops.yml down
docker compose -f ./docker-compose-devops.yml up -d
## hosts yönlendirme
- 192.168.0.2 devops.sozsoft.com
- 192.168.0.2 chat.sozsoft.com
- 192.168.0.2 ai.sozsoft.com
- 192.168.0.2 sozsoft.com
- 192.168.0.2 demo.sozsoft.com
- 192.168.0.2 kurs.sozsoft.com
- 192.168.0.2 kurs-api.sozsoft.com
- 192.168.0.2 kurs-cdn.sozsoft.com
## Git Kurulumu
`ipconfig /flushdns`
- cd ~
- git config --global http.sslVerify false
- git clone https://devops.sozsoft.com/kurs/kurs-platform.git
- cd kurs-platform/
- git config core.fileMode false
- chmod 775 *
- cd configs/deployment
- chmod 775 *
- cd configs
- chmod 775 *
- cd ..
- cd scripts
- chmod 775 *
- cd ~/kurs-platform
- ./build-production.sh

View file

@ -0,0 +1,11 @@
sudo apt update
sudo apt install nginx -y
sudo systemctl status nginx
sudo rm /etc/nginx/sites-enabled/nginx.conf
sudo cp ~/kurs-platform/configs/deployment/configs/nginx.conf /etc/nginx/sites-available/
sudo ln -s /etc/nginx/sites-available/nginx.conf /etc/nginx/sites-enabled/
sudo cp -r ./sozsoft.com /etc/ssl/sozsoft.com
sudo systemctl restart nginx
sudo nginx -t
docker run --rm -v kurs-devops_n8n_data:/data alpine chown -R 1000:1000 /data

View file

@ -28,7 +28,7 @@ server {
# chat.sozsoft.com - Rocket.Chat
server {
listen 443 ssl http2;
listen 443 ssl;
server_name chat.sozsoft.com;
ssl_certificate /etc/ssl/sozsoft.com/cert1.pem;
@ -45,7 +45,7 @@ server {
# ai.sozsoft.com - n8n
server {
listen 443 ssl http2;
listen 443 ssl;
server_name ai.sozsoft.com;
ssl_certificate /etc/ssl/sozsoft.com/cert1.pem;
@ -81,27 +81,9 @@ server {
}
}
# sozsoft.com
server {
listen 443 ssl http2;
server_name sozsoft.com;
ssl_certificate /etc/ssl/sozsoft.com/cert1.pem;
ssl_certificate_key /etc/ssl/sozsoft.com/privkey1.pem;
underscores_in_headers on;
ignore_invalid_headers off;
large_client_header_buffers 4 16k;
location / {
proxy_pass http://127.0.0.1:3003; # PORT belirtildi
include /etc/nginx/proxy_params;
}
}
# kurs-api.sozsoft.com
server {
listen 443 ssl http2;
listen 443 ssl;
server_name kurs-api.sozsoft.com;
ssl_certificate /etc/ssl/sozsoft.com/cert1.pem;
@ -115,7 +97,7 @@ server {
# kurs-cdn.sozsoft.com
server {
listen 443 ssl http2;
listen 443 ssl;
server_name kurs-cdn.sozsoft.com;
ssl_certificate /etc/ssl/sozsoft.com/cert1.pem;

View file

@ -14,9 +14,6 @@ services:
ui:
image: devops.sozsoft.com/kurs/kurs-platform-ui:dev-latest
restart: always
company:
image: devops.sozsoft.com/kurs/kurs-platform-company:dev-latest
restart: always
cdn:
restart: always
nginx:

View file

@ -14,9 +14,6 @@ services:
ui:
image: devops.sozsoft.com/kurs/kurs-platform-ui:production-latest
restart: always
company:
image: devops.sozsoft.com/kurs/kurs-platform-company:production-latest
restart: always
cdn:
restart: always
# nginx:

View file

@ -60,16 +60,6 @@ services:
networks:
- default
# Company (UI)
company:
image: devops.sozsoft.com/kurs/kurs-platform-company:latest
container_name: kurs-company
profiles: ["app"]
ports:
- 3003:80 # ⚠️ UI uygulaması için dış port açıldı
networks:
- default
# NGINX konteyneri (opsiyonel - eğer sistemde yoksa)
# nginx:
# image: nginx:1.27-alpine

View file

@ -107,8 +107,6 @@ services:
- N8N_PORT=5678
- NODE_ENV=production
- GENERIC_TIMEZONE=Europe/Istanbul
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
- N8N_RUNNERS_ENABLED=true
volumes:
- n8n_data:/home/node/.n8n
networks:

View file

@ -1,4 +1,3 @@
~/kurs-platform/configs/deployment/scripts/build/api.sh
~/kurs-platform/configs/deployment/scripts/build/migrator.sh
~/kurs-platform/configs/deployment/scripts/build/ui.sh dev
~/kurs-platform/configs/deployment/scripts/build/company.sh dev

View file

@ -1,4 +1,3 @@
~/kurs-platform/configs/deployment/scripts/build/api.sh
~/kurs-platform/configs/deployment/scripts/build/migrator.sh
~/kurs-platform/configs/deployment/scripts/build/ui.sh production
~/kurs-platform/configs/deployment/scripts/build/company.sh production

View file

@ -1,19 +0,0 @@
export ENV=${1:-dev}
echo "Env değeri: ${ENV}"
cd ~/kurs-platform
git checkout main
git fetch && git pull
cd ~/kurs-platform/company
VERSION=$(cat package.json \
| grep -o '"[^"]*"\s*:\s*"[^"]*"' \
| grep -E '^"(version)"' \
| sed 's/^.* //' \
| sed 's/"//g')
docker build \
-t devops.sozsoft.com/kurs/kurs-platform-company:${ENV}-${VERSION} \
-t devops.sozsoft.com/kurs/kurs-platform-company:${ENV}-latest \
-f Kurs.Platform.Company.Dockerfile --build-arg ENV=${ENV} .
docker push devops.sozsoft.com/kurs/kurs-platform-company:${ENV}-${VERSION}
docker push devops.sozsoft.com/kurs/kurs-platform-company:${ENV}-latest

View file

@ -82,7 +82,7 @@ define(['./workbox-54d0af47'], (function (workbox) { 'use strict';
"revision": "3ca0b8505b4bec776b69afdba2768812"
}, {
"url": "index.html",
"revision": "0.8un1j0slu5o"
"revision": "0.gqab4md54bg"
}], {});
workbox.cleanupOutdatedCaches();
workbox.registerRoute(new workbox.NavigationRoute(workbox.createHandlerBoundToURL("index.html"), {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

View file

@ -12,25 +12,26 @@ const Side = ({ children, content, ...rest }: SideProps) => {
return (
<div className="grid lg:grid-cols-3 h-full">
<div
className="relative bg-no-repeat bg-cover py-6 px-16 flex-col justify-between hidden lg:flex"
className="bg-no-repeat bg-cover py-6 px-16 flex-col justify-between hidden lg:flex"
style={{
backgroundImage: `url('/img/others/auth-side-bg.jpg')`,
}}
>
<div className="absolute inset-0 bg-black bg-opacity-50 z-0"></div>
<div className="relative z-10 flex flex-col h-full justify-between">
<Logo className="drop-shadow-md" />
<Logo mode="dark" />
<div>
<div className="mb-6 flex items-center gap-4">
<Avatar className="border-2 border-white" shape="circle" src="/img/others/cto.png" />
<Avatar
className="border-2 border-white"
shape="circle"
src="/img/others/cto.png"
/>
<div className="text-white">
<div className="font-semibold text-base">Sedat ÖZTÜRK</div>
<span className="opacity-80">Founder</span>
<span className="opacity-80">CTO</span>
</div>
</div>
<p className="text-lg text-white opacity-80">
From interactive desktop applications to immersive web and mobile solutions, we exist to
meet your needs today and ensure continued success tomorrow.
From interactive desktop applications to immersive web and mobile solutions, we exist to meet your needs today and ensure continued success tomorrow.
</p>
</div>
<span className="text-white">
@ -38,7 +39,6 @@ const Side = ({ children, content, ...rest }: SideProps) => {
<span className="font-semibold">{`${APP_NAME}`}</span>{' '}
</span>
</div>
</div>
<div className="col-span-2 flex flex-col justify-start sm:justify-center items-center bg-white dark:bg-gray-800">
<div className="w-full xl:max-w-[450px] px-8 max-w-[380px]">
<div className="mb-8">{content}</div>

View file

@ -16,7 +16,7 @@ const Captcha = forwardRef((props: CaptchaProps, ref: Ref<TurnstileInstance>) =>
<Turnstile
ref={ref}
className={className ?? 'mb-4 mx-auto'}
siteKey="0x4AAAAAABdEjmiXxcl0j7jp"
siteKey="0x4AAAAAAAGadwQME-GSYuJU"
onError={onError}
onExpire={onExpire}
onSuccess={onSuccess}

View file

@ -75,7 +75,7 @@ const SideNav = () => {
style={sideNavCollapse ? sideNavCollapseStyle : sideNavStyle}
className={classNames('side-nav', sideNavColor(), !sideNavCollapse && 'side-nav-expand')}
>
<div className="side-nav-header py-2">
<div className="side-nav-header">
<Logo
mode={logoMode()}
type={sideNavCollapse ? 'streamline' : 'full'}

View file

@ -96,7 +96,7 @@ const StackedSideNavMini = (props: StackedSideNavMiniProps) => {
<Logo mode={logoMode()} type="streamline" className={SIDE_NAV_CONTENT_GUTTER} />
<ScrollBar autoHide direction={direction}>
<Menu
className="px-4 pb-4 py-1"
className="px-4 pb-4"
variant={navMode}
defaultActiveKeys={activeKeys || [includedRouteTree.key]}
>

View file

@ -14,12 +14,9 @@ let didInit = false
const Theme = (props: CommonProps) => {
// ABP App Config'i uygulama acilirken al
const { getConfig } = useStoreActions((a) => a.abpConfig)
const { setTenantId } = useStoreActions((a) => a.auth)
useEffect(() => {
if (!didInit) {
didInit = true
setTenantId('')
getConfig(false)
}
}, [])

View file

@ -13,7 +13,7 @@ export const NAV_MODE_DARK = 'dark'
export const NAV_MODE_THEMED = 'themed'
export const NAV_MODE_TRANSPARENT = 'transparent'
export const SIDE_NAV_WIDTH = 330
export const SIDE_NAV_WIDTH = 290
export const SIDE_NAV_COLLAPSED_WIDTH = 80
export const SPLITTED_SIDE_NAV_MINI_WIDTH = 80
export const SPLITTED_SIDE_NAV_SECONDARY_WIDTH = 250

View file

@ -7,39 +7,16 @@ const authApiService = axios.create({
baseURL: appConfig.baseUrl,
})
function extractTitle(html: string): string {
const match = html.match(/<title[^>]*>([\s\S]*?)<\/title>/i)
return match ? match[1].replace(/<[^>]+>/g, '').trim() : html
}
function extractBody(html: string): string {
const match = html.match(/<body[^>]*>([\s\S]*?)<\/body>/i)
return match ? match[1].replace(/<[^>]+>/g, '').trim() : html
}
authApiService.interceptors.response.use(
(response) => response,
async (error) => {
//console.log('Error interceptor')
//console.error(error)
console.log('Error interceptor')
console.error(error)
const { messages } = store.getActions().base
let rawTitle = 'Hata!'
let rawMessage =
error.response?.data?.error_description ||
error.response?.data?.error?.message ||
error.response?.data?.message ||
error.message ||
'Bir hata oluştu'
if (error.response?.status === 404 && typeof error.response?.data === 'string') {
rawMessage = extractBody(error.response.data)
rawTitle = extractTitle(error.response.data)
}
messages.addError({
id: crypto.randomUUID(),
message: rawMessage, //error.response?.data?.error?.message ?? error.message ?? 'Bir hata oluştu',
title: rawTitle,
message: error.response?.data?.error?.message ?? error.message ?? 'Bir hata oluştu',
title: 'Hata!',
cid: error.response?.headers['x-correlation-id'],
statusCode: error.response?.status?.toString() ?? error.code,
})

View file

@ -2,6 +2,7 @@ import { FailedSignInResponse } from '@/@types/auth'
import ActionLink from '@/components/shared/ActionLink'
import Captcha from '@/components/shared/Captcha'
import PasswordInput from '@/components/shared/PasswordInput'
import { Select } from '@/components/ui'
import Alert from '@/components/ui/Alert'
import Button from '@/components/ui/Button'
import Checkbox from '@/components/ui/Checkbox'
@ -9,6 +10,7 @@ import { FormContainer, FormItem } from '@/components/ui/Form'
import Input from '@/components/ui/Input'
import PlatformLoginResultType from '@/constants/login.result.enum'
import { ROUTES_ENUM } from '@/constants/route.constant'
import { getTenants } from '@/proxy/admin/tenant/tenant.service'
import { useStoreActions, useStoreState } from '@/store'
import useAuth from '@/utils/hooks/useAuth'
import { useLocalization } from '@/utils/hooks/useLocalization'
@ -43,6 +45,7 @@ const validationSchema = Yup.object().shape({
const Login = () => {
const navigate = useNavigate()
const isMultiTenant = useStoreState((a) => a.abpConfig.config?.multiTenancy.isEnabled)
const tenantId = useStoreState((a) => a.auth.tenantId)
const { setTenantId } = useStoreActions((a) => a.auth)
const [message, setMessage] = useState('')
@ -58,27 +61,11 @@ const Login = () => {
}, 100)
}
const [tenantList, setTenantList] = useState<{ value?: string; label?: string }[]>([])
const { signIn } = useAuth()
const { translate } = useLocalization()
const getSubdomain = () => {
if (typeof window === 'undefined') return null
const hostname = window.location.hostname
const parts = hostname.split('.')
if (hostname === 'localhost' || parts.length < 3) {
return null
}
if (parts[0] === 'www') {
return parts[1]
}
return parts[0].toUpperCase()
}
const onSignIn = async (
values: SignInFormSchema,
{ setSubmitting, isSubmitting, setFieldValue, setFieldTouched }: any,
@ -167,27 +154,18 @@ const Login = () => {
setSubmitting(false)
}
const subDomainName = getSubdomain()
//const subDomainName = 'KURS2'
const tenantId = useStoreState((a) => a.auth.tenantId) ?? subDomainName
const tenantStyle: React.CSSProperties | undefined =
subDomainName && subDomainName !== 'KURS'
? {
opacity: 0,
position: 'absolute',
pointerEvents: 'none',
height: 0,
margin: 0,
padding: 0,
border: 'none',
const fetchData = async () => {
const response = await getTenants(0, 1000)
if (response.data?.items) {
setTenantList(response.data.items.map((a) => ({ value: a.id, label: a.name })))
}
}
: undefined
useEffect(() => {
if (!isMultiTenant) {
return
}
setTenantId(subDomainName || '')
fetchData()
}, [isMultiTenant])
return (
@ -201,22 +179,27 @@ const Login = () => {
<p>Please enter your credentials to sign in!</p>
</div>
{isMultiTenant && (
<>
<label className="form-label mb-2" style={tenantStyle}>
Company
</label>
<div className="mb-4">
<Input
<Select
placeholder={translate('::Sirket')}
value={tenantId || ''}
onChange={(e) => setTenantId(e.target.value)}
style={tenantStyle}
aria-hidden={subDomainName && subDomainName !== 'KURS' ? 'true' : 'false'}
isClearable={true}
options={tenantList}
value={tenantList.find((a) => a.value == tenantId)}
onChange={(option) => setTenantId(option?.value)}
/>
</div>
</>
)}
<div>
{message && (
<Alert showIcon className="mb-4" type="success">
{message}
</Alert>
)}
{error && (
<Alert showIcon className="mb-4" type="danger">
{error}
</Alert>
)}
<Formik
initialValues={{
userName: '',
@ -289,18 +272,6 @@ const Login = () => {
onSuccess={(token: string) => setFieldValue('captchaResponse', token)}
/>
)}
{message && (
<Alert showIcon className="mb-4" type="success">
{message}
</Alert>
)}
{error && (
<Alert showIcon className="mb-4" type="danger">
{error}
</Alert>
)}
<Button block loading={isSubmitting} variant="solid" type="submit">
{isSubmitting ? 'Signing in...' : 'Sign In'}
</Button>