diff --git a/src/components/ai-edition/RightPanes.i18n.test.tsx b/src/components/ai-edition/RightPanes.i18n.test.tsx index 64e40e7d6..fb9fc07ba 100644 --- a/src/components/ai-edition/RightPanes.i18n.test.tsx +++ b/src/components/ai-edition/RightPanes.i18n.test.tsx @@ -11,7 +11,7 @@ import type { ReactElement } from "react"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { I18nProvider } from "@/contexts/I18nContext"; import { LOCALE_STORAGE_KEY } from "@/i18n/config"; -import { CursorPane, LayoutPane, VideoEffectsPane } from "./RightPanes"; +import { CursorPane, LayoutPane, TranscriptPane, VideoEffectsPane } from "./RightPanes"; function renderIn(locale: string, ui: ReactElement) { localStorage.setItem(LOCALE_STORAGE_KEY, locale); @@ -77,4 +77,58 @@ describe("right-rail panes are localized", () => { expect(screen.getByRole("heading", { name: "Composition" })).toBeInTheDocument(); expect(screen.getByText("Blur BG")).toBeInTheDocument(); }); + + it("renders the transcript pane title as 'Transcription' in French", () => { + const noop = () => { + /* noop */ + }; + renderIn( + "fr", + , + ); + expect(screen.getByRole("heading", { name: "Transcription" })).toBeInTheDocument(); + }); + + it("renders the transcript pane title as 'Transcript' in English", () => { + const noop = () => { + /* noop */ + }; + renderIn( + "en", + , + ); + expect(screen.getByRole("heading", { name: "Transcript" })).toBeInTheDocument(); + }); }); diff --git a/src/i18n/locales/ar/settings.json b/src/i18n/locales/ar/settings.json index 3a9e392ca..2efb8fc10 100644 --- a/src/i18n/locales/ar/settings.json +++ b/src/i18n/locales/ar/settings.json @@ -113,7 +113,7 @@ "transcript": { "laneRecording": "التسجيل", "noTranscript": "لا يوجد نص بعد", - "title": "النص الحالي", + "title": "النص", "restoreWord": "استعادة \"{{word}}\"", "revertWord": "استعادة \"{{original}}\"", "editingHint": "انقر نقرًا مزدوجًا على كلمة لتصحيحها، واضغط Backspace لقطعها من الفيلم.", diff --git a/src/i18n/locales/en/settings.json b/src/i18n/locales/en/settings.json index 7053126b8..cf499104b 100644 --- a/src/i18n/locales/en/settings.json +++ b/src/i18n/locales/en/settings.json @@ -113,7 +113,7 @@ "transcript": { "laneRecording": "Recording", "noTranscript": "No transcript yet", - "title": "Current transcription", + "title": "Transcript", "restoreWord": "Restore \"{{word}}\"", "revertWord": "Restore \"{{original}}\"", "editingHint": "Double-click a word to correct it, Backspace cuts it from the film.", diff --git a/src/i18n/locales/es/settings.json b/src/i18n/locales/es/settings.json index 84419849c..dbde8bce8 100644 --- a/src/i18n/locales/es/settings.json +++ b/src/i18n/locales/es/settings.json @@ -113,7 +113,7 @@ "transcript": { "laneRecording": "Grabación", "noTranscript": "Aún no hay transcripción", - "title": "Transcripción actual", + "title": "Transcripción", "restoreWord": "Restaurar «{{word}}»", "revertWord": "Restaurar «{{original}}»", "editingHint": "Haz doble clic en una palabra para corregirla, Retroceso la corta del vídeo.", diff --git a/src/i18n/locales/fr/settings.json b/src/i18n/locales/fr/settings.json index 1c8bf2764..f7ab3d56e 100644 --- a/src/i18n/locales/fr/settings.json +++ b/src/i18n/locales/fr/settings.json @@ -113,7 +113,7 @@ "transcript": { "laneRecording": "Enregistrement", "noTranscript": "Aucune transcription pour l'instant", - "title": "Transcription actuelle", + "title": "Transcription", "restoreWord": "Restaurer « {{word}} »", "revertWord": "Rétablir « {{original}} »", "editingHint": "Double-cliquez sur un mot pour le corriger, Retour arrière le coupe du film.", diff --git a/src/i18n/locales/it/settings.json b/src/i18n/locales/it/settings.json index 2e5ac7381..0aa569e5c 100644 --- a/src/i18n/locales/it/settings.json +++ b/src/i18n/locales/it/settings.json @@ -113,7 +113,7 @@ "transcript": { "laneRecording": "Registrazione", "noTranscript": "Ancora nessuna trascrizione", - "title": "Trascrizione corrente", + "title": "Trascrizione", "restoreWord": "Ripristina «{{word}}»", "revertWord": "Ripristina «{{original}}»", "editingHint": "Fai doppio clic su una parola per correggerla, Backspace la taglia dal video.", diff --git a/src/i18n/locales/ja-JP/settings.json b/src/i18n/locales/ja-JP/settings.json index 6c746cdfa..dc49e7092 100644 --- a/src/i18n/locales/ja-JP/settings.json +++ b/src/i18n/locales/ja-JP/settings.json @@ -113,7 +113,7 @@ "transcript": { "laneRecording": "録画", "noTranscript": "文字起こしがまだありません", - "title": "現在の文字起こし", + "title": "文字起こし", "restoreWord": "「{{word}}」を元に戻す", "revertWord": "「{{original}}」に戻す", "editingHint": "ダブルクリックで単語を修正、Backspace で映像からカット。", diff --git a/src/i18n/locales/ko-KR/settings.json b/src/i18n/locales/ko-KR/settings.json index 66cbbd245..9095cb565 100644 --- a/src/i18n/locales/ko-KR/settings.json +++ b/src/i18n/locales/ko-KR/settings.json @@ -113,7 +113,7 @@ "transcript": { "laneRecording": "녹화", "noTranscript": "아직 전사가 없습니다", - "title": "현재 전사", + "title": "전사", "restoreWord": "\"{{word}}\" 복원", "revertWord": "\"{{original}}\"(으)로 되돌리기", "editingHint": "단어를 더블 클릭해 수정하고, Backspace로 영상에서 잘라내세요.", diff --git a/src/i18n/locales/pt-BR/settings.json b/src/i18n/locales/pt-BR/settings.json index b70b4d05e..ad216ac3d 100644 --- a/src/i18n/locales/pt-BR/settings.json +++ b/src/i18n/locales/pt-BR/settings.json @@ -113,7 +113,7 @@ "transcript": { "laneRecording": "Gravação", "noTranscript": "Nenhuma transcrição ainda", - "title": "Transcrição atual", + "title": "Transcrição", "restoreWord": "Restaurar \"{{word}}\"", "revertWord": "Restaurar \"{{original}}\"", "editingHint": "Clique duas vezes em uma palavra para corrigi-la, Backspace a corta do vídeo.", diff --git a/src/i18n/locales/ru/settings.json b/src/i18n/locales/ru/settings.json index c390819f5..cdf952de0 100644 --- a/src/i18n/locales/ru/settings.json +++ b/src/i18n/locales/ru/settings.json @@ -113,7 +113,7 @@ "transcript": { "laneRecording": "Запись", "noTranscript": "Расшифровки пока нет", - "title": "Текущая расшифровка", + "title": "Расшифровка", "restoreWord": "Вернуть «{{word}}»", "revertWord": "Вернуть «{{original}}»", "editingHint": "Дважды щёлкните слово, чтобы исправить его, Backspace вырезает его из фильма.", diff --git a/src/i18n/locales/tr/settings.json b/src/i18n/locales/tr/settings.json index 6309560f7..46812be46 100644 --- a/src/i18n/locales/tr/settings.json +++ b/src/i18n/locales/tr/settings.json @@ -113,7 +113,7 @@ "transcript": { "laneRecording": "Kayıt", "noTranscript": "Henüz döküm yok", - "title": "Geçerli döküm", + "title": "Metin Dökümü", "restoreWord": "\"{{word}}\" kelimesini geri al", "revertWord": "\"{{original}}\" haline getir", "editingHint": "Bir kelimeye çift tıklayarak düzeltin, Backspace onu videodan keser.", diff --git a/src/i18n/locales/vi/settings.json b/src/i18n/locales/vi/settings.json index 719f80e21..ae6323e29 100644 --- a/src/i18n/locales/vi/settings.json +++ b/src/i18n/locales/vi/settings.json @@ -113,7 +113,7 @@ "transcript": { "laneRecording": "Bản ghi", "noTranscript": "Chưa có bản chép lời", - "title": "Bản chép lời hiện tại", + "title": "Bản chép lời", "restoreWord": "Khôi phục \"{{word}}\"", "revertWord": "Khôi phục \"{{original}}\"", "editingHint": "Nhấp đúp vào một từ để sửa nó, Backspace cắt nó khỏi video.", diff --git a/src/i18n/locales/zh-CN/settings.json b/src/i18n/locales/zh-CN/settings.json index fb5033f53..316d6a2a9 100644 --- a/src/i18n/locales/zh-CN/settings.json +++ b/src/i18n/locales/zh-CN/settings.json @@ -113,7 +113,7 @@ "transcript": { "laneRecording": "录制", "noTranscript": "暂无转录", - "title": "当前转录", + "title": "转录", "restoreWord": "恢复“{{word}}”", "revertWord": "还原为“{{original}}”", "editingHint": "双击单词即可修正,Backspace 将其从影片中剪掉。", diff --git a/src/i18n/locales/zh-TW/settings.json b/src/i18n/locales/zh-TW/settings.json index cb02cc88f..c878478ce 100644 --- a/src/i18n/locales/zh-TW/settings.json +++ b/src/i18n/locales/zh-TW/settings.json @@ -113,7 +113,7 @@ "transcript": { "laneRecording": "錄影", "noTranscript": "尚無逐字稿", - "title": "目前的逐字稿", + "title": "逐字稿", "restoreWord": "還原「{{word}}」", "revertWord": "還原為「{{original}}」", "editingHint": "雙擊單字即可修正,Backspace 將其從影片中剪掉。", diff --git a/website/scripts/gen-recreation.mjs b/website/scripts/gen-recreation.mjs index 0d3a416ef..4887bc83e 100644 --- a/website/scripts/gen-recreation.mjs +++ b/website/scripts/gen-recreation.mjs @@ -104,6 +104,7 @@ const appModule = (rel) => import(pathToFileURL(resolve(APP, rel)).href); const { formatSec, formatMs } = await appModule("src/lib/ai-edition/timeline/format.ts"); const { effectiveZoomScale } = await appModule("src/lib/ai-edition/timeline/zoom-scale.ts"); +const { removedRawSpans } = await appModule("src/lib/ai-edition/timeline/programme-time.ts"); const { buildClipSection, isSilenceWord, SILENCE_THRESHOLD_SEC } = await appModule( "src/lib/ai-edition/timeline/aggregated-transcript.ts", ); @@ -332,8 +333,9 @@ const asset = doc.assets[0]; const clip = doc.timeline.clips[0]; const totalSec = asset.durationSec; const trims = doc.timeline.trimRanges; +const removed = removedRawSpans(doc.timeline.clips, trims); -const section = buildClipSection(clip, { ...doc.transcript, segments: [] }, asset, trims); +const section = buildClipSection(clip, { ...doc.transcript, segments: [] }, asset, removed); const pct = (sec) => Number(((sec / totalSec) * 100).toFixed(4)); @@ -354,7 +356,7 @@ const WORDS = section.words.map((cw, i) => { startSec: cw.word.startSec, endSec: cw.word.endSec, kept: cw.kept, - trimId: cw.trimId, + trimId: cw.trimIds[0] ?? null, }; }); diff --git a/website/src/components/Recreation/generated.ts b/website/src/components/Recreation/generated.ts index 1409939ba..4205cb6a2 100644 --- a/website/src/components/Recreation/generated.ts +++ b/website/src/components/Recreation/generated.ts @@ -71,7 +71,7 @@ export const META = { /** The transcript pane's header. */ export const INSPECTOR = { - title: "Current transcription", + title: "Transcript", indexBadge: "1", filename: "Bellrock — docs walkthrough", clipRange: "Clip 1 · 0:00.0—0:40.0", @@ -765,7 +765,7 @@ export const TOKENS = { /** One entry per string on screen. */ export const PROVENANCE: ProvenanceEntry[] = [ - { shown: "Current transcription", source: "src/i18n/locales/en/settings.json → transcript.title" }, + { shown: "Transcript", source: "src/i18n/locales/en/settings.json → transcript.title" }, { shown: "Clip 1 · 0:00.0—0:40.0", source: "computed: settings.json transcript.clipLabel with index 1, joined to formatMs(0) and formatMs(40033) from src/lib/ai-edition/timeline/format.ts" }, { shown: "Bellrock — docs walkthrough", source: "fixture assets[0].label" }, { shown: "[silence 2.2s]", source: "computed: settings.json transcript.silence over the 2.190s gap 0–2.19 that buildClipSection inserted at SILENCE_THRESHOLD_SEC 0.2; inside trimRange trim_f52989cf-489c-47f5-a6c7-b95a7d71b399" }, diff --git a/website/src/components/Recreation/index.tsx b/website/src/components/Recreation/index.tsx index 53dbc524f..8fbbde9ee 100644 --- a/website/src/components/Recreation/index.tsx +++ b/website/src/components/Recreation/index.tsx @@ -49,7 +49,7 @@ import { import { useEffect, useRef } from "react"; import { attachDriver, SCENE_QUERIES } from "./driver"; -import { CONTROLS, CURSORS, PANELS } from "./generated"; +import { CONTROLS, CURSORS, INSPECTOR, PANELS } from "./generated"; import { BEATS, CLIPS, @@ -224,7 +224,7 @@ export default function Recreation() { {PANELS.cursor.title}

- Current transcription + {INSPECTOR.title}

@@ -337,7 +337,7 @@ export default function Recreation() { /> - {/* ── Current transcription ── */} + {/* ── Transcript ── */}