kopia lustrzana https://github.com/elk-zone/elk
Add Language Detector API support as a progressive enhancement
rodzic
b669514243
commit
18823a22ae
|
@ -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>
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue