fix: make OCR portable and reliable across AMD64 and ARM64 (#519)

* fix: make OCR portable and reliable

* fix: harden OCR installation portability

* fix: pin OCR partials across downloads

* fix: make OCR execution reliably asynchronous

* fix: harden OCR portability and docs routes

* fix: preserve decoder and docs safeguards
This commit is contained in:
SnapOtter
2026-07-15 03:34:24 +08:00
committed by GitHub
parent 58121f205f
commit 991c981529
409 changed files with 67151 additions and 8076 deletions
+36 -6
View File
@@ -8,6 +8,10 @@ export interface FeatureBundleInfo {
export type FeatureStatus = "not_installed" | "queued" | "installing" | "installed" | "error";
export type FeatureCompatibility = "compatible" | "incompatible" | "invalid";
export type OcrQualityTier = "fast" | "balanced" | "best";
export interface FeatureBundleState {
id: string;
name: string;
@@ -16,12 +20,21 @@ export interface FeatureBundleState {
installedVersion: string | null;
estimatedSize: string;
// Real download / on-disk sizes for THIS host's architecture, read from the
// bundle manifest. amd64 hosts pull the CUDA-inclusive archive whether or not
// a GPU is present, so these can be much larger than the coarse estimatedSize
// label suggests. Optional/nullable: absent in native (non-Docker) mode and
// bundle manifest. Legacy amd64 bundles are CUDA-inclusive whether or not a
// GPU is present; portable v3 runtimes such as OCR report their selected CPU
// target instead. Optional/nullable: absent in native (non-Docker) mode and
// when the manifest lacks the value (extractedSize is 0 for some archives).
downloadBytes?: number | null;
installedBytes?: number | null;
/** Host/runtime compatibility metadata for optional portable runtimes. */
compatibility?: FeatureCompatibility;
compatibilityReason?: string | null;
selectedTarget?: string | null;
missingDownloadBytes?: number | null;
healthyGeneration?: string | null;
availableQualities?: OcrQualityTier[];
requiredMemoryBytes?: number | null;
effectiveMemoryBytes?: number | null;
enablesTools: string[];
progress: { percent: number; stage: string } | null;
error: string | null;
@@ -73,8 +86,8 @@ export const FEATURE_BUNDLES: Record<string, FeatureBundleInfo> = {
ocr: {
id: "ocr",
name: "OCR",
description: "Extract text from images",
estimatedSize: "5-6 GB",
description: "Extract text from images and PDFs",
estimatedSize: "~208-234 MiB download / ~409-488 MiB installed",
enablesTools: ["ocr", "ocr-pdf"],
},
transcription: {
@@ -86,10 +99,22 @@ export const FEATURE_BUNDLES: Record<string, FeatureBundleInfo> = {
},
};
/**
* Optional feature packs that improve a tool without controlling whether the
* tool itself is available. OCR's Fast tier is built into the image, while its
* Balanced and Best tiers are provided by the separately installed OCR pack.
*/
export const TOOL_OPTIONAL_BUNDLE_MAP: Readonly<Record<string, string>> = {
ocr: "ocr",
"ocr-pdf": "ocr",
};
export const TOOL_BUNDLE_MAP: Record<string, string> = {};
for (const [bundleId, bundle] of Object.entries(FEATURE_BUNDLES)) {
for (const toolId of bundle.enablesTools) {
TOOL_BUNDLE_MAP[toolId] = bundleId;
if (!TOOL_OPTIONAL_BUNDLE_MAP[toolId]) {
TOOL_BUNDLE_MAP[toolId] = bundleId;
}
}
}
@@ -98,6 +123,11 @@ export function getBundleForTool(toolId: string): FeatureBundleInfo | null {
return bundleId ? FEATURE_BUNDLES[bundleId] : null;
}
export function getOptionalBundleForTool(toolId: string): FeatureBundleInfo | null {
const bundleId = TOOL_OPTIONAL_BUNDLE_MAP[toolId];
return bundleId ? FEATURE_BUNDLES[bundleId] : null;
}
export function getToolsForBundle(bundleId: string): string[] {
return FEATURE_BUNDLES[bundleId]?.enablesTools ?? [];
}
+10 -2
View File
@@ -1574,7 +1574,9 @@ export const ar: TranslationKeys = {
quality: "الجودة",
enhanceBeforeScanning: "تحسين قبل المسح",
enhanceHint:
"تعديل الميلان وتحسين التباين وإزالة التشويش وتكبير الصورة تلقائيًا قبل المسح لدقة أفضل.",
"يحسّن التباين المحلي قبل التعرّف. يطبّقه الوضع السريع مباشرةً؛ ويحتفظ به الوضعان المتوازن والأفضل فقط إذا حسّن التقييم المُعاير النتيجة.",
fastKoreanUnsupported:
"لا يدعم OCR السريع اللغة الكورية. ثبّت حزمة OCR الدقيقة واختر متوازن أو الأفضل.",
language: "اللغة",
autoDetect: "اكتشاف تلقائي",
extractedText: "النص المستخرج",
@@ -3539,11 +3541,17 @@ export const ar: TranslationKeys = {
uninstall: "إزالة",
installing: "جارٍ التثبيت...",
importBundle: "استيراد حزمة",
importDescription: "ارفع أرشيف حزمة .tar.gz مُصدَّر من تثبيت آخر.",
importDescription: "استورد وقت تشغيل OCR موقّعًا أو حزمة AI قديمة للاستخدام دون اتصال.",
importButton: "استيراد من ملف",
importing: "جارٍ الاستيراد...",
importSuccess: "تم استيراد الحزمة بنجاح.",
importError: "فشل استيراد الحزمة: {error}",
importType: "نوع الحزمة",
importOcr: "حزمة OCR الدقيقة",
importLegacy: "حزمة AI القديمة",
importOcrIndex: "فهرس OCR الموقّع (.json)",
importOcrArchive: "أرشيف وقت تشغيل OCR (.tar.gz)",
importLegacyArchive: "أرشيف الحزمة القديمة (.tar.gz)",
resetTitle: "إعادة تعيين بيئة AI",
resetDescription:
"يحذف كل ميزات AI المثبتة والنماذج التي تم تنزيلها، ثم يبدأ من جديد. استخدم هذا إذا كانت أدوات AI تتصرف بشكل غير متوقع بعد التحديث، وإعادة تثبيت الحزمة لا تحل المشكلة.",
+10 -2
View File
@@ -1593,7 +1593,9 @@ export const de: TranslationKeys = {
quality: "Qualität",
enhanceBeforeScanning: "Vor dem Scannen verbessern",
enhanceHint:
"Entzerrt, verbessert Kontrast, entfernt Rauschen und skaliert das Bild automatisch vor dem Scannen für bessere Genauigkeit.",
"Verbessert den lokalen Kontrast vor der Erkennung. Schnell wendet dies direkt an; Ausgewogen und Beste Qualität übernehmen die Variante nur, wenn die kalibrierte Bewertung das Ergebnis verbessert.",
fastKoreanUnsupported:
"Schnelles OCR unterstützt Koreanisch nicht. Installiere das Paket für präzises OCR und wähle Ausgewogen oder Beste Qualität.",
language: "Sprache",
autoDetect: "Automatisch erkennen",
extractedText: "Extrahierter Text",
@@ -3582,11 +3584,17 @@ export const de: TranslationKeys = {
installing: "Wird installiert...",
importBundle: "Paket importieren",
importDescription:
"Laden Sie ein .tar.gz-Paketarchiv hoch, das aus einer anderen Installation exportiert wurde.",
"Importieren Sie eine signierte OCR-Laufzeit oder ein altes AI-Paket zur Offline-Nutzung.",
importButton: "Aus Datei importieren",
importing: "Wird importiert...",
importSuccess: "Paket erfolgreich importiert.",
importError: "Paketimport fehlgeschlagen: {error}",
importType: "Pakettyp",
importOcr: "Präzises OCR-Paket",
importLegacy: "Altes AI-Paket",
importOcrIndex: "Signierter OCR-Index (.json)",
importOcrArchive: "OCR-Laufzeitarchiv (.tar.gz)",
importLegacyArchive: "Archiv des alten Pakets (.tar.gz)",
resetTitle: "AI-Umgebung zurücksetzen",
resetDescription:
"Löscht alle installierten AI-Funktionen und heruntergeladenen Modelle und beginnt anschließend neu. Verwenden Sie dies, wenn sich AI-Tools nach einem Update unerwartet verhalten und die Neuinstallation eines Pakets das Problem nicht behebt.",
+10 -2
View File
@@ -1538,7 +1538,9 @@ export const en = {
quality: "Quality",
enhanceBeforeScanning: "Enhance before scanning",
enhanceHint:
"Automatically deskews, enhances contrast, removes noise, and upscales the image before scanning for better accuracy.",
"Improves local contrast before recognition. Fast applies it directly; Balanced and Best keep it only when calibrated scoring improves the result.",
fastKoreanUnsupported:
"Fast OCR does not support Korean. Install the Accurate OCR pack and choose Balanced or Best.",
language: "Language",
autoDetect: "Auto-detect",
extractedText: "Extracted Text",
@@ -3489,11 +3491,17 @@ export const en = {
uninstall: "Uninstall",
installing: "Installing...",
importBundle: "Import Bundle",
importDescription: "Upload a .tar.gz bundle archive exported from another installation.",
importDescription: "Import a signed OCR runtime or a legacy AI bundle for offline use.",
importButton: "Import from file",
importing: "Importing...",
importSuccess: "Bundle imported successfully.",
importError: "Bundle import failed: {error}",
importType: "Bundle type",
importOcr: "Accurate OCR pack",
importLegacy: "Legacy AI bundle",
importOcrIndex: "Signed OCR index (.json)",
importOcrArchive: "OCR runtime archive (.tar.gz)",
importLegacyArchive: "Legacy bundle archive (.tar.gz)",
resetTitle: "Reset AI Environment",
resetDescription:
"Deletes every installed AI feature and downloaded model, then starts fresh. Use this if AI tools are behaving unexpectedly after an update and reinstalling a bundle doesn't fix it.",
+10 -2
View File
@@ -1575,7 +1575,9 @@ export const es: TranslationKeys = {
quality: "Calidad",
enhanceBeforeScanning: "Mejorar antes de escanear",
enhanceHint:
"Endereza, mejora el contraste, elimina el ruido y escala la imagen automáticamente antes del escaneo para mayor precisión.",
"Mejora el contraste local antes del reconocimiento. Rápido lo aplica directamente; Equilibrado y Óptimo solo conservan la variante si la puntuación calibrada mejora el resultado.",
fastKoreanUnsupported:
"El OCR rápido no admite coreano. Instala el paquete de OCR preciso y elige Equilibrado u Óptimo.",
language: "Idioma",
autoDetect: "Detección automática",
extractedText: "Texto extraído",
@@ -3560,11 +3562,17 @@ export const es: TranslationKeys = {
uninstall: "Desinstalar",
installing: "Instalando...",
importBundle: "Importar paquete",
importDescription: "Sube un archivo .tar.gz exportado desde otra instalación.",
importDescription: "Importa un entorno OCR firmado o un paquete de AI heredado sin conexión.",
importButton: "Importar desde archivo",
importing: "Importando...",
importSuccess: "Paquete importado correctamente.",
importError: "Error al importar el paquete: {error}",
importType: "Tipo de paquete",
importOcr: "Paquete de OCR preciso",
importLegacy: "Paquete de AI heredado",
importOcrIndex: "Índice de OCR firmado (.json)",
importOcrArchive: "Archivo de ejecución de OCR (.tar.gz)",
importLegacyArchive: "Archivo del paquete heredado (.tar.gz)",
resetTitle: "Restablecer entorno de AI",
resetDescription:
"Elimina todas las funciones de AI instaladas y los modelos descargados, y vuelve a empezar desde cero. Utiliza esto si las herramientas de AI se comportan de forma inesperada tras una actualización y reinstalar un paquete no soluciona el problema.",
+10 -2
View File
@@ -1600,7 +1600,9 @@ export const fr: TranslationKeys = {
quality: "Qualité",
enhanceBeforeScanning: "Améliorer avant le scan",
enhanceHint:
"Redresse, améliore le contraste, supprime le bruit et agrandit automatiquement l'image avant le scan pour une meilleure pcision.",
"Améliore le contraste local avant la reconnaissance. Rapide lapplique directement ; Équilibré et Optimal ne conservent la variante que si le score étalonné améliore le résultat.",
fastKoreanUnsupported:
"LOCR rapide ne prend pas en charge le coréen. Installez le pack dOCR précis et choisissez Équilibré ou Optimal.",
language: "Langue",
autoDetect: "Détection automatique",
extractedText: "Texte extrait",
@@ -3586,11 +3588,17 @@ export const fr: TranslationKeys = {
uninstall: "Désinstaller",
installing: "Installation...",
importBundle: "Importer un bundle",
importDescription: "Téléversez une archive .tar.gz exportée depuis une autre installation.",
importDescription: "Importez une exécution OCR signée ou un bundle AI hérité hors ligne.",
importButton: "Importer depuis un fichier",
importing: "Importation...",
importSuccess: "Bundle importé avec succès.",
importError: "Échec de l'importation du bundle : {error}",
importType: "Type de bundle",
importOcr: "Bundle OCR précis",
importLegacy: "Bundle AI hérité",
importOcrIndex: "Index OCR signé (.json)",
importOcrArchive: "Archive d'exécution OCR (.tar.gz)",
importLegacyArchive: "Archive du bundle hérité (.tar.gz)",
resetTitle: "Réinitialiser l'environnement AI",
resetDescription:
"Supprime toutes les fonctionnalités AI installées et les modèles téléchargés, puis repart de zéro. Utilisez cette option si les outils AI se comportent de manière inattendue après une mise à jour et que la réinstallation d'un bundle ne résout pas le problème.",
+10 -2
View File
@@ -1404,7 +1404,9 @@ export const hi: TranslationKeys = {
quality: "क्वालिटी",
enhanceBeforeScanning: "स्कैन से पहले एन्हांस करें",
enhanceHint:
"बेहतर सटीकता के लिए स्कैन करने से पहले ऑटोमैटिकली तिरछापन ठीक करता है, कंट्रास्ट बढ़ाता है, नॉइज़ हटाता है और इमेज बड़ी करता है।",
"पहचान से पहले स्थानीय कॉन्ट्रास्ट सुधारता है। तेज़ मोड इसे सीधे लागू करता है; संतुलित और सर्वोत्तम मोड इसे तभी रखते हैं जब कैलिब्रेटेड स्कोर परिणाम सुधारता है।",
fastKoreanUnsupported:
"तेज़ OCR कोरियाई का समर्थन नहीं करता। सटीक OCR पैक इंस्टॉल करें और संतुलित या सर्वोत्तम चुनें।",
language: "भाषा",
autoDetect: "ऑटो-डिटेक्ट",
extractedText: "निकाला गया टेक्स्ट",
@@ -3366,11 +3368,17 @@ export const hi: TranslationKeys = {
uninstall: "अनइंस्टॉल करें",
installing: "इंस्टॉल हो रहा है...",
importBundle: "बंडल आयात करें",
importDescription: "किसी अन्य इंस्टॉलेशन से निर्यात की गई .tar.gz बंडल फ़ाइल अपलोड करें।",
importDescription: "ऑफ़लाइन उपयोग के लिए हस्ताक्षरित OCR रनटाइम या पुराना AI बंडल आयात करें।",
importButton: "फ़ाइल से आयात करें",
importing: "आयात हो रहा है...",
importSuccess: "बंडल सफलतापूर्वक आयात किया गया।",
importError: "बंडल आयात विफल: {error}",
importType: "बंडल प्रकार",
importOcr: "सटीक OCR पैक",
importLegacy: "पुराना AI बंडल",
importOcrIndex: "हस्ताक्षरित OCR इंडेक्स (.json)",
importOcrArchive: "OCR रनटाइम आर्काइव (.tar.gz)",
importLegacyArchive: "पुराना बंडल आर्काइव (.tar.gz)",
resetTitle: "AI परिवेश रीसेट करें",
resetDescription:
"सभी इंस्टॉल की गई AI सुविधाएं और डाउनलोड किए गए मॉडल हटा देता है, फिर नए सिरे से शुरुआत करता है। इसका उपयोग तब करें जब अपडेट के बाद AI टूल असामान्य व्यवहार करें और बंडल को फिर से इंस्टॉल करने से समस्या ठीक न हो।",
+11 -2
View File
@@ -1585,7 +1585,9 @@ export const id: TranslationKeys = {
quality: "Kualitas",
enhanceBeforeScanning: "Tingkatkan sebelum pemindaian",
enhanceHint:
"Secara otomatis meluruskan, meningkatkan kontras, menghapus noise, dan memperbesar gambar sebelum pemindaian untuk akurasi yang lebih baik.",
"Memperbaiki kontras lokal sebelum pengenalan. Cepat menerapkannya langsung; Seimbang dan Terbaik hanya mempertahankannya jika skor terkalibrasi memperbaiki hasil.",
fastKoreanUnsupported:
"OCR Cepat tidak mendukung bahasa Korea. Instal paket OCR Akurat lalu pilih Seimbang atau Terbaik.",
language: "Bahasa",
autoDetect: "Deteksi otomatis",
extractedText: "Teks yang Diekstrak",
@@ -3561,11 +3563,18 @@ export const id: TranslationKeys = {
uninstall: "Hapus",
installing: "Menginstal...",
importBundle: "Impor Bundel",
importDescription: "Unggah arsip bundel .tar.gz yang diekspor dari instalasi lain.",
importDescription:
"Impor runtime OCR bertanda tangan atau bundel AI lama untuk penggunaan luring.",
importButton: "Impor dari file",
importing: "Mengimpor...",
importSuccess: "Bundel berhasil diimpor.",
importError: "Impor bundel gagal: {error}",
importType: "Jenis bundel",
importOcr: "Paket OCR akurat",
importLegacy: "Bundel AI lama",
importOcrIndex: "Indeks OCR bertanda tangan (.json)",
importOcrArchive: "Arsip runtime OCR (.tar.gz)",
importLegacyArchive: "Arsip bundel lama (.tar.gz)",
resetTitle: "Reset Lingkungan AI",
resetDescription:
"Menghapus semua fitur AI yang terinstal dan model yang telah diunduh, lalu memulai dari awal. Gunakan ini jika alat AI berperilaku tidak semestinya setelah pembaruan dan menginstal ulang bundel tidak menyelesaikan masalah.",
+10 -2
View File
@@ -1590,7 +1590,9 @@ export const it: TranslationKeys = {
quality: "Qualità",
enhanceBeforeScanning: "Migliora prima della scansione",
enhanceHint:
"Raddrizza, migliora il contrasto, rimuove il rumore e ingrandisce automaticamente l'immagine prima della scansione per una migliore precisione.",
"Migliora il contrasto locale prima del riconoscimento. Veloce lo applica direttamente; Bilanciata e Migliore conservano la variante solo se il punteggio calibrato migliora il risultato.",
fastKoreanUnsupported:
"LOCR veloce non supporta il coreano. Installa il pacchetto OCR accurato e scegli Bilanciata o Migliore.",
language: "Lingua",
autoDetect: "Rilevamento automatico",
extractedText: "Testo estratto",
@@ -3574,11 +3576,17 @@ export const it: TranslationKeys = {
uninstall: "Disinstalla",
installing: "Installazione...",
importBundle: "Importa bundle",
importDescription: "Carica un archivio .tar.gz esportato da un'altra installazione.",
importDescription: "Importa un runtime OCR firmato o un bundle AI legacy per l'uso offline.",
importButton: "Importa da file",
importing: "Importazione in corso...",
importSuccess: "Bundle importato correttamente.",
importError: "Importazione del bundle non riuscita: {error}",
importType: "Tipo di bundle",
importOcr: "Pacchetto OCR accurato",
importLegacy: "Bundle AI legacy",
importOcrIndex: "Indice OCR firmato (.json)",
importOcrArchive: "Archivio runtime OCR (.tar.gz)",
importLegacyArchive: "Archivio bundle legacy (.tar.gz)",
resetTitle: "Ripristina ambiente IA",
resetDescription:
"Elimina tutte le funzionalità IA installate e i modelli scaricati, quindi riparte da zero. Usa questa opzione se gli strumenti IA si comportano in modo anomalo dopo un aggiornamento e la reinstallazione di un bundle non risolve il problema.",
+10 -2
View File
@@ -1546,7 +1546,9 @@ export const ja: TranslationKeys = {
quality: "品質",
enhanceBeforeScanning: "スキャン前にエンハンス",
enhanceHint:
"スキャン前に自動で傾き補正、コントラスト強化、ノイズ除去、アップスケールを行い、認識精度を向上させます。",
"認識前に局所コントラストを改善します。高速では直接適用し、バランスと最高では調整済みスコアで結果が改善する場合のみ採用します。",
fastKoreanUnsupported:
"高速 OCR は韓国語に対応していません。高精度 OCR パックをインストールし、バランスまたは最高を選択してください。",
language: "言語",
autoDetect: "自動検出",
extractedText: "抽出テキスト",
@@ -3514,11 +3516,17 @@ export const ja: TranslationKeys = {
installing: "インストール中...",
importBundle: "バンドルをインポート",
importDescription:
"他のインストールからエクスポートした .tar.gz バンドルアーカイブをアップロードします。",
"オフライン用の署名済みOCRランタイムまたは従来のAIバンドルをインポートします。",
importButton: "ファイルからインポート",
importing: "インポート中...",
importSuccess: "バンドルのインポートに成功しました。",
importError: "バンドルのインポートに失敗しました: {error}",
importType: "バンドルの種類",
importOcr: "高精度OCRパック",
importLegacy: "従来のAIバンドル",
importOcrIndex: "署名済みOCRインデックス (.json)",
importOcrArchive: "OCRランタイムアーカイブ (.tar.gz)",
importLegacyArchive: "従来のバンドルアーカイブ (.tar.gz)",
resetTitle: "AI環境をリセット",
resetDescription:
"インストール済みのAI機能とダウンロード済みのモデルをすべて削除し、まっさらな状態からやり直します。アップデート後にAIツールの動作がおかしくなり、バンドルを再インストールしても直らない場合に使用してください。",
+10 -2
View File
@@ -1528,7 +1528,9 @@ export const ko: TranslationKeys = {
quality: "품질",
enhanceBeforeScanning: "스캔 전 향상",
enhanceHint:
"스캔 전에 자동으로 기울기 보정, 대비 향상, 노이즈 제거, 업스케일을 수행하여 인식 정확도를 높입니다.",
"인식 전에 국소 대비를 개선합니다. 빠름은 직접 적용하고, 균형 및 최고는 보정된 점수가 결과를 개선할 때만 해당 버전을 사용합니다.",
fastKoreanUnsupported:
"빠른 OCR은 한국어를 지원하지 않습니다. 정확한 OCR 팩을 설치하고 균형 또는 최고를 선택하세요.",
language: "언어",
autoDetect: "자동 감지",
extractedText: "추출된 텍스트",
@@ -3494,11 +3496,17 @@ export const ko: TranslationKeys = {
uninstall: "제거",
installing: "설치 중...",
importBundle: "번들 가져오기",
importDescription: "다른 설치에서 내보낸 .tar.gz 번들 아카이브를 업로드합니다.",
importDescription: "오프라인용 서명된 OCR 런타임 또는 레거시 AI 번들을 가져옵니다.",
importButton: "파일에서 가져오기",
importing: "가져오는 중...",
importSuccess: "번들을 가져왔습니다.",
importError: "번들 가져오기 실패: {error}",
importType: "번들 유형",
importOcr: "고정밀 OCR 팩",
importLegacy: "레거시 AI 번들",
importOcrIndex: "서명된 OCR 인덱스 (.json)",
importOcrArchive: "OCR 런타임 아카이브 (.tar.gz)",
importLegacyArchive: "레거시 번들 아카이브 (.tar.gz)",
resetTitle: "AI 환경 재설정",
resetDescription:
"설치된 모든 AI 기능과 다운로드한 모델을 삭제한 후 처음부터 다시 시작합니다. 업데이트 후 AI 도구가 예상치 못하게 동작하고 번들을 다시 설치해도 문제가 해결되지 않을 때 사용하세요.",
+10 -2
View File
@@ -1590,7 +1590,9 @@ export const nl: TranslationKeys = {
quality: "Kwaliteit",
enhanceBeforeScanning: "Verbeteren voor het scannen",
enhanceHint:
"Corrigeert scheefstand, verbetert contrast, verwijdert ruis en schaalt de afbeelding automatisch op voor betere nauwkeurigheid.",
"Verbetert lokaal contrast vóór herkenning. Snel past dit direct toe; Gebalanceerd en Beste behouden de variant alleen als de gekalibreerde score het resultaat verbetert.",
fastKoreanUnsupported:
"Snelle OCR ondersteunt geen Koreaans. Installeer het pakket voor nauwkeurige OCR en kies Gebalanceerd of Beste.",
language: "Taal",
autoDetect: "Automatisch detecteren",
extractedText: "Geextraheerde tekst",
@@ -3570,11 +3572,17 @@ export const nl: TranslationKeys = {
installing: "Installeren...",
importBundle: "Bundel importeren",
importDescription:
"Upload een .tar.gz-bundelarchief geëxporteerd vanuit een andere installatie.",
"Importeer een ondertekende OCR-runtime of oude AI-bundel voor offlinegebruik.",
importButton: "Importeren uit bestand",
importing: "Importeren...",
importSuccess: "Bundel succesvol geïmporteerd.",
importError: "Bundel importeren mislukt: {error}",
importType: "Bundeltype",
importOcr: "Nauwkeurig OCR-pakket",
importLegacy: "Oude AI-bundel",
importOcrIndex: "Ondertekende OCR-index (.json)",
importOcrArchive: "OCR-runtimearchief (.tar.gz)",
importLegacyArchive: "Archief van oude bundel (.tar.gz)",
resetTitle: "AI-omgeving resetten",
resetDescription:
"Verwijdert alle geïnstalleerde AI-functies en gedownloade modellen, en begint daarna helemaal opnieuw. Gebruik dit als AI-tools zich na een update onverwacht gedragen en het opnieuw installeren van een bundel het probleem niet oplost.",
+11 -2
View File
@@ -1589,7 +1589,9 @@ export const pl: TranslationKeys = {
quality: "Jakość",
enhanceBeforeScanning: "Ulepsz przed skanowaniem",
enhanceHint:
"Automatycznie prostuje, poprawia kontrast, usuwa szum i powiększa obraz przed skanowaniem w celu lepszej dokładności.",
"Poprawia lokalny kontrast przed rozpoznawaniem. Tryb Szybki stosuje go bezpośrednio; Zrównoważony i Najlepszy zachowują wariant tylko wtedy, gdy skalibrowany wynik poprawia rezultat.",
fastKoreanUnsupported:
"Szybki OCR nie obsługuje języka koreańskiego. Zainstaluj pakiet dokładnego OCR i wybierz Zrównoważony lub Najlepszy.",
language: "Język",
autoDetect: "Automatyczne wykrywanie",
extractedText: "Wyodrębniony tekst",
@@ -3573,11 +3575,18 @@ export const pl: TranslationKeys = {
uninstall: "Odinstaluj",
installing: "Instalowanie...",
importBundle: "Importuj pakiet",
importDescription: "Prześlij archiwum .tar.gz wyeksportowane z innej instalacji.",
importDescription:
"Zaimportuj podpisane środowisko OCR lub starszy pakiet AI do użycia offline.",
importButton: "Importuj z pliku",
importing: "Importowanie...",
importSuccess: "Pakiet zaimportowany pomyślnie.",
importError: "Import pakietu nie powiódł się: {error}",
importType: "Typ pakietu",
importOcr: "Dokładny pakiet OCR",
importLegacy: "Starszy pakiet AI",
importOcrIndex: "Podpisany indeks OCR (.json)",
importOcrArchive: "Archiwum środowiska OCR (.tar.gz)",
importLegacyArchive: "Archiwum starszego pakietu (.tar.gz)",
resetTitle: "Zresetuj środowisko AI",
resetDescription:
"Usuwa wszystkie zainstalowane funkcje AI i pobrane modele, a następnie zaczyna od nowa. Użyj tej opcji, jeśli narzędzia AI zachowują się nieprawidłowo po aktualizacji, a ponowna instalacja pakietu nie rozwiązuje problemu.",
+11 -2
View File
@@ -1587,7 +1587,9 @@ export const ptBR: TranslationKeys = {
quality: "Qualidade",
enhanceBeforeScanning: "Melhorar antes da varredura",
enhanceHint:
"Endireita, melhora o contraste, remove ruído e amplia a imagem automaticamente antes da varredura para maior precisão.",
"Melhora o contraste local antes do reconhecimento. Rápido aplica diretamente; Equilibrado e Melhor só mantêm a variante quando a pontuação calibrada melhora o resultado.",
fastKoreanUnsupported:
"O OCR rápido não oferece suporte a coreano. Instale o pacote de OCR preciso e escolha Equilibrado ou Melhor.",
language: "Idioma",
autoDetect: "Detecção automática",
extractedText: "Texto extraído",
@@ -3566,11 +3568,18 @@ export const ptBR: TranslationKeys = {
uninstall: "Desinstalar",
installing: "Instalando...",
importBundle: "Importar pacote",
importDescription: "Envie um arquivo .tar.gz exportado de outra instalação.",
importDescription:
"Importe um ambiente OCR assinado ou pacote de AI legado para uso offline.",
importButton: "Importar de arquivo",
importing: "Importando...",
importSuccess: "Pacote importado com sucesso.",
importError: "Falha ao importar pacote: {error}",
importType: "Tipo de pacote",
importOcr: "Pacote de OCR preciso",
importLegacy: "Pacote de AI legado",
importOcrIndex: "Índice de OCR assinado (.json)",
importOcrArchive: "Arquivo de execução do OCR (.tar.gz)",
importLegacyArchive: "Arquivo do pacote legado (.tar.gz)",
resetTitle: "Redefinir ambiente de AI",
resetDescription:
"Exclui todos os recursos de AI instalados e os modelos baixados, e recomeça do zero. Use isso se as ferramentas de AI estiverem se comportando de forma inesperada após uma atualização e a reinstalação de um pacote não resolver o problema.",
+11 -2
View File
@@ -1584,7 +1584,9 @@ export const ru: TranslationKeys = {
quality: "Качество",
enhanceBeforeScanning: "Улучшить перед сканированием",
enhanceHint:
"Автоматическое выравнивание, улучшение контраста, удаление шума и увеличение масштаба изображения перед сканированием для лучшей точности.",
"Улучшает локальный контраст перед распознаванием. Быстрый режим применяет его сразу; Сбалансированный и Лучший сохраняют вариант только при улучшении калиброванной оценки.",
fastKoreanUnsupported:
"Быстрый OCR не поддерживает корейский язык. Установите пакет точного OCR и выберите «Сбалансированный» или «Лучший».",
language: "Язык",
autoDetect: "Автоопределение",
extractedText: "Извлечённый текст",
@@ -3563,11 +3565,18 @@ export const ru: TranslationKeys = {
uninstall: "Удалить",
installing: "Установка...",
importBundle: "Импорт пакета",
importDescription: "Загрузите архив .tar.gz, экспортированный из другой установки.",
importDescription:
"Импортируйте подписанную среду OCR или устаревший пакет AI для офлайн-работы.",
importButton: "Импорт из файла",
importing: "Импорт...",
importSuccess: "Пакет успешно импортирован.",
importError: "Ошибка импорта пакета: {error}",
importType: "Тип пакета",
importOcr: "Пакет точного OCR",
importLegacy: "Устаревший пакет AI",
importOcrIndex: "Подписанный индекс OCR (.json)",
importOcrArchive: "Архив среды OCR (.tar.gz)",
importLegacyArchive: "Архив устаревшего пакета (.tar.gz)",
resetTitle: "Сбросить AI-среду",
resetDescription:
"Удаляет все установленные AI-функции и загруженные модели, а затем начинает заново. Используйте это, если AI-инструменты ведут себя непредсказуемо после обновления, а переустановка пакета не решает проблему.",
+11 -2
View File
@@ -1584,7 +1584,9 @@ export const sv: TranslationKeys = {
quality: "Kvalitet",
enhanceBeforeScanning: "Förstärkt före skanning",
enhanceHint:
"Korrigerar automatiskt skevhet, förstärker kontrast, tar bort brus och uppskalar bilden före skanning för bättre precision.",
"Förbättrar lokal kontrast före igenkänning. Snabb använder den direkt; Balanserad och Bäst behåller varianten bara när den kalibrerade poängen förbättrar resultatet.",
fastKoreanUnsupported:
"Snabb OCR stöder inte koreanska. Installera paketet för exakt OCR och välj Balanserad eller Bäst.",
language: "Språk",
autoDetect: "Automatisk detektion",
extractedText: "Extraherad text",
@@ -3559,11 +3561,18 @@ export const sv: TranslationKeys = {
uninstall: "Avinstallera",
installing: "Installerar...",
importBundle: "Importera paket",
importDescription: "Ladda upp ett .tar.gz-paketarkiv exporterat från en annan installation.",
importDescription:
"Importera en signerad OCR-körning eller ett äldre AI-paket för offlinebruk.",
importButton: "Importera från fil",
importing: "Importerar...",
importSuccess: "Paket importerat.",
importError: "Paketimport misslyckades: {error}",
importType: "Pakettyp",
importOcr: "Exakt OCR-paket",
importLegacy: "Äldre AI-paket",
importOcrIndex: "Signerat OCR-index (.json)",
importOcrArchive: "OCR-körningsarkiv (.tar.gz)",
importLegacyArchive: "Arkiv för äldre paket (.tar.gz)",
resetTitle: "Återställ AI-miljö",
resetDescription:
"Tar bort alla installerade AI-funktioner och nedladdade modeller, och börjar sedan om från grunden. Använd det här om AI-verktyg beter sig oväntat efter en uppdatering och det inte hjälper att installera om ett paket.",
+10 -2
View File
@@ -1563,7 +1563,9 @@ export const th: TranslationKeys = {
ocr: {
quality: "คุณภาพ",
enhanceBeforeScanning: "ปรับปรุงก่อนสแกน",
enhanceHint: "ปรับเอียง เพิ่มคอนทราสต์ ลดสัญญาณรบกวน และขยายภาพอัตโนมัติก่อนสแกนเพื่อความแม่นยำที่ดีขึ้น",
enhanceHint:
"ปรับคอนทราสต์เฉพาะจุดก่อนการรู้จำ แบบเร็วจะใช้โดยตรง ส่วนแบบสมดุลและดีที่สุดจะเก็บไว้เฉพาะเมื่อคะแนนที่ปรับเทียบแล้วทำให้ผลลัพธ์ดีขึ้น",
fastKoreanUnsupported: "OCR แบบเร็วไม่รองรับภาษาเกาหลี ติดตั้งแพ็ก OCR แบบแม่นยำแล้วเลือกสมดุลหรือดีที่สุด",
language: "ภาษา",
autoDetect: "ตรวจจับอัตโนมัติ",
extractedText: "ข้อความที่แยกได้",
@@ -3519,11 +3521,17 @@ export const th: TranslationKeys = {
uninstall: "ถอนการติดตั้ง",
installing: "กำลังติดตั้ง...",
importBundle: "นำเข้าชุดข้อมูล",
importDescription: "อัปโหลดไฟล์ .tar.gz ที่ส่งออกจากการติดตั้งอื่น",
importDescription: "นำเข้ารันไทม์ OCR ที่ลงนามแล้วหรือชุดข้อมูล AI แบบเดิมเพื่อใช้งานออฟไลน์",
importButton: "นำเข้าจากไฟล์",
importing: "กำลังนำเข้า...",
importSuccess: "นำเข้าชุดข้อมูลสำเร็จ",
importError: "นำเข้าชุดข้อมูลไม่สำเร็จ: {error}",
importType: "ประเภทชุดข้อมูล",
importOcr: "แพ็ก OCR ความแม่นยำสูง",
importLegacy: "ชุดข้อมูล AI แบบเดิม",
importOcrIndex: "ดัชนี OCR ที่ลงนามแล้ว (.json)",
importOcrArchive: "ไฟล์รันไทม์ OCR (.tar.gz)",
importLegacyArchive: "ไฟล์ชุดข้อมูลแบบเดิม (.tar.gz)",
resetTitle: "รีเซ็ตสภาพแวดล้อม AI",
resetDescription:
"ลบฟีเจอร์ AI ที่ติดตั้งไว้ทั้งหมดและโมเดลที่ดาวน์โหลดไว้ แล้วเริ่มต้นใหม่ทั้งหมด ใช้ตัวเลือกนี้หากเครื่องมือ AI ทำงานผิดปกติหลังการอัปเดต และการติดตั้งชุดข้อมูลใหม่ไม่ช่วยแก้ปัญหา",
+11 -2
View File
@@ -1589,7 +1589,9 @@ export const tr: TranslationKeys = {
quality: "Kalite",
enhanceBeforeScanning: "Taramadan önce iyileştir",
enhanceHint:
"Daha iyi doğruluk için taramadan önce otomatik olarak eğrilik düzeltir, kontrastı artırır, gürültüyü kaldırır ve görüntüyü büyütür.",
"Tanımadan önce yerel kontrastı iyileştirir. Hızlı doğrudan uygular; Dengeli ve En İyi yalnızca kalibre edilmiş puan sonucu iyileştirirse bu varyantı kullanır.",
fastKoreanUnsupported:
"Hızlı OCR Koreceyi desteklemez. Doğru OCR paketini yükleyip Dengeli veya En İyi seçeneğini seçin.",
language: "Dil",
autoDetect: "Otomatik algıla",
extractedText: "Çıkarılan Metin",
@@ -3567,11 +3569,18 @@ export const tr: TranslationKeys = {
uninstall: "Kaldır",
installing: "Kuruluyor...",
importBundle: "Paket İçe Aktar",
importDescription: "Başka bir kurulumdan dışa aktarılan .tar.gz paket arşivini yükleyin.",
importDescription:
"Çevrimdışı kullanım için imzalı OCR çalışma zamanı veya eski AI paketi içe aktarın.",
importButton: "Dosyadan içe aktar",
importing: "İçe aktarılıyor...",
importSuccess: "Paket başarıyla içe aktarıldı.",
importError: "Paket içe aktarılamadı: {error}",
importType: "Paket türü",
importOcr: "Hassas OCR paketi",
importLegacy: "Eski AI paketi",
importOcrIndex: "İmzalı OCR dizini (.json)",
importOcrArchive: "OCR çalışma zamanı arşivi (.tar.gz)",
importLegacyArchive: "Eski paket arşivi (.tar.gz)",
resetTitle: "AI Ortamını Sıfırla",
resetDescription:
"Kurulu tüm AI özelliklerini ve indirilen modelleri siler, ardından sıfırdan başlar. Bir güncellemeden sonra AI araçları beklenmedik şekilde davranıyorsa ve paketi yeniden kurmak sorunu çözmüyorsa bunu kullanın.",
+11 -2
View File
@@ -1587,7 +1587,9 @@ export const uk: TranslationKeys = {
quality: "Якість",
enhanceBeforeScanning: "Поліпшити перед скануванням",
enhanceHint:
"Автоматичне вирівнювання, поліпшення контрасту, видалення шуму та збільшення зображення перед скануванням для кращої точності.",
"Покращує локальний контраст перед розпізнаванням. Швидкий режим застосовує його одразу; Збалансований і Найкращий зберігають варіант лише за покращення каліброваної оцінки.",
fastKoreanUnsupported:
"Швидкий OCR не підтримує корейську мову. Установіть пакет точного OCR і виберіть «Збалансований» або «Найкращий».",
language: "Мова",
autoDetect: "Автовизначення",
extractedText: "Витягнутий текст",
@@ -3563,11 +3565,18 @@ export const uk: TranslationKeys = {
uninstall: "Видалити",
installing: "Встановлення...",
importBundle: "Імпортувати пакет",
importDescription: "Завантажте архів пакету .tar.gz, експортований з іншої інсталяції.",
importDescription:
"Імпортуйте підписане середовище OCR або застарілий пакет AI для офлайн-роботи.",
importButton: "Імпортувати з файлу",
importing: "Імпортування...",
importSuccess: "Пакет успішно імпортовано.",
importError: "Не вдалося імпортувати пакет: {error}",
importType: "Тип пакета",
importOcr: "Пакет точного OCR",
importLegacy: "Застарілий пакет AI",
importOcrIndex: "Підписаний індекс OCR (.json)",
importOcrArchive: "Архів середовища OCR (.tar.gz)",
importLegacyArchive: "Архів застарілого пакета (.tar.gz)",
resetTitle: "Скинути середовище AI",
resetDescription:
"Видаляє всі встановлені функції AI та завантажені моделі, а потім починає заново. Використовуйте це, якщо інструменти AI поводяться непередбачувано після оновлення, а перевстановлення пакета не вирішує проблему.",
+10 -2
View File
@@ -1587,7 +1587,9 @@ export const vi: TranslationKeys = {
quality: "Chất lượng",
enhanceBeforeScanning: "Nâng cao trước khi quét",
enhanceHint:
"Tự động chỉnh xoay, tăng độ tương phản, kh nhiễu và phóng to ảnh trước khi quét để có độ chính xác tốt hơn.",
"Cải thiện độ tương phản cục bộ trước khi nhận dạng. Nhanh áp dụng trực tiếp; Cân bằng và Tốt nhất chỉ giữ biến thể khi điểm đã hiệu chnh cải thiện kết quả.",
fastKoreanUnsupported:
"OCR Nhanh không hỗ trợ tiếng Hàn. Hãy cài đặt gói OCR Chính xác rồi chọn Cân bằng hoặc Tốt nhất.",
language: "Ngôn ngữ",
autoDetect: "Tự động nhận diện",
extractedText: "Văn bản trích xuất",
@@ -3559,11 +3561,17 @@ export const vi: TranslationKeys = {
uninstall: "Gỡ cài đặt",
installing: "Đang cài đặt...",
importBundle: "Nhập gói",
importDescription: "Tải lên tệp lưu trữ .tar.gz được xuất từ bản cài đặt khác.",
importDescription: "Nhập runtime OCR đã ký hoặc gói AI cũ để sử dụng ngoại tuyến.",
importButton: "Nhập từ tệp",
importing: "Đang nhập...",
importSuccess: "Đã nhập gói thành công.",
importError: "Nhập gói thất bại: {error}",
importType: "Loại gói",
importOcr: "Gói OCR chính xác",
importLegacy: "Gói AI cũ",
importOcrIndex: "Chỉ mục OCR đã ký (.json)",
importOcrArchive: "Kho lưu trữ runtime OCR (.tar.gz)",
importLegacyArchive: "Kho lưu trữ gói cũ (.tar.gz)",
resetTitle: "Đặt lại môi trường AI",
resetDescription:
"Xóa mọi tính năng AI đã cài đặt và các mô hình đã tải xuống, sau đó bắt đầu lại từ đầu. Hãy dùng tùy chọn này nếu công cụ AI hoạt động bất thường sau khi cập nhật và việc cài đặt lại gói không khắc phục được sự cố.",
+10 -2
View File
@@ -1351,7 +1351,9 @@ export const zhCN: TranslationKeys = {
ocr: {
quality: "质量",
enhanceBeforeScanning: "扫描前增强",
enhanceHint: "扫描前自动校正倾斜、增强对比度、去除噪点并放大图片,以提高识别精度。",
enhanceHint:
"识别前改善局部对比度。快速模式会直接应用;均衡和最佳模式仅在校准评分改善结果时保留该版本。",
fastKoreanUnsupported: "快速 OCR 不支持韩语。请安装精确 OCR 包,然后选择“均衡”或“最佳”。",
language: "语言",
autoDetect: "自动检测",
extractedText: "提取的文字",
@@ -3304,11 +3306,17 @@ export const zhCN: TranslationKeys = {
uninstall: "卸载",
installing: "安装中...",
importBundle: "导入包",
importDescription: "上传从其他安装导出的 .tar.gz 包存档。",
importDescription: "导入已签名的 OCR 运行时或旧版 AI 包以供离线使用。",
importButton: "从文件导入",
importing: "导入中...",
importSuccess: "包导入成功。",
importError: "包导入失败:{error}",
importType: "包类型",
importOcr: "高精度 OCR 包",
importLegacy: "旧版 AI 包",
importOcrIndex: "已签名的 OCR 索引 (.json)",
importOcrArchive: "OCR 运行时归档 (.tar.gz)",
importLegacyArchive: "旧版包归档 (.tar.gz)",
resetTitle: "重置 AI 环境",
resetDescription:
"删除所有已安装的 AI 功能和已下载的模型,然后重新开始。如果更新后 AI 工具出现异常,且重新安装包也无法解决问题,请使用此功能。",
+11 -2
View File
@@ -1351,7 +1351,10 @@ export const zhTW: TranslationKeys = {
ocr: {
quality: "品質",
enhanceBeforeScanning: "掃描前增強",
enhanceHint: "在掃描前自動進行傾斜校正、對比度增強、雜訊去除和放大處理,以提高辨識準確率。",
enhanceHint:
"辨識前改善局部對比度。快速模式會直接套用;均衡和最佳模式僅在校準評分改善結果時保留該版本。",
fastKoreanUnsupported:
"快速 OCR 不支援韓語。請安裝精確 OCR 套件,然後選擇「均衡」或「最佳」。",
language: "語言",
autoDetect: "自動偵測",
extractedText: "擷取的文字",
@@ -3303,11 +3306,17 @@ export const zhTW: TranslationKeys = {
uninstall: "解除安裝",
installing: "安裝中...",
importBundle: "匯入套件",
importDescription: "上傳從其他安裝匯出的 .tar.gz 套件封存檔。",
importDescription: "匯入已簽署的 OCR 執行階段或舊版 AI 套件以供離線使用。",
importButton: "從檔案匯入",
importing: "匯入中...",
importSuccess: "套件匯入成功。",
importError: "套件匯入失敗:{error}",
importType: "套件類型",
importOcr: "高精度 OCR 套件",
importLegacy: "舊版 AI 套件",
importOcrIndex: "已簽署的 OCR 索引 (.json)",
importOcrArchive: "OCR 執行階段封存檔 (.tar.gz)",
importLegacyArchive: "舊版套件封存檔 (.tar.gz)",
resetTitle: "重設 AI 環境",
resetDescription:
"刪除所有已安裝的 AI 功能與已下載的模型,然後重新開始。如果更新後 AI 工具出現異常,且重新安裝套件也無法解決問題,請使用此功能。",