feat: full Turkish translation + fix meal plan rendering
Some checks failed
CI/CD - Build, Push & Deploy / Build & Push Docker Image (push) Has been cancelled
CI/CD - Build, Push & Deploy / Update GitOps Manifest (push) Has been cancelled

- Translate all user-facing text to Turkish across dietitian.js,
  trainer.js, shopping.js, and index.html
- Fix meal plan not rendering: add frontend-compatible fields
  (macros, meals, recommended_water_liters) to diet plan response
- Translate meal types, diet types, day names, medical notes,
  supplements, tips, injury notes, workout titles
- Translate shopping list categories
- Translate login/register Email labels to E-posta

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-02 16:28:36 +00:00
parent 910b17342f
commit 0ec75c8afa
4 changed files with 289 additions and 257 deletions

View File

@@ -991,7 +991,7 @@
<div id="loginError" class="error-msg" style="display:none;"></div> <div id="loginError" class="error-msg" style="display:none;"></div>
<form onsubmit="handleLogin(event)"> <form onsubmit="handleLogin(event)">
<div class="form-group"> <div class="form-group">
<label>Email</label> <label>E-posta</label>
<input type="email" id="loginEmail" required placeholder="ornek@email.com"> <input type="email" id="loginEmail" required placeholder="ornek@email.com">
</div> </div>
<div class="form-group"> <div class="form-group">
@@ -1016,7 +1016,7 @@
<input type="text" id="regName" required placeholder="Adiniz Soyadiniz"> <input type="text" id="regName" required placeholder="Adiniz Soyadiniz">
</div> </div>
<div class="form-group"> <div class="form-group">
<label>Email</label> <label>E-posta</label>
<input type="email" id="regEmail" required placeholder="ornek@email.com"> <input type="email" id="regEmail" required placeholder="ornek@email.com">
</div> </div>
<div class="form-group"> <div class="form-group">
@@ -2700,6 +2700,7 @@ async function loadMeal() {
function renderMeal(el) { function renderMeal(el) {
var d = mealData; var d = mealData;
var mealTypeNames = { breakfast:'Kahvalti', snack:'Ara Ogun', lunch:'Ogle Yemegi', pre_workout:'Antrenman Oncesi', post_workout:'Antrenman Sonrasi', dinner:'Aksam Yemegi' };
var html = ''; var html = '';
// Diet type badge // Diet type badge
@@ -2779,7 +2780,7 @@ function renderMeal(el) {
html += '<div class="meal-day-body open">'; html += '<div class="meal-day-body open">';
d.meals.forEach(function(m) { d.meals.forEach(function(m) {
html += '<div class="meal-item">'; html += '<div class="meal-item">';
html += '<div class="meal-type">' + (m.type || '') + '</div>'; html += '<div class="meal-type">' + (mealTypeNames[m.type] || m.type || '') + '</div>';
html += '<div class="meal-name">' + (m.name || '') + '</div>'; html += '<div class="meal-name">' + (m.name || '') + '</div>';
html += '<div class="meal-macros">'; html += '<div class="meal-macros">';
html += '<span class="macro-tag macro-cal">' + (m.calories || 0) + ' kcal</span>'; html += '<span class="macro-tag macro-cal">' + (m.calories || 0) + ' kcal</span>';

View File

@@ -178,120 +178,120 @@ function getMedicalAdjustments(profile) {
if (profile.has_diabetes) { if (profile.has_diabetes) {
adjustments.push({ adjustments.push({
condition: "Diabetes", condition: "Diyabet",
actions: [ actions: [
"Prioritizing low glycemic index foods", "Dusuk glisemik indeksli gidalar onceliklendiriliyor",
"Limiting added sugars and refined carbs", "Eklenmis sekerler ve rafine karbonhidratlar sinirlandiriliyor",
"Balanced carb distribution across meals to prevent spikes", "Seker sivramalarini onlemek icin karbonhidratlar ogunlere dengeli dagildi",
"Including fiber-rich foods for blood sugar stability", "Kan sekeri dengesi icin lifli gidalar dahil ediliyor",
], ],
}); });
} }
if (profile.heart_condition) { if (profile.heart_condition) {
adjustments.push({ adjustments.push({
condition: "Heart Condition", condition: "Kalp Rahatsizligi",
actions: [ actions: [
"Sodium limited to under 1500mg daily", "Sodyum gunluk 1500mg altinda tutuluyor",
"Emphasis on heart-healthy unsaturated fats", "Kalp dostu doymamis yaglara agirlik veriliyor",
"Omega-3 rich foods prioritized", "Omega-3 zengini gidalar onceliklendiriliyor",
"Avoiding trans fats and excessive saturated fat", "Trans yaglar ve asiri doymus yaglardan kaciniliyor",
], ],
}); });
} }
if (profile.blood_pressure === "high") { if (profile.blood_pressure === "high") {
adjustments.push({ adjustments.push({
condition: "High Blood Pressure", condition: "Yuksek Tansiyon",
actions: [ actions: [
"Following DASH diet principles", "DASH diyeti ilkeleri uygulaniyorr",
"Low sodium meals selected", "Dusuk sodyumlu ogunler seciliyor",
"Potassium-rich foods included", "Potasyum zengini gidalar dahil ediliyor",
"Limiting processed foods", "Islenmis gidalar sinirlandiriliyor",
], ],
}); });
} }
if (profile.has_arthritis) { if (profile.has_arthritis) {
adjustments.push({ adjustments.push({
condition: "Arthritis", condition: "Artrit",
actions: [ actions: [
"Anti-inflammatory foods prioritized", "Anti-enflamatuar gidalar onceliklendiriliyor",
"Omega-3 fatty acid rich meals", "Omega-3 yag asidi zengini ogunler",
"Turmeric and ginger included where possible", "Mumkun olan yerlerde zerdecal ve zencefil dahil ediliyor",
"Avoiding processed and fried foods", "Islenmis ve kizartilmis gidalardan kaciniliyor",
], ],
}); });
} }
if (profile.has_osteoporosis) { if (profile.has_osteoporosis) {
adjustments.push({ adjustments.push({
condition: "Osteoporosis", condition: "Osteoporoz",
actions: [ actions: [
"High calcium foods included", "Yuksek kalsiyumlu gidalar dahil ediliyor",
"Vitamin D rich foods prioritized", "D vitamini zengini gidalar onceliklendiriliyor",
"Limiting excessive caffeine", "Asiri kafein tuketimi sinirlandiriliyor",
"Adequate protein for bone maintenance", "Kemik sagligi icin yeterli protein saglaniyor",
], ],
}); });
} }
if (profile.has_fibromyalgia) { if (profile.has_fibromyalgia) {
adjustments.push({ adjustments.push({
condition: "Fibromyalgia", condition: "Fibromiyalji",
actions: [ actions: [
"Anti-inflammatory diet approach", "Anti-enflamatuar beslenme yaklasimi",
"Avoiding processed foods and artificial additives", "Islenmis gidalar ve yapay katki maddelerinden kaciniliyor",
"Gluten reduction considered", "Gluten azaltimi degerlendiriliyor",
"Magnesium-rich foods included", "Magnezyum zengini gidalar dahil ediliyor",
], ],
}); });
} }
if (profile.has_thyroid) { if (profile.has_thyroid) {
adjustments.push({ adjustments.push({
condition: "Thyroid Condition", condition: "Tiroid Rahatsizligi",
actions: [ actions: [
"Iodine-aware food selection", "Iyot icerigi dikkate alinarak gida secimi yapiliyor",
"Selenium-rich foods included", "Selenyum zengini gidalar dahil ediliyor",
"Limiting soy products if hypothyroid", "Hipotiroidide soya urunleri sinirlandiriliyor",
"Avoiding excessive cruciferous vegetables raw", "Asiri cig cruciferous sebze tuketiminden kaciniliyor",
], ],
}); });
} }
if (profile.cholesterol_level === "high") { if (profile.cholesterol_level === "high") {
adjustments.push({ adjustments.push({
condition: "High Cholesterol", condition: "Yuksek Kolesterol",
actions: [ actions: [
"Low saturated fat meals selected", "Dusuk doymus yag iceren ogunler seciliyor",
"High soluble fiber foods included", "Yuksek cozunur lif iceren gidalar dahil ediliyor",
"Plant sterol sources prioritized", "Bitkisel sterol kaynaklari onceliklendiriliyor",
"Oat and legume-based meals favored", "Yulaf ve baklagil bazli ogunler tercih ediliyor",
], ],
}); });
} }
if (profile.has_asthma) { if (profile.has_asthma) {
adjustments.push({ adjustments.push({
condition: "Asthma", condition: "Astim",
actions: [ actions: [
"Anti-inflammatory foods included", "Anti-enflamatuar gidalar dahil ediliyor",
"Vitamin D rich foods prioritized", "D vitamini zengini gidalar onceliklendiriliyor",
"Magnesium-rich foods for bronchial relaxation", "Bronsiyal gevseme icin magnezyum zengini gidalar",
"Avoiding sulfites and common triggers", "Sulfitlerden ve yaygin tetikleyicilerden kaciniliyor",
], ],
}); });
} }
if (profile.mental_health && profile.mental_health !== "none") { if (profile.mental_health && profile.mental_health !== "none") {
adjustments.push({ adjustments.push({
condition: "Mental Health Support", condition: "Ruh Sagligi Destegi",
actions: [ actions: [
"Omega-3 fatty acid rich meals", "Omega-3 yag asidi zengini ogunler",
"B vitamin sources included", "B vitamini kaynaklari dahil ediliyor",
"Probiotic and fermented foods for gut-brain axis", "Bagirsak-beyin ekseni icin probiyotik ve fermente gidalar",
"Tryptophan-rich foods for serotonin support", "Serotonin destegi icin triptofan zengini gidalar",
], ],
}); });
} }
@@ -309,25 +309,25 @@ function getSupplements(profile, dietType) {
supplements.push({ supplements.push({
name: "Multivitamin", name: "Multivitamin",
dosage: "1 tablet daily", dosage: "1 tablet daily",
rationale: "Baseline nutritional insurance for any dietary plan", rationale: "Her beslenme plani icin temel besin sigortasi",
}); });
supplements.push({ supplements.push({
name: "Vitamin D3", name: "Vitamin D3",
dosage: "1000-2000 IU daily", dosage: "1000-2000 IU daily",
rationale: "Supports bone health, immune function, and mood regulation", rationale: "Kemik sagligi, bagisiklik sistemi ve ruh hali duzenlemesini destekler",
}); });
if ((profile.goal || "").split(",").map((s) => s.trim()).includes("build_muscle") || dietType === "high_protein") { if ((profile.goal || "").split(",").map((s) => s.trim()).includes("build_muscle") || dietType === "high_protein") {
supplements.push({ supplements.push({
name: "Whey Protein (or plant-based protein)", name: "Whey Protein (or plant-based protein)",
dosage: "25-30g post-workout", dosage: "25-30g post-workout",
rationale: "Supports muscle protein synthesis and recovery", rationale: "Kas protein sentezini ve toparlanmayi destekler",
}); });
supplements.push({ supplements.push({
name: "Creatine Monohydrate", name: "Creatine Monohydrate",
dosage: "5g daily", dosage: "5g daily",
rationale: "Improves strength output and muscle cell hydration", rationale: "Guc ciktisini ve kas hucresi hidrasyonunu arttirir",
}); });
} }
@@ -335,18 +335,18 @@ function getSupplements(profile, dietType) {
supplements.push({ supplements.push({
name: "Omega-3 Fish Oil", name: "Omega-3 Fish Oil",
dosage: "2000-3000mg EPA/DHA daily", dosage: "2000-3000mg EPA/DHA daily",
rationale: "Potent anti-inflammatory, reduces joint pain and stiffness", rationale: "Guclu anti-enflamatuar, eklem agrisi ve sertligini azaltir",
}); });
supplements.push({ supplements.push({
name: "Turmeric/Curcumin", name: "Turmeric/Curcumin",
dosage: "500-1000mg with piperine daily", dosage: "500-1000mg with piperine daily",
rationale: "Natural anti-inflammatory, enhances joint comfort", rationale: "Dogal anti-enflamatuar, eklem rahatligi saglar",
}); });
} else { } else {
supplements.push({ supplements.push({
name: "Omega-3 Fish Oil", name: "Omega-3 Fish Oil",
dosage: "1000mg EPA/DHA daily", dosage: "1000mg EPA/DHA daily",
rationale: "Supports heart health, brain function, and reduces inflammation", rationale: "Kalp sagligi, beyin fonksiyonu destekler ve iltihaplanmayi azaltir",
}); });
} }
@@ -354,12 +354,12 @@ function getSupplements(profile, dietType) {
supplements.push({ supplements.push({
name: "Calcium", name: "Calcium",
dosage: "500-600mg twice daily", dosage: "500-600mg twice daily",
rationale: "Essential for bone density maintenance and prevention of fractures", rationale: "Kemik yogunlugu korunmasi ve kirik onlenmesi icin gereklidir",
}); });
supplements.push({ supplements.push({
name: "Vitamin K2", name: "Vitamin K2",
dosage: "100mcg daily", dosage: "100mcg daily",
rationale: "Directs calcium to bones rather than arteries", rationale: "Kalsiyumu damarlar yerine kemiklere yonlendirir",
}); });
} }
@@ -367,12 +367,12 @@ function getSupplements(profile, dietType) {
supplements.push({ supplements.push({
name: "Chromium Picolinate", name: "Chromium Picolinate",
dosage: "200mcg daily", dosage: "200mcg daily",
rationale: "May improve insulin sensitivity and glucose metabolism", rationale: "Insulin duyarliligini ve glukoz metabolizmasini iyilestirebilir",
}); });
supplements.push({ supplements.push({
name: "Alpha-Lipoic Acid", name: "Alpha-Lipoic Acid",
dosage: "300-600mg daily", dosage: "300-600mg daily",
rationale: "Antioxidant that supports nerve health and blood sugar regulation", rationale: "Sinir sagligi ve kan sekeri duzenlemesini destekleyen antioksidan",
}); });
} }
@@ -380,12 +380,12 @@ function getSupplements(profile, dietType) {
supplements.push({ supplements.push({
name: "Magnesium Glycinate", name: "Magnesium Glycinate",
dosage: "400mg daily", dosage: "400mg daily",
rationale: "Supports healthy blood pressure and cardiovascular function", rationale: "Saglikli kan basinci ve kardiyovaskuler fonksiyonu destekler",
}); });
supplements.push({ supplements.push({
name: "CoQ10", name: "CoQ10",
dosage: "100-200mg daily", dosage: "100-200mg daily",
rationale: "Supports heart muscle energy production and overall cardiac health", rationale: "Kalp kasi enerji uretimini ve genel kalp sagligini destekler",
}); });
} }
@@ -393,7 +393,7 @@ function getSupplements(profile, dietType) {
supplements.push({ supplements.push({
name: "Selenium", name: "Selenium",
dosage: "200mcg daily", dosage: "200mcg daily",
rationale: "Critical for thyroid hormone conversion and gland protection", rationale: "Tiroid hormonu donusumu ve bez korumasi icin kritik oneme sahiptir",
}); });
} }
@@ -401,12 +401,12 @@ function getSupplements(profile, dietType) {
supplements.push({ supplements.push({
name: "B-Complex", name: "B-Complex",
dosage: "1 capsule daily", dosage: "1 capsule daily",
rationale: "Supports neurotransmitter production, energy, and mood stability", rationale: "Norotransmiter uretimi, enerji ve ruh hali dengesini destekler",
}); });
supplements.push({ supplements.push({
name: "Probiotic", name: "Probiotic",
dosage: "10-20 billion CFU daily", dosage: "10-20 billion CFU daily",
rationale: "Gut-brain axis support for mood and cognitive function", rationale: "Ruh hali ve bilissel fonksiyon icin bagirsak-beyin ekseni destegi",
}); });
} }
@@ -414,17 +414,17 @@ function getSupplements(profile, dietType) {
supplements.push({ supplements.push({
name: "Vitamin B12", name: "Vitamin B12",
dosage: "1000mcg daily", dosage: "1000mcg daily",
rationale: "Essential nutrient not available in plant foods, prevents deficiency", rationale: "Bitkisel gidalarda bulunmayan temel besin ogeleri, eksikligi onler",
}); });
supplements.push({ supplements.push({
name: "Iron (plant-based form)", name: "Iron (plant-based form)",
dosage: "18mg daily with vitamin C", dosage: "18mg daily with vitamin C",
rationale: "Plant-based diets may be lower in bioavailable iron", rationale: "Bitkisel beslenme biyoyararlanilabirdemiracesindan dusuk olabilir",
}); });
supplements.push({ supplements.push({
name: "Zinc", name: "Zinc",
dosage: "15mg daily", dosage: "15mg daily",
rationale: "Lower bioavailability from plant sources, supports immunity", rationale: "Bitkisel kaynaklardan dusuk biyoyararlanilabirlik, bagisikligi destekler",
}); });
} }
@@ -432,12 +432,12 @@ function getSupplements(profile, dietType) {
supplements.push({ supplements.push({
name: "Plant Sterols/Stanols", name: "Plant Sterols/Stanols",
dosage: "2g daily", dosage: "2g daily",
rationale: "Clinically shown to reduce LDL cholesterol absorption", rationale: "LDL kolesterol emilimini azalttigi klinik olarak kanitlanmistir",
}); });
supplements.push({ supplements.push({
name: "Psyllium Husk Fiber", name: "Psyllium Husk Fiber",
dosage: "5-10g daily", dosage: "5-10g daily",
rationale: "Soluble fiber binds cholesterol in the gut for excretion", rationale: "Cozunur lif bagirsakta kolesterolu baglayarak atilimini saglar",
}); });
} }
@@ -3099,19 +3099,28 @@ function scaleMeal(meal, targetCalories) {
// 7-DAY MEAL PLAN GENERATION // 7-DAY MEAL PLAN GENERATION
// ============================================================================ // ============================================================================
const DAY_NAMES = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; const DAY_NAMES = ["Pazartesi", "Sali", "Carsamba", "Persembe", "Cuma", "Cumartesi", "Pazar"];
const DIET_TYPE_LABELS = { const DIET_TYPE_LABELS = {
balanced: "Balanced Nutrition", balanced: "Dengeli Beslenme",
mediterranean: "Mediterranean", mediterranean: "Akdeniz",
high_protein: "High-Protein", high_protein: "Yuksek Protein",
low_carb: "Low-Carb", low_carb: "Dusuk Karbonhidrat",
plant_based: "Plant-Based", plant_based: "Bitkisel",
anti_inflammatory: "Anti-Inflammatory", anti_inflammatory: "Anti-Enflamatuar",
heart_healthy: "Heart-Healthy (DASH)", heart_healthy: "Kalp Dostu (DASH)",
diabetic_friendly: "Diabetic-Friendly", diabetic_friendly: "Diyabet Dostu",
calorie_deficit: "Calorie-Deficit", calorie_deficit: "Kalori Acigi",
recovery_gentle: "Recovery / Gentle", recovery_gentle: "Toparlanma / Hafif",
};
const MEAL_TYPE_LABELS = {
breakfast: "Kahvalti",
snack: "Ara Ogun",
lunch: "Ogle Yemegi",
pre_workout: "Antrenman Oncesi",
post_workout: "Antrenman Sonrasi",
dinner: "Aksam Yemegi",
}; };
function generateDietPlan(profile) { function generateDietPlan(profile) {
@@ -3237,6 +3246,7 @@ function generateDietPlan(profile) {
dayMeals.push({ dayMeals.push({
type: slot.type, type: slot.type,
type_label: MEAL_TYPE_LABELS[slot.type] || slot.type,
name: scaled.name, name: scaled.name,
calories: scaled.calories, calories: scaled.calories,
protein: scaled.protein, protein: scaled.protein,
@@ -3270,41 +3280,54 @@ function generateDietPlan(profile) {
// Build notes // Build notes
const notes = []; const notes = [];
if (isNonExerciser) { if (isNonExerciser) {
notes.push("Plan adjusted for sedentary lifestyle - no pre/post workout meals included."); notes.push("Plan hareketsiz yasam tarzina gore ayarlandi - antrenman oncesi/sonrasi ogunler dahil edilmedi.");
notes.push("Focus on nutrient-dense, fiber-rich meals for satiety without excess calories."); notes.push("Fazla kalori almadan tokluk icin besin degeri yuksek, lif zengini ogunlere odaklanin.");
notes.push("Consider adding light daily walking (20-30 min) for overall health."); notes.push("Genel saglik icin gunluk hafif yuruyus (20-30 dk) eklemeyi dusunun.");
} }
if (goal === "lose_weight") { if (goal === "lose_weight") {
notes.push("Calorie deficit of approximately 500 kcal applied for gradual, sustainable weight loss."); notes.push("Kademeli ve surdurulebilir kilo kaybi icin yaklasik 500 kcal kalori acigi uygulandi.");
notes.push("Aim for 0.5-1 kg of weight loss per week. Adjust if progress stalls after 2 weeks."); notes.push("Haftada 0.5-1 kg kilo kaybi hedefleyin. 2 hafta sonra ilerleme durursa ayarlayin.");
} }
if (goal === "build_muscle") { if (goal === "build_muscle") {
notes.push("Caloric surplus of 300 kcal to support lean muscle growth."); notes.push("Yagsiz kas buyumesini desteklemek icin 300 kcal kalori fazlasi uygulandi.");
notes.push("Distribute protein intake evenly across all meals for optimal muscle protein synthesis."); notes.push("Optimal kas protein sentezi icin protein alimini tum ogunlere esit dagitir.");
} }
if (medicalAdjustments.length > 0) { if (medicalAdjustments.length > 0) {
notes.push("Medical conditions have been factored into food selection and macro distribution."); notes.push("Tibbi durumlar gida secimi ve makro dagitiminda dikkate alindi.");
notes.push("Always consult your healthcare provider before making significant dietary changes."); notes.push("Onemli beslenme degisiklikleri yapmadan once her zaman saglik uzmaniniza danisin.");
}
notes.push(`Gunluk en az ${waterIntake}L su icin.`);
notes.push("Ogun porsiyonlari gunluk kalori hedeflerinizi karsilayacak sekilde olceklendirilmistir.");
notes.push("Hazirlama sureleri tahminidir - hafta sonlari toplu pisirme onemli olcude zaman kazandirir.");
// Flatten all days' meals into a single array for frontend compatibility
const allMeals = [];
for (const day of days) {
for (const meal of day.meals) {
allMeals.push({ ...meal, day: day.day, day_name: day.day_name });
}
} }
notes.push(`Drink at least ${waterIntake}L of water daily.`);
notes.push("Meal portions are scaled to meet your daily calorie targets.");
notes.push("Prep times are estimates - batch cooking on weekends can save significant time.");
return { return {
title: `7-Day ${DIET_TYPE_LABELS[dietType] || "Balanced"} Nutrition Plan`, title: `7 Gunluk ${DIET_TYPE_LABELS[dietType] || "Dengeli Beslenme"} Beslenme Plani`,
diet_type: dietType, diet_type: dietType,
duration: "7 days", duration: "7 gun",
bmr, bmr,
tdee, tdee,
daily_calories: dailyCalories, daily_calories: dailyCalories,
daily_macros: dailyMacros, daily_macros: dailyMacros,
macros: {
protein_g: dailyMacros.protein,
carbs_g: dailyMacros.carbs,
fat_g: dailyMacros.fat,
},
body_metrics: { body_metrics: {
bmi, bmi,
weight, weight,
height, height,
age, age,
gender, gender,
body_fat_percentage: bodyFat || "not provided", body_fat_percentage: bodyFat || "belirtilmedi",
bmr_methods_used: bodyFat > 0 bmr_methods_used: bodyFat > 0
? "Mifflin-St Jeor, Harris-Benedict, Katch-McArdle, Cunningham (averaged)" ? "Mifflin-St Jeor, Harris-Benedict, Katch-McArdle, Cunningham (averaged)"
: "Mifflin-St Jeor, Harris-Benedict (averaged)", : "Mifflin-St Jeor, Harris-Benedict (averaged)",
@@ -3312,9 +3335,11 @@ function generateDietPlan(profile) {
}, },
medical_adjustments: medicalAdjustments, medical_adjustments: medicalAdjustments,
water_intake: waterIntake, water_intake: waterIntake,
recommended_water_liters: waterIntake,
supplements, supplements,
notes, notes,
days, days,
meals: allMeals,
}; };
} }

View File

@@ -109,15 +109,15 @@ function generateShoppingList(mealPlan) {
} }
const categories = { const categories = {
protein: { name: "Protein Sources", icon: "🥩", items: [] }, protein: { name: "Protein Kaynaklari", icon: "🥩", items: [] },
dairy: { name: "Dairy", icon: "🧀", items: [] }, dairy: { name: "Sut Urunleri", icon: "🧀", items: [] },
vegetables: { name: "Vegetables", icon: "🥬", items: [] }, vegetables: { name: "Sebzeler", icon: "🥬", items: [] },
fruits: { name: "Fruits", icon: "🍎", items: [] }, fruits: { name: "Meyveler", icon: "🍎", items: [] },
grains: { name: "Grains & Legumes", icon: "🌾", items: [] }, grains: { name: "Tahillar & Baklagiller", icon: "🌾", items: [] },
fats_nuts: { name: "Fats & Nuts", icon: "🥜", items: [] }, fats_nuts: { name: "Yaglar & Kuruyemisler", icon: "🥜", items: [] },
spices: { name: "Spices & Condiments", icon: "🧂", items: [] }, spices: { name: "Baharatlar & Soslar", icon: "🧂", items: [] },
beverages: { name: "Beverages", icon: "🥤", items: [] }, beverages: { name: "Icecekler", icon: "🥤", items: [] },
other: { name: "Other", icon: "📦", items: [] }, other: { name: "Diger", icon: "📦", items: [] },
}; };
for (const data of Object.values(ingredientMap)) { for (const data of Object.values(ingredientMap)) {
@@ -142,8 +142,8 @@ function generateShoppingList(mealPlan) {
} }
return { return {
title: "Weekly Shopping List", title: "Haftalik Alisveris Listesi",
note: "This list is based on your 7-day meal plan.", note: "Bu liste 7 gunluk beslenme planiniza dayanmaktadir.",
categories: result, categories: result,
total_items: Object.values(ingredientMap).length, total_items: Object.values(ingredientMap).length,
}; };

View File

@@ -183,10 +183,10 @@ const DAYS_TR = ["Pazartesi", "Sali", "Carsamba", "Persembe", "Cuma", "Cumartesi
// Mesocycle configuration (4-week progression) // Mesocycle configuration (4-week progression)
// ───────────────────────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────────────────────
const MESOCYCLE = { const MESOCYCLE = {
1: { phase: "Foundation", intensity_multiplier: 1.0, volume_multiplier: 1.0, description: "Foundation week - focus on form and technique" }, 1: { phase: "Temel", intensity_multiplier: 1.0, volume_multiplier: 1.0, description: "Temel hafta - form ve teknik odakli" },
2: { phase: "Progression", intensity_multiplier: 1.05, volume_multiplier: 1.0, description: "+5% intensity increase" }, 2: { phase: "Ilerleme", intensity_multiplier: 1.05, volume_multiplier: 1.0, description: "+%5 yogunluk artisi" },
3: { phase: "Overreach", intensity_multiplier: 1.10, volume_multiplier: 1.0, description: "+10% intensity increase" }, 3: { phase: "Yuklenme", intensity_multiplier: 1.10, volume_multiplier: 1.0, description: "+%10 yogunluk artisi" },
4: { phase: "Deload", intensity_multiplier: 0.85, volume_multiplier: 0.6, description: "Deload week - volume reduced 40%, recovery focus" }, 4: { phase: "Deload", intensity_multiplier: 0.85, volume_multiplier: 0.6, description: "Deload haftasi - hacim %40 azaltildi, toparlanma odakli" },
}; };
// ───────────────────────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────────────────────
@@ -298,101 +298,101 @@ const DESK_MOBILITY = [
// ───────────────────────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────────────────────
const LIGHT_ACTIVITY_PLANS = { const LIGHT_ACTIVITY_PLANS = {
standard: [ standard: [
{ day: 1, name: "Day 1 - Walking & Breathing", type: "light_activity", focus: "Cardiovascular & Stress Relief", estimated_duration: 30, estimated_calories: 80, activities: [ { day: 1, name: "Gun 1 - Yuruyus & Nefes", type: "light_activity", focus: "Kardiyovaskuler & Stres Giderme", estimated_duration: 30, estimated_calories: 80, activities: [
{ name: "Brisk Walking", name_tr: "Tempolu Yuruyus", duration: "20 minutes", gif: gifUrl("Brisk Walking"), instructions: ["Walk at comfortable but brisk pace", "Swing arms naturally", "Breathe rhythmically"], notes: "Target 3000-4000 steps" }, { name: "Tempolu Yuruyus", name_tr: "Tempolu Yuruyus", duration: "20 dakika", gif: gifUrl("Brisk Walking"), instructions: ["Rahat ama tempolu yuruyun", "Kollarinizi dogal sallayin", "Ritmik nefes alin"], notes: "Hedef 3000-4000 adim" },
{ name: "Diaphragmatic Breathing", name_tr: "Diyafram Nefesi", duration: "5 minutes", gif: gifUrl("Diaphragmatic Breathing"), instructions: ["Sit or lie comfortably", "Breathe in through nose 4 seconds", "Hold 4 seconds", "Exhale through mouth 6 seconds"], notes: "Stress relief and relaxation" }, { name: "Diyafram Nefesi", name_tr: "Diyafram Nefesi", duration: "5 dakika", gif: gifUrl("Diaphragmatic Breathing"), instructions: ["Rahatca oturun veya uzanin", "Burundan 4 saniye nefes alin", "4 saniye tutun", "Agizdan 6 saniye verin"], notes: "Stres giderme ve rahatlama" },
{ name: "Gentle Full Body Stretch", name_tr: "Hafif Tum Vucut Germe", duration: "5 minutes", gif: gifUrl("Gentle Full Body Stretch"), instructions: ["Stretch neck, shoulders, arms, back, legs", "Hold each stretch 15-20 seconds", "No bouncing"], notes: "Improve flexibility" }, { name: "Hafif Tum Vucut Germe", name_tr: "Hafif Tum Vucut Germe", duration: "5 dakika", gif: gifUrl("Gentle Full Body Stretch"), instructions: ["Boyun, omuz, kol, sirt, bacak gerin", "Her germeyi 15-20 saniye tutun", "Ziplama yapmayin"], notes: "Esnekligi gelistirin" },
] }, ] },
{ day: 2, name: "Day 2 - Mobility & Stretching", type: "light_activity", focus: "Flexibility & Joint Health", estimated_duration: 25, estimated_calories: 50, activities: [ { day: 2, name: "Gun 2 - Mobilite & Germe", type: "light_activity", focus: "Esneklik & Eklem Sagligi", estimated_duration: 25, estimated_calories: 50, activities: [
{ name: "Joint Circles", name_tr: "Eklem Civirleri", duration: "5 minutes", gif: gifUrl("Joint Circles"), instructions: ["Circle ankles, knees, hips, shoulders, wrists", "10 circles each direction", "Gentle and controlled"], notes: "Warm up all joints" }, { name: "Eklem Civirleri", name_tr: "Eklem Civirleri", duration: "5 dakika", gif: gifUrl("Joint Circles"), instructions: ["Ayak bilegi, diz, kalca, omuz, bilek civirleri yapin", "Her yone 10 civir", "Yumusak ve kontrollü"], notes: "Tum eklemleri isitma" },
{ name: "Yoga-Inspired Stretching", name_tr: "Yoga Tarzinda Germe", duration: "15 minutes", gif: gifUrl("Yoga Stretching"), instructions: ["Cat-cow stretch", "Child's pose", "Downward dog or modified version", "Seated forward fold", "Gentle twist"], notes: "Focus on breathing and relaxation" }, { name: "Yoga Tarzinda Germe", name_tr: "Yoga Tarzinda Germe", duration: "15 dakika", gif: gifUrl("Yoga Stretching"), instructions: ["Kedi-inek germesi", "Cocuk pozu", "Asagi bakan kopek veya modifiye versiyon", "Oturarak one egilme", "Hafif bükülme"], notes: "Nefes ve rahatlamaya odaklanin" },
{ name: "Box Breathing", name_tr: "Kutu Nefesi", duration: "5 minutes", gif: gifUrl("Box Breathing"), instructions: ["Breathe in 4 seconds", "Hold 4 seconds", "Breathe out 4 seconds", "Hold 4 seconds"], notes: "Calming technique" }, { name: "Kutu Nefesi", name_tr: "Kutu Nefesi", duration: "5 dakika", gif: gifUrl("Box Breathing"), instructions: ["4 saniye nefes alin", "4 saniye tutun", "4 saniye nefes verin", "4 saniye tutun"], notes: "Sakinlestirici teknik" },
] }, ] },
{ day: 3, name: "Day 3 - Light Walk & Core", type: "light_activity", focus: "Walking & Core Stability", estimated_duration: 30, estimated_calories: 70, activities: [ { day: 3, name: "Gun 3 - Hafif Yuruyus & Core", type: "light_activity", focus: "Yuruyus & Core Stabilitesi", estimated_duration: 30, estimated_calories: 70, activities: [
{ name: "Outdoor or Indoor Walking", name_tr: "Yuruyus", duration: "15 minutes", gif: gifUrl("Walking"), instructions: ["Moderate pace", "Focus on posture", "Keep shoulders back"], notes: "Target 2000-3000 steps" }, { name: "Dis veya Ic Mekan Yuruyusu", name_tr: "Yuruyus", duration: "15 dakika", gif: gifUrl("Walking"), instructions: ["Orta tempo", "Durusa odaklanin", "Omuzlari geride tutun"], notes: "Hedef 2000-3000 adim" },
{ name: "Gentle Core Work", name_tr: "Hafif Core Calismasi", duration: "10 minutes", gif: gifUrl("Gentle Core Work"), instructions: ["Dead bugs 10 each side", "Bird dog 10 each side", "Gentle pelvic tilts 15 reps", "Modified plank 15-20 seconds"], notes: "Low intensity core activation" }, { name: "Hafif Core Calismasi", name_tr: "Hafif Core Calismasi", duration: "10 dakika", gif: gifUrl("Gentle Core Work"), instructions: ["Dead bug her taraf 10 tekrar", "Bird dog her taraf 10 tekrar", "Hafif pelvik tilt 15 tekrar", "Modifiye plank 15-20 saniye"], notes: "Dusuk yogunluklu core aktivasyonu" },
{ name: "Progressive Muscle Relaxation", name_tr: "Kademeli Kas Gevsetme", duration: "5 minutes", gif: gifUrl("Progressive Muscle Relaxation"), instructions: ["Tense each muscle group 5 seconds", "Release and relax 10 seconds", "Work from toes to head"], notes: "Stress and tension relief" }, { name: "Kademeli Kas Gevsetme", name_tr: "Kademeli Kas Gevsetme", duration: "5 dakika", gif: gifUrl("Progressive Muscle Relaxation"), instructions: ["Her kas grubunu 5 saniye kasin", "Birakin ve 10 saniye gevsetin", "Ayak parmaklarindan basa dogru calisin"], notes: "Stres ve gerilim giderme" },
] }, ] },
{ day: 4, name: "Day 4 - Rest & Breathing", type: "light_activity", focus: "Recovery & Mental Wellness", estimated_duration: 20, estimated_calories: 30, activities: [ { day: 4, name: "Gun 4 - Dinlenme & Nefes", type: "light_activity", focus: "Toparlanma & Zihinsel Saglik", estimated_duration: 20, estimated_calories: 30, activities: [
{ name: "Gentle Walking", name_tr: "Hafif Yuruyus", duration: "10 minutes", gif: gifUrl("Gentle Walking"), instructions: ["Very easy pace", "Focus on environment", "Practice mindful walking"], notes: "Light movement only" }, { name: "Hafif Yuruyus", name_tr: "Hafif Yuruyus", duration: "10 dakika", gif: gifUrl("Gentle Walking"), instructions: ["Cok yavas tempo", "Cevrenizdeki seylere odaklanin", "Bilinçli yuruyus yapin"], notes: "Sadece hafif hareket" },
{ name: "4-7-8 Breathing", name_tr: "4-7-8 Nefes", duration: "5 minutes", gif: gifUrl("4-7-8 Breathing"), instructions: ["Inhale through nose 4 seconds", "Hold breath 7 seconds", "Exhale through mouth 8 seconds", "Repeat 4-8 cycles"], notes: "Promotes relaxation and sleep quality" }, { name: "4-7-8 Nefes", name_tr: "4-7-8 Nefes", duration: "5 dakika", gif: gifUrl("4-7-8 Breathing"), instructions: ["Burundan 4 saniye nefes alin", "7 saniye nefesinizi tutun", "Agizdan 8 saniye nefes verin", "4-8 döngü tekrarlayin"], notes: "Rahatlama ve uyku kalitesini arttirir" },
{ name: "Gentle Neck & Shoulder Release", name_tr: "Boyun ve Omuz Gevsetme", duration: "5 minutes", gif: gifUrl("Neck Shoulder Release"), instructions: ["Neck tilts each direction", "Shoulder rolls forward and back", "Shoulder shrugs and release"], notes: "Release common tension areas" }, { name: "Boyun ve Omuz Gevsetme", name_tr: "Boyun ve Omuz Gevsetme", duration: "5 dakika", gif: gifUrl("Neck Shoulder Release"), instructions: ["Her yone boyun egilmeleri", "Ileri geri omuz civirma", "Omuz kaldirma ve birakmalar"], notes: "Yaygin gerilim bolgelerini gevsetin" },
] }, ] },
{ day: 5, name: "Day 5 - Walking & Flexibility", type: "light_activity", focus: "Cardiovascular & Stretching", estimated_duration: 30, estimated_calories: 75, activities: [ { day: 5, name: "Gun 5 - Yuruyus & Esneklik", type: "light_activity", focus: "Kardiyovaskuler & Germe", estimated_duration: 30, estimated_calories: 75, activities: [
{ name: "Brisk Walking", name_tr: "Tempolu Yuruyus", duration: "20 minutes", gif: gifUrl("Brisk Walking"), instructions: ["Moderate to brisk pace", "Include some hills or inclines if possible", "Maintain good posture"], notes: "Target 3000-4000 steps" }, { name: "Tempolu Yuruyus", name_tr: "Tempolu Yuruyus", duration: "20 dakika", gif: gifUrl("Brisk Walking"), instructions: ["Orta-hizli tempo", "Mumkunse yokuslar dahil edin", "Iyi durusu koruyun"], notes: "Hedef 3000-4000 adim" },
{ name: "Standing Stretches", name_tr: "Ayakta Germe", duration: "10 minutes", gif: gifUrl("Standing Stretches"), instructions: ["Calf stretch against wall", "Quad stretch holding chair", "Hamstring stretch on step", "Side bend stretch", "Chest opener stretch"], notes: "Focus on areas that feel tight" }, { name: "Ayakta Germe", name_tr: "Ayakta Germe", duration: "10 dakika", gif: gifUrl("Standing Stretches"), instructions: ["Duvara yaslanarak baldır germesi", "Sandalye tutarak quadriceps germesi", "Basamakta hamstring germesi", "Yana egilme germesi", "Gogus acma germesi"], notes: "Sıkı hissedilen bolgelere odaklanin" },
] }, ] },
{ day: 6, name: "Day 6 - Mobility & Balance", type: "light_activity", focus: "Balance & Joint Mobility", estimated_duration: 25, estimated_calories: 50, activities: [ { day: 6, name: "Gun 6 - Mobilite & Denge", type: "light_activity", focus: "Denge & Eklem Mobilitesi", estimated_duration: 25, estimated_calories: 50, activities: [
{ name: "Balance Exercises", name_tr: "Denge Egzersizleri", duration: "10 minutes", gif: gifUrl("Balance Exercises"), instructions: ["Single leg stand 30 seconds each", "Heel-to-toe walk", "Standing weight shifts", "Tandem stance"], notes: "Improve stability and proprioception" }, { name: "Denge Egzersizleri", name_tr: "Denge Egzersizleri", duration: "10 dakika", gif: gifUrl("Balance Exercises"), instructions: ["Tek bacak durma her taraf 30 saniye", "Topuk-parmak yuruyusu", "Ayakta agirlik aktarma", "Tandem durus"], notes: "Stabilite ve propriyosepsiyonu gelistirin" },
{ name: "Seated Mobility Flow", name_tr: "Oturarak Mobilite", duration: "10 minutes", gif: gifUrl("Seated Mobility Flow"), instructions: ["Seated spinal twist", "Seated hip circles", "Ankle circles", "Wrist circles", "Shoulder rolls"], notes: "Full body joint mobility from chair" }, { name: "Oturarak Mobilite Akisi", name_tr: "Oturarak Mobilite", duration: "10 dakika", gif: gifUrl("Seated Mobility Flow"), instructions: ["Oturarak omurga bükülmesi", "Oturarak kalca civirleri", "Ayak bilegi civirleri", "Bilek civirleri", "Omuz civirma"], notes: "Sandalyeden tum vucut eklem mobilitesi" },
{ name: "Deep Breathing Cool-Down", name_tr: "Derin Nefes Soguma", duration: "5 minutes", gif: gifUrl("Deep Breathing"), instructions: ["Belly breathing", "Long slow exhales", "Close eyes if comfortable"], notes: "End with relaxation" }, { name: "Derin Nefes Soguma", name_tr: "Derin Nefes Soguma", duration: "5 dakika", gif: gifUrl("Deep Breathing"), instructions: ["Karin nefesi", "Uzun yavas nefes verme", "Rahatsa gozlerinizi kapatın"], notes: "Rahatlamayla bitirin" },
] }, ] },
{ day: 7, name: "Day 7 - Rest & Recovery", type: "light_activity", focus: "Complete Rest & Self-Care", estimated_duration: 15, estimated_calories: 20, activities: [ { day: 7, name: "Gun 7 - Dinlenme & Toparlanma", type: "light_activity", focus: "Tam Dinlenme & Oz Bakim", estimated_duration: 15, estimated_calories: 20, activities: [
{ name: "Gentle Walk", name_tr: "Hafif Yuruyus", duration: "10 minutes", gif: gifUrl("Gentle Walk"), instructions: ["Very easy pace", "Enjoy the environment", "No intensity targets"], notes: "Optional - only if you feel up to it" }, { name: "Hafif Yuruyus", name_tr: "Hafif Yuruyus", duration: "10 dakika", gif: gifUrl("Gentle Walk"), instructions: ["Cok kolay tempo", "Cevrenin tadini cikarin", "Yogunluk hedefi yok"], notes: "Istege bagli - sadece kendinizi hazir hissediyorsaniz" },
{ name: "Body Scan Meditation", name_tr: "Vucut Tarama Meditasyonu", duration: "5 minutes", gif: gifUrl("Body Scan Meditation"), instructions: ["Lie down or sit comfortably", "Mentally scan from toes to head", "Notice sensations without judgment", "Breathe into any tense areas"], notes: "Mindfulness and recovery" }, { name: "Vucut Tarama Meditasyonu", name_tr: "Vucut Tarama Meditasyonu", duration: "5 dakika", gif: gifUrl("Body Scan Meditation"), instructions: ["Uzanin veya rahatca oturun", "Ayak parmaklarindan basa zihinsel tarama yapin", "Yargilamadan hislere dikkat edin", "Gergin bolgelere nefes gonderin"], notes: "Farkindalik ve toparlanma" },
] }, ] },
], ],
wheelchair: [ wheelchair: [
{ day: 1, name: "Day 1 - Upper Body Seated", type: "light_activity", focus: "Seated Upper Body Movement", estimated_duration: 25, estimated_calories: 50, activities: [ { day: 1, name: "Gun 1 - Oturarak Ust Vucut", type: "light_activity", focus: "Oturarak Ust Vucut Hareketi", estimated_duration: 25, estimated_calories: 50, activities: [
{ name: "Seated Arm Circles", name_tr: "Oturarak Kol Civirme", duration: "5 minutes", gif: gifUrl("Seated Arm Circles"), instructions: ["Small circles forward 20 reps", "Small circles backward 20 reps", "Large circles forward 10 reps", "Large circles backward 10 reps"], notes: "Warm up shoulders" }, { name: "Oturarak Kol Civirme", name_tr: "Oturarak Kol Civirme", duration: "5 dakika", gif: gifUrl("Seated Arm Circles"), instructions: ["Ileri kucuk daireler 20 tekrar", "Geri kucuk daireler 20 tekrar", "Ileri buyuk daireler 10 tekrar", "Geri buyuk daireler 10 tekrar"], notes: "Omuzlari isitma" },
{ name: "Seated Chest Press Motion", name_tr: "Oturarak Gogus Press", duration: "10 minutes", gif: gifUrl("Seated Chest Press Motion"), instructions: ["Push hands forward from chest", "Light resistance band if available", "15-20 reps, 2-3 sets", "Rest 30 seconds between sets"], notes: "Upper body strengthening" }, { name: "Oturarak Gogus Press Hareketi", name_tr: "Oturarak Gogus Press", duration: "10 dakika", gif: gifUrl("Seated Chest Press Motion"), instructions: ["Elleri gogüsten ileri itin", "Varsa hafif direnç bandi kullanin", "15-20 tekrar, 2-3 set", "Setler arasi 30 saniye dinlenme"], notes: "Ust vucut guclenme" },
{ name: "Seated Deep Breathing", name_tr: "Oturarak Derin Nefes", duration: "5 minutes", gif: gifUrl("Seated Deep Breathing"), instructions: ["Sit tall", "Breathe deeply into belly", "Exhale slowly", "Focus on posture"], notes: "Respiratory health" }, { name: "Oturarak Derin Nefes", name_tr: "Oturarak Derin Nefes", duration: "5 dakika", gif: gifUrl("Seated Deep Breathing"), instructions: ["Dik oturun", "Karna dogru derin nefes alin", "Yavasca nefes verin", "Durusa odaklanin"], notes: "Solunum sagligi" },
{ name: "Upper Body Stretch", name_tr: "Ust Vucut Germe", duration: "5 minutes", gif: gifUrl("Upper Body Stretch"), instructions: ["Overhead reach", "Cross-body shoulder stretch", "Triceps stretch", "Chest opener"], notes: "Flexibility maintenance" }, { name: "Ust Vucut Germe", name_tr: "Ust Vucut Germe", duration: "5 dakika", gif: gifUrl("Upper Body Stretch"), instructions: ["Basa dogru uzanma", "Capraz omuz germesi", "Triceps germesi", "Gogus acma"], notes: "Esneklik bakimi" },
] }, ] },
{ day: 2, name: "Day 2 - Breathing & Mobility", type: "light_activity", focus: "Respiratory & Joint Health", estimated_duration: 20, estimated_calories: 30, activities: [ { day: 2, name: "Gun 2 - Nefes & Mobilite", type: "light_activity", focus: "Solunum & Eklem Sagligi", estimated_duration: 20, estimated_calories: 30, activities: [
{ name: "Breathing Exercises", name_tr: "Nefes Egzersizleri", duration: "10 minutes", gif: gifUrl("Breathing Exercises"), instructions: ["Pursed lip breathing 2 min", "Diaphragmatic breathing 3 min", "Box breathing 5 min"], notes: "Lung capacity and relaxation" }, { name: "Nefes Egzersizleri", name_tr: "Nefes Egzersizleri", duration: "10 dakika", gif: gifUrl("Breathing Exercises"), instructions: ["Büzük dudak nefesi 2 dk", "Diyafram nefesi 3 dk", "Kutu nefesi 5 dk"], notes: "Akciger kapasitesi ve rahatlama" },
{ name: "Seated Joint Mobility", name_tr: "Oturarak Eklem Mobilitesi", duration: "10 minutes", gif: gifUrl("Seated Joint Mobility"), instructions: ["Wrist circles", "Elbow flexion/extension", "Shoulder rolls", "Neck rotations", "Trunk rotations"], notes: "Maintain joint range of motion" }, { name: "Oturarak Eklem Mobilitesi", name_tr: "Oturarak Eklem Mobilitesi", duration: "10 dakika", gif: gifUrl("Seated Joint Mobility"), instructions: ["Bilek civirleri", "Dirsek bükme/acma", "Omuz civirma", "Boyun rotasyonlari", "Govde rotasyonlari"], notes: "Eklem hareket acikligini koruyun" },
] }, ] },
{ day: 3, name: "Day 3 - Light Resistance", type: "light_activity", focus: "Seated Resistance Training", estimated_duration: 25, estimated_calories: 45, activities: [ { day: 3, name: "Gun 3 - Hafif Direnc", type: "light_activity", focus: "Oturarak Direnc Antrenmani", estimated_duration: 25, estimated_calories: 45, activities: [
{ name: "Seated Band Rows", name_tr: "Oturarak Bantli Row", duration: "8 minutes", gif: gifUrl("Seated Band Rows"), instructions: ["Anchor band at chest height", "Pull toward torso", "Squeeze shoulder blades", "12-15 reps, 2 sets"], notes: "Back strengthening" }, { name: "Oturarak Bantli Row", name_tr: "Oturarak Bantli Row", duration: "8 dakika", gif: gifUrl("Seated Band Rows"), instructions: ["Bandi gogus hizasinda sabitleyin", "Govdeye dogru cekin", "Kurek kemiklerini sikin", "12-15 tekrar, 2 set"], notes: "Sirt guclendirme" },
{ name: "Seated Band Press", name_tr: "Oturarak Bantli Press", duration: "8 minutes", gif: gifUrl("Seated Band Press"), instructions: ["Band behind back", "Press forward", "12-15 reps, 2 sets"], notes: "Chest and arm strengthening" }, { name: "Oturarak Bantli Press", name_tr: "Oturarak Bantli Press", duration: "8 dakika", gif: gifUrl("Seated Band Press"), instructions: ["Band sirtin arkasinda", "Ileri itin", "12-15 tekrar, 2 set"], notes: "Gogus ve kol guclendirme" },
{ name: "Seated Core Activation", name_tr: "Oturarak Core Aktivasyonu", duration: "5 minutes", gif: gifUrl("Seated Core Activation"), instructions: ["Seated pelvic tilts", "Seated trunk rotation", "Seated side bends"], notes: "Core stability" }, { name: "Oturarak Core Aktivasyonu", name_tr: "Oturarak Core Aktivasyonu", duration: "5 dakika", gif: gifUrl("Seated Core Activation"), instructions: ["Oturarak pelvik tilt", "Oturarak govde rotasyonu", "Oturarak yana egilme"], notes: "Core stabilitesi" },
{ name: "Cool-Down Stretching", name_tr: "Soguma Germe", duration: "4 minutes", gif: gifUrl("Seated Stretching"), instructions: ["Stretch all worked muscle groups", "Hold 20-30 seconds each"], notes: "Recovery" }, { name: "Soguma Germe", name_tr: "Soguma Germe", duration: "4 dakika", gif: gifUrl("Seated Stretching"), instructions: ["Calisan tum kas gruplarini gerin", "Her birini 20-30 saniye tutun"], notes: "Toparlanma" },
] }, ] },
{ day: 4, name: "Day 4 - Rest & Recovery", type: "light_activity", focus: "Mental Wellness", estimated_duration: 15, estimated_calories: 15, activities: [ { day: 4, name: "Gun 4 - Dinlenme & Toparlanma", type: "light_activity", focus: "Zihinsel Saglik", estimated_duration: 15, estimated_calories: 15, activities: [
{ name: "Guided Breathing", name_tr: "Rehberli Nefes", duration: "10 minutes", gif: gifUrl("Guided Breathing"), instructions: ["Follow 4-7-8 pattern", "Focus on complete relaxation"], notes: "Stress management" }, { name: "Rehberli Nefes", name_tr: "Rehberli Nefes", duration: "10 dakika", gif: gifUrl("Guided Breathing"), instructions: ["4-7-8 kalibini takip edin", "Tam rahatlamaya odaklanin"], notes: "Stres yonetimi" },
{ name: "Gentle Stretching", name_tr: "Hafif Germe", duration: "5 minutes", gif: gifUrl("Gentle Stretching"), instructions: ["Only stretch what feels comfortable", "No pushing into pain"], notes: "Light recovery" }, { name: "Hafif Germe", name_tr: "Hafif Germe", duration: "5 dakika", gif: gifUrl("Gentle Stretching"), instructions: ["Sadece rahat hissettiren bolgeleri gerin", "Agriya zorlamayin"], notes: "Hafif toparlanma" },
] }, ] },
{ day: 5, name: "Day 5 - Seated Cardio", type: "light_activity", focus: "Cardiovascular Health", estimated_duration: 25, estimated_calories: 55, activities: [ { day: 5, name: "Gun 5 - Oturarak Kardiyo", type: "light_activity", focus: "Kardiyovaskuler Saglik", estimated_duration: 25, estimated_calories: 55, activities: [
{ name: "Seated Arm Ergometer / Air Punches", name_tr: "Oturarak Kol Kardiyosu", duration: "15 minutes", gif: gifUrl("Seated Arm Cardio"), instructions: ["Alternating arm punches", "Arm cranking motion", "Overhead reaches", "Keep moderate pace"], notes: "Elevate heart rate safely" }, { name: "Oturarak Kol Kardiyosu", name_tr: "Oturarak Kol Kardiyosu", duration: "15 dakika", gif: gifUrl("Seated Arm Cardio"), instructions: ["Sirayla kol yumruklari", "Kol cevirme hareketi", "Basa dogru uzanmalar", "Orta tempoyu koruyun"], notes: "Kalp atisini guvenle yukseltin" },
{ name: "Seated Torso Twists", name_tr: "Oturarak Govde Dondurmesi", duration: "5 minutes", gif: gifUrl("Seated Torso Twists"), instructions: ["Rotate torso left and right", "Arms at chest level", "Controlled movement"], notes: "Core engagement" }, { name: "Oturarak Govde Dondurmesi", name_tr: "Oturarak Govde Dondurmesi", duration: "5 dakika", gif: gifUrl("Seated Torso Twists"), instructions: ["Govdeyi saga sola cevirme", "Kollar gogus seviyesinde", "Kontrollü hareket"], notes: "Core aktivasyonu" },
{ name: "Cool-Down", name_tr: "Soguma", duration: "5 minutes", gif: gifUrl("Seated Cool Down"), instructions: ["Slow arm movements", "Deep breathing", "Gentle stretching"], notes: "Gradual recovery" }, { name: "Soguma", name_tr: "Soguma", duration: "5 dakika", gif: gifUrl("Seated Cool Down"), instructions: ["Yavas kol hareketleri", "Derin nefes", "Hafif germe"], notes: "Kademeli toparlanma" },
] }, ] },
{ day: 6, name: "Day 6 - Flexibility Focus", type: "light_activity", focus: "Stretching & Relaxation", estimated_duration: 20, estimated_calories: 25, activities: [ { day: 6, name: "Gun 6 - Esneklik Odakli", type: "light_activity", focus: "Germe & Rahatlama", estimated_duration: 20, estimated_calories: 25, activities: [
{ name: "Comprehensive Seated Stretch", name_tr: "Kapsamli Oturarak Germe", duration: "15 minutes", gif: gifUrl("Comprehensive Seated Stretch"), instructions: ["Neck stretches all directions", "Shoulder stretches", "Chest opener", "Trunk side bends", "Wrist stretches", "Hip flexor stretch if possible"], notes: "Full body flexibility" }, { name: "Kapsamli Oturarak Germe", name_tr: "Kapsamli Oturarak Germe", duration: "15 dakika", gif: gifUrl("Comprehensive Seated Stretch"), instructions: ["Her yone boyun germeleri", "Omuz germeleri", "Gogus acma", "Govde yana egilmeleri", "Bilek germeleri", "Mumkunse kalca fleksor germesi"], notes: "Tum vucut esnekligi" },
{ name: "Meditation", name_tr: "Meditasyon", duration: "5 minutes", gif: gifUrl("Seated Meditation"), instructions: ["Close eyes", "Focus on breathing", "Let thoughts pass without engagement"], notes: "Mental wellness" }, { name: "Meditasyon", name_tr: "Meditasyon", duration: "5 dakika", gif: gifUrl("Seated Meditation"), instructions: ["Gozleri kapatin", "Nefese odaklanin", "Dusuncelerin gecmesine izin verin"], notes: "Zihinsel saglik" },
] }, ] },
{ day: 7, name: "Day 7 - Complete Rest", type: "light_activity", focus: "Full Recovery", estimated_duration: 10, estimated_calories: 10, activities: [ { day: 7, name: "Gun 7 - Tam Dinlenme", type: "light_activity", focus: "Tam Toparlanma", estimated_duration: 10, estimated_calories: 10, activities: [
{ name: "Optional Light Movement", name_tr: "Istege Bagli Hafif Hareket", duration: "5 minutes", gif: gifUrl("Optional Light Movement"), instructions: ["Only if you feel like it", "Gentle arm swings", "Shoulder rolls"], notes: "Completely optional" }, { name: "Istege Bagli Hafif Hareket", name_tr: "Istege Bagli Hafif Hareket", duration: "5 dakika", gif: gifUrl("Optional Light Movement"), instructions: ["Sadece isterseniz", "Hafif kol sallama", "Omuz civirma"], notes: "Tamamen istege bagli" },
{ name: "Relaxation Breathing", name_tr: "Rahatlama Nefesi", duration: "5 minutes", gif: gifUrl("Relaxation Breathing"), instructions: ["Long slow breaths", "Focus on letting go of tension"], notes: "End the week relaxed" }, { name: "Rahatlama Nefesi", name_tr: "Rahatlama Nefesi", duration: "5 dakika", gif: gifUrl("Relaxation Breathing"), instructions: ["Uzun yavas nefesler", "Gerilimi birakmeye odaklanin"], notes: "Haftayi rahat bitirin" },
] }, ] },
], ],
limited_both: [ limited_both: [
{ day: 1, name: "Day 1 - Gentle Mobility", type: "light_activity", focus: "Gentle Movement", estimated_duration: 15, estimated_calories: 20, activities: [ { day: 1, name: "Gun 1 - Hafif Mobilite", type: "light_activity", focus: "Hafif Hareket", estimated_duration: 15, estimated_calories: 20, activities: [
{ name: "Seated Breathing Exercise", name_tr: "Oturarak Nefes", duration: "5 minutes", gif: gifUrl("Seated Breathing"), instructions: ["Deep belly breaths", "Slow and rhythmic"], notes: "Foundation exercise" }, { name: "Oturarak Nefes Egzersizi", name_tr: "Oturarak Nefes", duration: "5 dakika", gif: gifUrl("Seated Breathing"), instructions: ["Derin karin nefesleri", "Yavas ve ritmik"], notes: "Temel egzersiz" },
{ name: "Gentle Range of Motion", name_tr: "Hafif Hareket Acikligi", duration: "10 minutes", gif: gifUrl("Gentle ROM"), instructions: ["Move whatever joints feel comfortable", "Very gentle circles and movements", "Stop if any discomfort"], notes: "Maintain what mobility you have" }, { name: "Hafif Hareket Acikligi", name_tr: "Hafif Hareket Acikligi", duration: "10 dakika", gif: gifUrl("Gentle ROM"), instructions: ["Rahat hissedilen eklemleri hareket ettirin", "Cok hafif daireler ve hareketler", "Rahatsizlik olursa durdurun"], notes: "Mevcut mobiliteyi koruyun" },
] }, ] },
{ day: 2, name: "Day 2 - Breathing Focus", type: "light_activity", focus: "Respiratory Health", estimated_duration: 15, estimated_calories: 15, activities: [ { day: 2, name: "Gun 2 - Nefes Odakli", type: "light_activity", focus: "Solunum Sagligi", estimated_duration: 15, estimated_calories: 15, activities: [
{ name: "Progressive Breathing", name_tr: "Kademeli Nefes", duration: "10 minutes", gif: gifUrl("Progressive Breathing"), instructions: ["Start with normal breaths", "Gradually deepen inhales", "Gradually lengthen exhales", "4-7-8 pattern if comfortable"], notes: "Improve lung capacity" }, { name: "Kademeli Nefes", name_tr: "Kademeli Nefes", duration: "10 dakika", gif: gifUrl("Progressive Breathing"), instructions: ["Normal nefeslerle baslayin", "Yavasce nefes almayi derinlestirin", "Yavasce nefes vermeyi uzatin", "Rahatsa 4-7-8 kalibi"], notes: "Akciger kapasitesini gelistirin" },
{ name: "Body Awareness Scan", name_tr: "Vucut Farkindalik", duration: "5 minutes", gif: gifUrl("Body Awareness"), instructions: ["Notice each body part", "Release tension where found", "Accept current state"], notes: "Mind-body connection" }, { name: "Vucut Farkindalik Taramasi", name_tr: "Vucut Farkindalik", duration: "5 dakika", gif: gifUrl("Body Awareness"), instructions: ["Her vucut bolumune dikkat edin", "Bulunan gerilimi birakin", "Mevcut durumu kabul edin"], notes: "Zihin-vucut baglantisi" },
] }, ] },
{ day: 3, name: "Day 3 - Light Stretch", type: "light_activity", focus: "Gentle Flexibility", estimated_duration: 15, estimated_calories: 15, activities: [ { day: 3, name: "Gun 3 - Hafif Germe", type: "light_activity", focus: "Hafif Esneklik", estimated_duration: 15, estimated_calories: 15, activities: [
{ name: "Supported Stretching", name_tr: "Destekli Germe", duration: "10 minutes", gif: gifUrl("Supported Stretching"), instructions: ["Use pillows or supports as needed", "Very gentle holds 10-15 seconds", "Focus on comfortable range only"], notes: "Gentle flexibility work" }, { name: "Destekli Germe", name_tr: "Destekli Germe", duration: "10 dakika", gif: gifUrl("Supported Stretching"), instructions: ["Gerektiginde yastik veya destek kullanin", "Cok hafif tutmalar 10-15 saniye", "Sadece rahat araliga odaklanin"], notes: "Hafif esneklik calismasi" },
{ name: "Relaxation", name_tr: "Rahatlama", duration: "5 minutes", gif: gifUrl("Relaxation"), instructions: ["Close eyes", "Deep breathing", "Progressive muscle relaxation where possible"], notes: "Recovery" }, { name: "Rahatlama", name_tr: "Rahatlama", duration: "5 dakika", gif: gifUrl("Relaxation"), instructions: ["Gozleri kapatin", "Derin nefes", "Mumkun olan yerlerde kademeli kas gevsetme"], notes: "Toparlanma" },
] }, ] },
{ day: 4, name: "Day 4 - Rest", type: "light_activity", focus: "Complete Rest", estimated_duration: 10, estimated_calories: 10, activities: [ { day: 4, name: "Gun 4 - Dinlenme", type: "light_activity", focus: "Tam Dinlenme", estimated_duration: 10, estimated_calories: 10, activities: [
{ name: "Breathing Only", name_tr: "Sadece Nefes", duration: "10 minutes", gif: gifUrl("Breathing Only"), instructions: ["Comfortable position", "Gentle natural breathing", "Mindfulness focus"], notes: "Active rest through breathing" }, { name: "Sadece Nefes", name_tr: "Sadece Nefes", duration: "10 dakika", gif: gifUrl("Breathing Only"), instructions: ["Rahat pozisyon", "Hafif dogal nefes", "Farkindalik odagi"], notes: "Nefes ile aktif dinlenme" },
] }, ] },
{ day: 5, name: "Day 5 - Gentle Mobility", type: "light_activity", focus: "Joint Care", estimated_duration: 15, estimated_calories: 20, activities: [ { day: 5, name: "Gun 5 - Hafif Mobilite", type: "light_activity", focus: "Eklem Bakimi", estimated_duration: 15, estimated_calories: 20, activities: [
{ name: "Assisted Range of Motion", name_tr: "Yardimli Hareket Acikligi", duration: "10 minutes", gif: gifUrl("Assisted ROM"), instructions: ["Use one limb to help the other if needed", "Gentle passive stretching", "Stay within comfort zone"], notes: "Maintain joint health" }, { name: "Yardimli Hareket Acikligi", name_tr: "Yardimli Hareket Acikligi", duration: "10 dakika", gif: gifUrl("Assisted ROM"), instructions: ["Gerekirse bir uzvu digerine yardimci kullanin", "Hafif pasif germe", "Konfor bolgesi icinde kalin"], notes: "Eklem sagligini koruyun" },
{ name: "Visualization Exercise", name_tr: "Gorsellestirme", duration: "5 minutes", gif: gifUrl("Visualization"), instructions: ["Imagine performing movements", "Mental rehearsal activates neural pathways", "Relaxing and beneficial"], notes: "Mind-body exercise" }, { name: "Gorsellestirme Egzersizi", name_tr: "Gorsellestirme", duration: "5 dakika", gif: gifUrl("Visualization"), instructions: ["Hareketleri yaptiginizi hayal edin", "Zihinsel prova sinir yollarini aktive eder", "Rahatlatici ve faydalı"], notes: "Zihin-vucut egzersizi" },
] }, ] },
{ day: 6, name: "Day 6 - Breathing & Relaxation", type: "light_activity", focus: "Stress Relief", estimated_duration: 15, estimated_calories: 10, activities: [ { day: 6, name: "Gun 6 - Nefes & Rahatlama", type: "light_activity", focus: "Stres Giderme", estimated_duration: 15, estimated_calories: 10, activities: [
{ name: "Extended Breathing Session", name_tr: "Uzun Nefes Seansi", duration: "10 minutes", gif: gifUrl("Extended Breathing"), instructions: ["Alternate nostril breathing", "Box breathing", "4-7-8 breathing"], notes: "Multiple techniques" }, { name: "Uzun Nefes Seansi", name_tr: "Uzun Nefes Seansi", duration: "10 dakika", gif: gifUrl("Extended Breathing"), instructions: ["Alternatif burun nefesi", "Kutu nefesi", "4-7-8 nefesi"], notes: "Birden fazla teknik" },
{ name: "Gentle Self-Massage", name_tr: "Hafif Masaj", duration: "5 minutes", gif: gifUrl("Self Massage"), instructions: ["Gently massage accessible areas", "Focus on hands, arms, neck", "Use gentle circular motions"], notes: "Relaxation and circulation" }, { name: "Hafif Masaj", name_tr: "Hafif Masaj", duration: "5 dakika", gif: gifUrl("Self Massage"), instructions: ["Erisilebilir bolgeleri hafifce masaj yapin", "Eller, kollar, boyuna odaklanin", "Hafif dairesel hareketler kullanin"], notes: "Rahatlama ve kan dolasimi" },
] }, ] },
{ day: 7, name: "Day 7 - Full Rest", type: "light_activity", focus: "Recovery", estimated_duration: 5, estimated_calories: 5, activities: [ { day: 7, name: "Gun 7 - Tam Dinlenme", type: "light_activity", focus: "Toparlanma", estimated_duration: 5, estimated_calories: 5, activities: [
{ name: "Mindful Rest", name_tr: "Bilinc Dinlenmesi", duration: "5 minutes", gif: gifUrl("Mindful Rest"), instructions: ["Simply rest", "Breathe naturally", "Be present"], notes: "Complete rest day" }, { name: "Bilinçli Dinlenme", name_tr: "Bilinc Dinlenmesi", duration: "5 dakika", gif: gifUrl("Mindful Rest"), instructions: ["Sadece dinlenin", "Dogal nefes alin", "Anda kalin"], notes: "Tam dinlenme gunu" },
] }, ] },
], ],
}; };
@@ -622,16 +622,16 @@ function getAlternativeExercises(injuryArea, count) {
function buildWarmupRoutine(profile) { function buildWarmupRoutine(profile) {
const injuryArea = profile.has_injury ? (profile.injury_area || "none") : "none"; const injuryArea = profile.has_injury ? (profile.injury_area || "none") : "none";
const warmup = [ const warmup = [
{ name: "General Warm-Up (Light Cardio)", duration: "5 min", notes: "Treadmill, bike, or jumping jacks to raise heart rate" }, { name: "Genel Isinma (Hafif Kardiyo)", duration: "5 dk", notes: "Kalp atisini yukseltmek icin kosus bandi, bisiklet veya jumping jack" },
{ name: "Dynamic Stretching", duration: "3 min", notes: "Arm circles, leg swings, torso rotations" }, { name: "Dinamik Germe", duration: "3 dk", notes: "Kol civirleri, bacak sallamalari, govde rotasyonlari" },
]; ];
if (profile.has_asthma) { if (profile.has_asthma) {
warmup[0].notes += " - Extend to 8-10 min for asthma; gradual intensity increase is important"; warmup[0].notes += " - Astim icin 8-10 dk'ya uzatin; kademeli yogunluk artisi onemlidir";
} }
if (profile.has_diabetes) { if (profile.has_diabetes) {
warmup.push({ name: "Blood Sugar Check", duration: "1 min", notes: "Check blood sugar before exercise. Ensure it is between 100-250 mg/dL" }); warmup.push({ name: "Kan Sekeri Kontrolu", duration: "1 dk", notes: "Egzersiz oncesi kan sekerini kontrol edin. 100-250 mg/dL arasinda oldugundan emin olun" });
} }
if (injuryArea !== "none" && INJURY_WARMUPS[injuryArea]) { if (injuryArea !== "none" && INJURY_WARMUPS[injuryArea]) {
@@ -640,7 +640,7 @@ function buildWarmupRoutine(profile) {
const jobType = profile.job_type || ""; const jobType = profile.job_type || "";
if (jobType === "desk" || jobType === "office" || jobType === "masa_basi") { if (jobType === "desk" || jobType === "office" || jobType === "masa_basi") {
warmup.push({ name: "Posture Correction Mobility", duration: "3 min", notes: "Shoulder and hip opening for desk workers" }); warmup.push({ name: "Durus Duzeltme Mobilitesi", duration: "3 dk", notes: "Masa basi calisanlar icin omuz ve kalca acma" });
} }
return warmup; return warmup;
@@ -648,20 +648,24 @@ function buildWarmupRoutine(profile) {
function buildCooldown(profile) { function buildCooldown(profile) {
const injuryArea = profile.has_injury ? (profile.injury_area || "none") : "none"; const injuryArea = profile.has_injury ? (profile.injury_area || "none") : "none";
const areaNamesTR = {
knee: "Diz", back: "Sirt", shoulder: "Omuz", elbow: "Dirsek",
wrist: "Bilek", ankle: "Ayak Bilegi", hip: "Kalca", neck: "Boyun",
};
const cooldown = [ const cooldown = [
{ name: "General Stretching", duration: "5 min", notes: "Stretch all worked muscle groups" }, { name: "Genel Germe", duration: "5 dk", notes: "Calisan tum kas gruplarini gerin" },
]; ];
if (injuryArea !== "none") { if (injuryArea !== "none") {
const areaName = injuryArea.charAt(0).toUpperCase() + injuryArea.slice(1); const areaName = areaNamesTR[injuryArea] || (injuryArea.charAt(0).toUpperCase() + injuryArea.slice(1));
cooldown.push({ name: `${areaName} Area Specific Stretching`, duration: "3 min", notes: "Targeted stretching for injury area" }); cooldown.push({ name: `${areaName} Bolgesi Ozel Germe`, duration: "3 dk", notes: "Yaralanma bolgesi icin hedefli germe" });
} }
if (profile.has_diabetes) { if (profile.has_diabetes) {
cooldown.push({ name: "Post-Exercise Blood Sugar Check", duration: "1 min", notes: "Monitor blood sugar after exercise" }); cooldown.push({ name: "Egzersiz Sonrasi Kan Sekeri Kontrolu", duration: "1 dk", notes: "Egzersiz sonrasi kan sekerini izleyin" });
} }
cooldown.push({ name: "Deep Breathing & Relaxation", duration: "2 min", notes: "Breathe in 4 seconds, hold 4 seconds, breathe out 4 seconds" }); cooldown.push({ name: "Derin Nefes & Rahatlama", duration: "2 dk", notes: "4 saniye nefes alin, 4 saniye tutun, 4 saniye nefes verin" });
return cooldown; return cooldown;
} }
@@ -671,38 +675,38 @@ function buildCooldown(profile) {
function buildGeneralTips(profile) { function buildGeneralTips(profile) {
const tips = [ const tips = [
"Warm up 5-10 minutes before every workout", "Her antrenmandan once 5-10 dakika isinma yapin",
"Cool down and stretch 5-10 minutes after every workout", "Her antrenmandan sonra 5-10 dakika soguma ve germe yapin",
"Drink at least 2-3 liters of water daily", "Gunluk en az 2-3 litre su icin",
"Prioritize sleep (7-9 hours per night)", "Uykuyu onceliklendirin (gecede 7-9 saat)",
"Stop any exercise immediately if you feel pain", "Agri hissederseniz herhangi bir egzersizi hemen durdurun",
"Take at least 1 full rest day per week", "Haftada en az 1 tam dinlenme gunu alin",
]; ];
const experience = profile.workout_experience || "beginner"; const experience = profile.workout_experience || "beginner";
if (experience === "beginner") { if (experience === "beginner") {
tips.push("Beginner level: Prioritize form and technique over weight. Increase weights gradually."); tips.push("Baslangic seviyesi: Agirliktan once form ve teknige oncelik verin. Agirliklari kademeli artirin.");
} else if (experience === "advanced") { } else if (experience === "advanced") {
tips.push("Advanced level: Apply progressive overload. Consider super-sets and drop-sets for intensity."); tips.push("Ileri seviye: Kademeli artan yuk uygulayin. Yogunluk icin super-set ve drop-set dusunun.");
} }
const bodyType = profile.body_type || "mesomorph"; const bodyType = profile.body_type || "mesomorph";
if (bodyType === "ectomorph") { if (bodyType === "ectomorph") {
tips.push("Ectomorph body type: Focus on compound movements, limit excess cardio, maintain calorie surplus."); tips.push("Ektomorf vucut tipi: Bileşik hareketlere odaklanin, fazla kardiyoyu sinirlayin, kalori fazlasini koruyun.");
} else if (bodyType === "endomorph") { } else if (bodyType === "endomorph") {
tips.push("Endomorph body type: Add post-workout cardio, watch portion sizes, prefer HIIT cardio."); tips.push("Endomorf vucut tipi: Antrenman sonrasi kardiyo ekleyin, porsiyon boyutlarina dikkat edin, HIIT kardiyo tercih edin.");
} }
if ((profile.sleep_hours || 7) < 6) { if ((profile.sleep_hours || 7) < 6) {
tips.push("Your sleep is insufficient: Avoid overtraining, prioritize recovery."); tips.push("Uykunuz yetersiz: Asiri antrenmandan kacinin, toparlanmayi onceliklendirin.");
} }
if (profile.stress_level === "high") { if (profile.stress_level === "high") {
tips.push("High stress level: Add meditation and breathing exercises. Training volume has been reduced."); tips.push("Yuksek stres seviyesi: Meditasyon ve nefes egzersizleri ekleyin. Antrenman hacmi azaltildi.");
} }
const jobType = profile.job_type || ""; const jobType = profile.job_type || "";
if (jobType === "desk" || jobType === "office" || jobType === "masa_basi") { if (jobType === "desk" || jobType === "office" || jobType === "masa_basi") {
tips.push("Desk worker: Stand up and move every hour. Include posture correction exercises."); tips.push("Masa basi calisan: Her saat ayaga kalkin ve hareket edin. Durus duzeltme egzersizleri ekleyin.");
} }
return tips; return tips;
@@ -712,28 +716,28 @@ function buildMedicalNotes(profile) {
const notes = []; const notes = [];
if (profile.heart_condition) { if (profile.heart_condition) {
notes.push("Heart condition: Low intensity only. No HIIT. Monitor heart rate and stay in safe zones (50-65% max HR). Stop if dizzy or chest pain."); notes.push("Kalp rahatsizligi: Sadece dusuk yogunluk. HIIT yok. Kalp atisini izleyin ve guvenli bolgelerde kalin (maks KH %50-65). Bas donmesi veya gogus agrisi olursa durdurun.");
} }
if (profile.blood_pressure === "high" || profile.high_blood_pressure) { if (profile.blood_pressure === "high" || profile.high_blood_pressure) {
notes.push("High blood pressure: No heavy lifting or breath holding (Valsalva). Avoid overhead pressing. Keep intensity moderate. Monitor blood pressure regularly."); notes.push("Yuksek tansiyon: Agir kaldirma veya nefes tutma (Valsalva) yok. Bas ustu basma hareketi yapmayin. Yogunlugu orta seviyede tutun. Tansiyonu duzenli olcun.");
} }
if (profile.has_asthma) { if (profile.has_asthma) {
notes.push("Asthma: Extended warm-up is important. Keep inhaler nearby. Avoid cold environments. Moderate cardio intensity."); notes.push("Astim: Uzun isinma onemlidir. Inhalatoru yaninizda bulundurun. Soguk ortamlardan kacinin. Orta kardiyo yogunlugu.");
} }
if (profile.has_diabetes) { if (profile.has_diabetes) {
notes.push("Diabetes: Check blood sugar before and after exercise. Include warm-up and cool-down. Avoid fasted training. Carry fast-acting sugar."); notes.push("Diyabet: Egzersiz oncesi ve sonrasi kan sekerini kontrol edin. Isinma ve soguma dahil edin. Ac karnina antrenman yapmayin. Hizli etkili seker tasiyin.");
} }
if (profile.has_arthritis) { if (profile.has_arthritis) {
notes.push("Arthritis: Low impact exercises only. Joint-friendly movements. Consider swimming/water exercises if available. Longer warm-ups help."); notes.push("Artrit: Sadece dusuk etkili egzersizler. Eklem dostu hareketler. Mumkunse yuzme/su egzersizlerini dusunun. Uzun isinmalar yardimci olur.");
} }
if (profile.has_osteoporosis) { if (profile.has_osteoporosis) {
notes.push("Osteoporosis: Weight-bearing exercises are beneficial but avoid high impact. No trunk flexion exercises. Focus on balance to prevent falls."); notes.push("Osteoporoz: Agirlik tasiyan egzersizler faydalıdir ama yuksek etkiden kacinin. Govde bukme egzersizi yapmayin. Dusmeleri onlemek icin dengeye odaklanin.");
} }
if (profile.has_fibromyalgia) { if (profile.has_fibromyalgia) {
notes.push("Fibromyalgia: Gentle, low-intensity exercises only. Focus on stretching and yoga-based movements. Listen to your body. Volume has been reduced."); notes.push("Fibromiyalji: Sadece hafif, dusuk yogunluklu egzersizler. Germe ve yoga tabanli hareketlere odaklanin. Vucudunuzu dinleyin. Hacim azaltildi.");
} }
if (profile.has_epilepsy) { if (profile.has_epilepsy) {
notes.push("Epilepsy: Avoid exercises where falling could be dangerous (no heavy overhead lifts, no climbing). Train with a partner when possible."); notes.push("Epilepsi: Dusmenin tehlikeli olabilecegi egzersizlerden kacinin (agir bas ustu kaldirma yok, tirmanma yok). Mumkun oldugunda bir partnerle antrenman yapin.");
} }
return notes; return notes;
@@ -743,26 +747,26 @@ function buildInjuryNote(profile) {
if (!profile.has_injury || !profile.injury_area || profile.injury_area === "none") return null; if (!profile.has_injury || !profile.injury_area || profile.injury_area === "none") return null;
const areaNames = { const areaNames = {
knee: "Knee", back: "Back/Lower Back", shoulder: "Shoulder", elbow: "Elbow", knee: "Diz", back: "Sirt/Bel", shoulder: "Omuz", elbow: "Dirsek",
wrist: "Wrist", ankle: "Ankle", hip: "Hip", neck: "Neck", wrist: "Bilek", ankle: "Ayak Bilegi", hip: "Kalca", neck: "Boyun",
}; };
const severityNames = { const severityNames = {
mild: "mild", moderate: "moderate", severe: "severe", mild: "hafif", moderate: "orta", severe: "agir",
}; };
const areas = String(profile.injury_area).split(",").map((s) => s.trim()).filter((s) => s && s !== "none"); const areas = String(profile.injury_area).split(",").map((s) => s.trim()).filter((s) => s && s !== "none");
const areaName = areas.map((a) => areaNames[a] || a).join(", "); const areaName = areas.map((a) => areaNames[a] || a).join(", ");
const severityName = severityNames[profile.injury_severity] || "mild"; const severityName = severityNames[profile.injury_severity] || "hafif";
let note = `Program adapted for ${severityName} ${areaName} injury.`; let note = `Program ${severityName} ${areaName} yaralanmasina gore uyarlandi.`;
if (profile.injury_notes) { if (profile.injury_notes) {
note += ` Note: ${profile.injury_notes}`; note += ` Not: ${profile.injury_notes}`;
} }
if (profile.injury_severity === "severe") { if (profile.injury_severity === "severe") {
note += " Intensity significantly reduced due to severe injury. Do not train heavy without doctor approval."; note += " Agir yaralanma nedeniyle yogunluk onemli olcude azaltildi. Doktor onayi olmadan agir antrenman yapmayin.";
} else if (profile.injury_severity === "moderate") { } else if (profile.injury_severity === "moderate") {
note += " Exercise with caution and control. Stop if pain increases."; note += " Dikkatli ve kontrollü egzersiz yapin. Agri artarsa durdurun.";
} }
return note; return note;
@@ -862,7 +866,7 @@ function buildStrengthDay(dayNumber, dayName, focus, muscleGroups, profile, week
return { return {
day: dayNumber, day: dayNumber,
name: `Day ${dayNumber} - ${dayName}`, name: `Gun ${dayNumber} - ${dayName}`,
type: "strength", type: "strength",
focus: focus, focus: focus,
estimated_duration: estimateDayDuration(exercises), estimated_duration: estimateDayDuration(exercises),
@@ -901,7 +905,7 @@ function buildCardioDay(dayNumber, dayName, focus, profile, week) {
return { return {
day: dayNumber, day: dayNumber,
name: `Day ${dayNumber} - ${dayName}`, name: `Gun ${dayNumber} - ${dayName}`,
type: "cardio", type: "cardio",
focus: focus, focus: focus,
estimated_duration: estimateDayDuration(exercises), estimated_duration: estimateDayDuration(exercises),
@@ -924,15 +928,15 @@ function buildFlexibilityDay(dayNumber, dayName, profile, week) {
return { return {
day: dayNumber, day: dayNumber,
name: `Day ${dayNumber} - ${dayName}`, name: `Gun ${dayNumber} - ${dayName}`,
type: "active_recovery", type: "active_recovery",
focus: "Flexibility & Recovery", focus: "Esneklik & Toparlanma",
estimated_duration: 25, estimated_duration: 25,
estimated_calories: 40, estimated_calories: 40,
warmup: [{ name: "Light Movement", duration: "3 min", notes: "Easy walking or gentle arm swings" }], warmup: [{ name: "Hafif Hareket", duration: "3 dk", notes: "Kolay yuruyus veya hafif kol sallamalari" }],
exercises: formattedExercises, exercises: formattedExercises,
cooldown: [{ name: "Deep Breathing & Meditation", duration: "5 min", notes: "Full relaxation for recovery" }], cooldown: [{ name: "Derin Nefes & Meditasyon", duration: "5 dk", notes: "Toparlanma icin tam rahatlama" }],
notes: ["Active recovery day - focus on mobility and flexibility", "Keep all movements gentle and controlled"], notes: ["Aktif toparlanma gunu - mobilite ve esneklige odaklanin", "Tum hareketleri yumusak ve kontrollü tutun"],
}; };
} }
@@ -947,15 +951,15 @@ function buildRestDay(dayNumber, dayName, profile, week) {
return { return {
day: dayNumber, day: dayNumber,
name: `Day ${dayNumber} - Rest`, name: `Gun ${dayNumber} - Dinlenme`,
type: "rest", type: "rest",
focus: "Active Rest & Flexibility", focus: "Aktif Dinlenme & Esneklik",
estimated_duration: 20, estimated_duration: 20,
estimated_calories: 30, estimated_calories: 30,
warmup: [], warmup: [],
exercises: formattedExercises, exercises: formattedExercises,
cooldown: [{ name: "Deep Breathing & Meditation", duration: "5 min", notes: "Focus on recovery and relaxation" }], cooldown: [{ name: "Derin Nefes & Meditasyon", duration: "5 dk", notes: "Toparlanma ve rahatlamaya odaklanin" }],
notes: ["Rest day - listen to your body", "Light stretching and walking are encouraged"], notes: ["Dinlenme gunu - vucudunuzu dinleyin", "Hafif germe ve yuruyus tavsiye edilir"],
}; };
} }
@@ -1217,7 +1221,7 @@ function generateLightActivityPlan(profile, week) {
adjustedDay.warmup = []; adjustedDay.warmup = [];
adjustedDay.exercises = []; adjustedDay.exercises = [];
adjustedDay.cooldown = []; adjustedDay.cooldown = [];
adjustedDay.notes = [`Week ${week}: ${weekConfig.description}`]; adjustedDay.notes = [`Hafta ${week}: ${weekConfig.description}`];
return adjustedDay; return adjustedDay;
}); });
} }
@@ -1236,17 +1240,17 @@ function generateWorkoutProgram(profile, week = 1) {
if (workoutLocation === "none") { if (workoutLocation === "none") {
const lightDays = generateLightActivityPlan(profile, normalizedWeek); const lightDays = generateLightActivityPlan(profile, normalizedWeek);
return { return {
title: "Personal Light Activity Plan", title: "Kisisel Hafif Aktivite Plani",
description: "A gentle daily activity plan designed for your current situation. Focus on movement quality, breathing, and gradual improvement.", description: "Mevcut durumunuz icin tasarlanmis hafif gunluk aktivite plani. Hareket kalitesi, nefes ve kademeli gelisime odaklanin.",
week: normalizedWeek, week: normalizedWeek,
mesocycle_phase: mesocycleConfig.phase, mesocycle_phase: mesocycleConfig.phase,
workout_location: "none", workout_location: "none",
experience_level: experience, experience_level: experience,
notes: [ notes: [
"This is a light activity plan, not a workout program", "Bu bir hafif aktivite planidir, antrenman programi degildir",
"Listen to your body and rest when needed", "Vucudunuzu dinleyin ve gerektiginde dinlenin",
"Consistency matters more than intensity", "Tutarlilik yogunluktan daha onemlidir",
"Consult your doctor before starting any new exercise routine", "Yeni bir egzersiz rutinine baslamadan once doktorunuza danisin",
], ],
general_tips: buildGeneralTips(profile), general_tips: buildGeneralTips(profile),
injury_note: buildInjuryNote(profile), injury_note: buildInjuryNote(profile),
@@ -1262,16 +1266,16 @@ function generateWorkoutProgram(profile, week = 1) {
const adjustedDays = applyGoalAdjustments(days, profile, normalizedWeek); const adjustedDays = applyGoalAdjustments(days, profile, normalizedWeek);
return { return {
title: "Personal Wheelchair-Adapted Training Program", title: "Kisisel Tekerlekli Sandalye Uyumlu Antrenman Programi",
description: "Upper body focused program adapted for wheelchair users. All exercises are seated or upper body only.", description: "Tekerlekli sandalye kullananlar icin uyarlanmis ust vucut odakli program. Tum egzersizler oturarak veya sadece ust vucuttur.",
week: normalizedWeek, week: normalizedWeek,
mesocycle_phase: mesocycleConfig.phase, mesocycle_phase: mesocycleConfig.phase,
workout_location: workoutLocation, workout_location: workoutLocation,
experience_level: experience, experience_level: experience,
notes: [ notes: [
"All exercises adapted for seated position", "Tum egzersizler oturma pozisyonuna uyarlanmistir",
"Focus on upper body strength and core stability", "Ust vucut gucu ve core stabilitesine odaklanin",
"Include shoulder health and posture exercises", "Omuz sagligi ve durus egzersizleri dahil edin",
], ],
general_tips: buildGeneralTips(profile), general_tips: buildGeneralTips(profile),
injury_note: buildInjuryNote(profile), injury_note: buildInjuryNote(profile),
@@ -1283,16 +1287,16 @@ function generateWorkoutProgram(profile, week = 1) {
// Limited both - generate light activity even if location is gym/home // Limited both - generate light activity even if location is gym/home
const lightDays = generateLightActivityPlan(profile, normalizedWeek); const lightDays = generateLightActivityPlan(profile, normalizedWeek);
return { return {
title: "Personal Gentle Movement Plan", title: "Kisisel Hafif Hareket Plani",
description: "A gentle movement plan adapted for your mobility level. Focus on what you can do comfortably.", description: "Mobilite seviyenize uyarlanmis hafif hareket plani. Rahatca yapabileceklerinize odaklanin.",
week: normalizedWeek, week: normalizedWeek,
mesocycle_phase: mesocycleConfig.phase, mesocycle_phase: mesocycleConfig.phase,
workout_location: workoutLocation, workout_location: workoutLocation,
experience_level: experience, experience_level: experience,
notes: [ notes: [
"Gentle movements only - stay within your comfort zone", "Sadece hafif hareketler - konfor bolgenizde kalin",
"Focus on breathing and mobility", "Nefes ve mobiliteye odaklanin",
"Any movement is beneficial", "Her hareket faydalıdir",
], ],
general_tips: buildGeneralTips(profile), general_tips: buildGeneralTips(profile),
injury_note: buildInjuryNote(profile), injury_note: buildInjuryNote(profile),
@@ -1321,10 +1325,12 @@ function generateWorkoutProgram(profile, week = 1) {
days = adjustCardioRestDays(days, profile, normalizedWeek); days = adjustCardioRestDays(days, profile, normalizedWeek);
const title = workoutLocation === "home" const title = workoutLocation === "home"
? "Personal Home Training Program" ? "Kisisel Ev Antrenman Programi"
: "Personal Training Program"; : "Kisisel Antrenman Programi";
const description = `${experience.charAt(0).toUpperCase() + experience.slice(1)} level ${workoutLocation} training program. Week ${normalizedWeek} of 4 (${mesocycleConfig.phase}).`; const experienceTR = { beginner: "Baslangic", intermediate: "Orta", advanced: "Ileri" };
const locationTR = { gym: "spor salonu", home: "ev" };
const description = `${experienceTR[experience] || experience} seviye ${locationTR[workoutLocation] || workoutLocation} antrenman programi. Hafta ${normalizedWeek}/4 (${mesocycleConfig.phase}).`;
return { return {
title: title, title: title,
@@ -1334,7 +1340,7 @@ function generateWorkoutProgram(profile, week = 1) {
workout_location: workoutLocation, workout_location: workoutLocation,
experience_level: experience, experience_level: experience,
notes: [ notes: [
`Mesocycle phase: ${mesocycleConfig.phase} - ${mesocycleConfig.description}`, `Mezosiklus fazi: ${mesocycleConfig.phase} - ${mesocycleConfig.description}`,
], ],
general_tips: buildGeneralTips(profile), general_tips: buildGeneralTips(profile),
injury_note: buildInjuryNote(profile), injury_note: buildInjuryNote(profile),