Files
cinny/src/app/utils/translation/engine.ts
T

76 lines
2.8 KiB
TypeScript
Raw Normal View History

// Public translation-engine abstraction. One implementation today
// (`chromeEngine` — the Chromium on-device Translator/LanguageDetector API);
// a Bergamot-WASM engine can implement the same interface later with no
// call-site changes. Privacy invariant: an engine MUST run on-device only —
// message text may never leave the machine. There is intentionally no network
// engine.
export type TranslateAvailability = 'unavailable' | 'downloadable' | 'downloading' | 'available';
export interface TranslationEngine {
/** Is this engine usable in the current browser right now? */
isSupported(): boolean;
/** Detect the source language of `text` — a normalized base code (e.g. "de") or undefined. */
detect(text: string): Promise<string | undefined>;
/** Can this source→target pair be translated (and is the model downloaded)? */
availability(source: string, target: string): Promise<TranslateAvailability>;
/**
* Translate `text` from `source` to `target`. May trigger a one-time on-device
* model download (reported via `onDownloadProgress`, 0..1). Must be invoked
* from a user gesture the first time a pair's model needs downloading.
*/
translate(
text: string,
source: string,
target: string,
onDownloadProgress?: (progress: number) => void,
): Promise<string>;
}
// ── Ambient types for the Chromium on-device APIs ──────────────────────────────
// Experimental globals not present in TS's lib.dom; declared minimally here.
// See https://developer.chrome.com/docs/ai/translator-api and the MDN
// Translator_and_Language_Detector_APIs page.
interface CreateMonitor {
addEventListener(type: 'downloadprogress', listener: (event: { loaded: number }) => void): void;
}
export interface ChromeTranslatorInstance {
translate(input: string): Promise<string>;
destroy?(): void;
}
export interface ChromeTranslatorFactory {
availability(opts: {
sourceLanguage: string;
targetLanguage: string;
}): Promise<TranslateAvailability>;
create(opts: {
sourceLanguage: string;
targetLanguage: string;
monitor?: (m: CreateMonitor) => void;
}): Promise<ChromeTranslatorInstance>;
}
export interface ChromeDetectorResult {
detectedLanguage: string;
confidence: number;
}
export interface ChromeLanguageDetectorInstance {
detect(input: string): Promise<ChromeDetectorResult[]>;
destroy?(): void;
}
export interface ChromeLanguageDetectorFactory {
create(opts?: { monitor?: (m: CreateMonitor) => void }): Promise<ChromeLanguageDetectorInstance>;
}
declare global {
// eslint-disable-next-line vars-on-top
var Translator: ChromeTranslatorFactory | undefined;
// eslint-disable-next-line vars-on-top
var LanguageDetector: ChromeLanguageDetectorFactory | undefined;
}