fix: show one clock convention in English on the panel
The labels this application writes itself already read "6:30 pm", while a translated notice kept whatever the French said, so the screen could show "Closes at 6:30 pm" above "Delayed opening at 14:00". Two conventions side by side on one panel. The conversion is done in code, not by the prompt. The model is still told to leave times alone — reading a clock and rewriting it is deterministic work, and asking a language model to do it introduces a failure mode for no benefit. Only HH:mm is touched, never a time that already carries am or pm, so the pass is idempotent and years, dates written 20/07 and percentages are left alone. Hand-written translations are not rewritten: that wording was somebody's explicit choice. Verified against the live service: "Ouvert 10:00 – 13:00 puis 14:00 – 18:30" now comes back as "Open 10:00 am – 1:00 pm then 2:00 pm – 6:30 pm". Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012cSY9pVhZmJUKNN7wf1Myd
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
import { createHash } from 'node:crypto';
|
||||
|
||||
import { prisma } from '@/lib/db';
|
||||
import { toEnglishClock } from '@/lib/schedule/format';
|
||||
|
||||
import { LoxiTranslationProvider, loxiConfigFromEnv } from './loxi';
|
||||
import type { TranslationOutcome, TranslationProvider } from './provider';
|
||||
@@ -69,11 +70,18 @@ export async function translateToEnglish(
|
||||
return { ok: true, text: hit.translatedText, model: provider.model, cached: true };
|
||||
}
|
||||
|
||||
const outcome = await provider.translate({ text: source });
|
||||
if (!outcome.ok) {
|
||||
return outcome;
|
||||
const raw = await provider.translate({ text: source });
|
||||
if (!raw.ok) {
|
||||
return raw;
|
||||
}
|
||||
|
||||
// The prompt tells the model to leave times untouched, because converting a
|
||||
// clock is not a job for a language model. It is done here instead, so a
|
||||
// translated notice and the labels this application writes itself never show
|
||||
// two different conventions on the same panel. A hand-written translation is
|
||||
// not touched: that wording was somebody's explicit choice.
|
||||
const outcome = { ...raw, text: toEnglishClock(raw.text) };
|
||||
|
||||
// Two concurrent saves of the same text would race here; the upsert makes
|
||||
// the second a no-op instead of a crash.
|
||||
await prisma.translationCache.upsert({
|
||||
|
||||
Reference in New Issue
Block a user