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
+8
View File
@@ -47,6 +47,12 @@ const day = (v) => { const s = first(v); return s ? String(s).slice(0, 10) : nul
const NATURE_TR = { works: 'Yapım İşi', supplies: 'Mal Alımı', services: 'Hizmet Alımı' };
// Çok dilli alanda Türkçe varyant (varsa)
function turTxt(v) {
if (v && typeof v === 'object' && !Array.isArray(v) && typeof v.tur === 'string' && v.tur.trim()) return v.tur.trim();
return null;
}
function mapNotice(n) {
const pn = n['publication-number'];
const bedel = n['result-value-notice'] ?? first(n['estimated-value-lot']);
@@ -72,6 +78,8 @@ function mapNotice(n) {
sonucIlani: String(n['notice-type'] || '').startsWith('can'),
cpv: uniq(n['classification-cpv']),
aciklama: txt(n['description-lot']),
baslikTur: turTxt(n['notice-title']),
aciklamaTur: turTxt(n['description-lot']),
link: n.links?.html?.ENG || (pn ? `https://ted.europa.eu/en/notice/-/detail/${pn}` : null),
};
}