AB İhaleleri (TED): başlık ve açıklamalar Türkçe

- server/ted-ceviri.mjs: TED'in kendi Türkçe alanı varsa onu kullanır; yoksa
  OpenRouter ile toplu çevirir (deepseek-v4-flash → gemini 3.7 flash → glm),
  sonucu server/data/ted.sqlite'ta ilan numarasına göre saklar
- İstek en fazla 12 sn bekler, kalan çeviriler arka planda sürer;
  yanıt ceviriBekleniyor bayrağı taşır, ön yüz sessizce yeniden çeker
- Kartta Türkçe başlık + küçük özgün başlık, Türkçe açıklama (3 satır),
  ülke kodları Türkçe ad (TUR → Türkiye, AUT → Avusturya…)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-09-05 15:58:28 +03:00
co-authored by Claude Fable 5.1
parent eeb1447edc
commit c32446db81
4 changed files with 177 additions and 10 deletions
+4 -1
View File
@@ -37,6 +37,7 @@ import { billingConfigured, webhookConfigured, planCatalog, createCheckoutSessio
import * as store from './user-store.mjs';
import { planOf, haklar, kullanim, kotaKontrol, ozellikVar } from './entitlements.mjs';
import { searchTed } from './ted.mjs';
import { tedCevir } from './ted-ceviri.mjs';
import { readHistory, historyStats, havuzOlc, havuzGecmisi, havuzOzet,
sektorZenginOku, sektorZenginYaz, sektorZenginDenenmis, sektorZenginSayi,
cpvCacheOku, cpvCacheYaz } from './history-store.mjs';
@@ -926,7 +927,9 @@ const server = http.createServer(async (req, res) => {
page: Number(url.searchParams.get('page')) || 1,
limit: Number(url.searchParams.get('limit')) || 25,
});
return json(res, 200, { success: true, ...out });
// Başlık/açıklama Türkçesi: TED'in kendi TUR metni → önbellek → model
const bekleyenCeviri = await tedCevir(out.tenders).catch(() => 0);
return json(res, 200, { success: true, ...out, ceviriBekleniyor: bekleyenCeviri > 0 });
} catch (e) {
return json(res, 502, { success: false, error: e.message });
}