···2323const cancelIdle = globalThis.cancelIdleCallback || clearTimeout
24242525export function SuggestedLanguage({text}: {text: string}) {
2626- const [suggestedLanguage, setSuggestedLanguage] = useState<string>()
2626+ const [suggestedLanguage, setSuggestedLanguage] = useState<
2727+ string | undefined
2828+ >()
2729 const langPrefs = useLanguagePrefs()
2830 const setLangPrefs = useLanguagePrefsApi()
2931 const pal = usePalette('default')
···4042 }
41434244 const idle = onIdle(() => {
4343- // Only select languages that have a high confidence and convert to code2
4444- const result = lande(textTrimmed).filter(
4545- ([lang, value]) => value >= 0.97 && code3ToCode2Strict(lang),
4646- )
4747-4848- setSuggestedLanguage(
4949- result.length > 0 ? code3ToCode2Strict(result[0][0]) : undefined,
5050- )
4545+ setSuggestedLanguage(guessLanguage(textTrimmed))
5146 })
52475348 return () => cancelIdle(idle)
···9994 marginBottom: 10,
10095 },
10196})
9797+9898+/**
9999+ * This function is using the lande language model to attempt to detect the language
100100+ * We want to only make suggestions when we feel a high degree of certainty
101101+ * The magic numbers are based on debugging sessions against some test strings
102102+ */
103103+function guessLanguage(text: string): string | undefined {
104104+ const scores = lande(text).filter(([_lang, value]) => value >= 0.0002)
105105+ // if the model has multiple items with a score higher than 0.0002, it isn't certain enough
106106+ if (scores.length !== 1) {
107107+ return undefined
108108+ }
109109+ const [lang, value] = scores[0]
110110+ // if the model doesn't give a score of 0.97 or above, it isn't certain enough
111111+ if (value < 0.97) {
112112+ return undefined
113113+ }
114114+ return code3ToCode2Strict(lang)
115115+}