Add Language Detector API support as a progressive enhancement

pull/3316/head
Thomas Steiner 2025-06-20 16:28:59 +02:00
rodzic b669514243
commit 18823a22ae
1 zmienionych plików z 41 dodań i 0 usunięć

Wyświetl plik

@ -1,6 +1,7 @@
<script setup lang="ts">
import type { DraftItem } from '#shared/types'
import type { mastodon } from 'masto'
import { PublishLanguagePicker } from '#components'
import { EditorContent } from '@tiptap/vue-3'
import stringLength from 'string-length'
@ -236,6 +237,45 @@ function stopQuestionMarkPropagation(e: KeyboardEvent) {
if (e.key === '?')
e.stopImmediatePropagation()
}
const languageDetectorInGlobalThis = 'LanguageDetector' in globalThis
let supportsLanguageDetector = languageDetectorInGlobalThis && await (globalThis as any).LanguageDetector.availability() === 'available'
let languageDetector: { detect: (arg0: string) => any }
// If the API is supported, but the model not loaded yet
if (languageDetectorInGlobalThis && !supportsLanguageDetector) {
// trigger the model download
(globalThis as any).LanguageDetector.create().then((_languageDetector: { detect: (arg0: string) => any }) => {
supportsLanguageDetector = true
languageDetector = _languageDetector
})
}
function countLetters(text: string) {
const segmenter = new Intl.Segmenter('und', { granularity: 'grapheme' })
const letters = [...segmenter.segment(text)]
return letters.length
}
async function detectLanguage() {
if (!supportsLanguageDetector) {
return
}
if (!languageDetector) {
languageDetector = await (globalThis as any).LanguageDetector.create()
}
const text = htmlToText(editor.value?.getHTML() || '')
if (!text || countLetters(text) <= 5) {
draft.value.params.language = preferredLanguage.value
return
}
try {
const detectedLanguage = (await languageDetector.detect(text))[0].detectedLanguage
draft.value.params.language = detectedLanguage === 'und' ? preferredLanguage.value : detectedLanguage.substring(0, 2)
}
catch {
draft.value.params.language = preferredLanguage.value
}
}
</script>
<template>
@ -310,6 +350,7 @@ function stopQuestionMarkPropagation(e: KeyboardEvent) {
}"
@keydown="stopQuestionMarkPropagation"
@keydown.esc.prevent="editor?.commands.blur()"
@keyup="detectLanguage"
/>
</div>