add isSupportedLanguage

This commit is contained in:
Lhcfl 2024-03-24 11:00:49 +08:00
parent 17a42f015a
commit 95da62680a
3 changed files with 108 additions and 29 deletions

View file

@ -329,6 +329,7 @@ import XCheatSheet from "@/components/MkCheatSheetDialog.vue";
import preprocess from "@/scripts/preprocess";
import { vibrate } from "@/scripts/vibrate";
import { langmap } from "@/scripts/langmap";
import { isSupportedLang, isSameLanguage, languageContains, parentLanguage } from "@/scripts/language-utils";
import type { MenuItem } from "@/types/menu";
import detectLanguage from "@/scripts/detect-language";
import icon from "@/scripts/icon";
@ -1011,35 +1012,7 @@ function deleteDraft() {
localStorage.setItem("drafts", JSON.stringify(draftData));
}
/**
* Compare two language codes to determine whether they are decisively different
* @returns false if they are close enough
*/
function isSameLanguage(langCode1: string | null, langCode2: string | null) {
return (
languageContains(langCode1, langCode2) ||
languageContains(langCode2, langCode1)
);
}
/**
* Returns true if langCode1 contains langCode2
*/
function languageContains(langCode1: string | null, langCode2: string | null) {
if (!langCode1 || !langCode2) return false;
if (
langCode1 === "zh" &&
["zh-hant", "zh-hans", "yue", "nan"].includes(langCode2)
) {
return true;
}
if (langCode1 === "no" && ["nb", "nn"].includes(langCode2)) {
return true;
}
return false;
}
async function post() {
// For text that is too short, the false positive rate may be too high, so we don't show alarm.
@ -1054,7 +1027,8 @@ async function post() {
if (
currentLanguageName &&
detectedLanguageName &&
!isSameLanguage(detectedLanguage, language.value)
!isSameLanguage(detectedLanguage, language.value) &&
isSupportedLang(parentLanguage(language.value))
) {
// "canceled" means "post with detected language".
const { canceled } = await os.confirm({

View file

@ -380,3 +380,71 @@ export const iso639Regional = {
};
export const langmap = Object.assign({}, langmapNoRegion, iso639Regional);
/**
* @see https://github.com/komodojp/tinyld/blob/develop/docs/langs.md
*/
export const supportedLangs: Record<string, boolean> = {
af: true, afr: true,
am: true, amh: true,
ber: true,
rn: true, run: true,
my: true, mya: true,
id: true, ind: true,
km: true, khm: true,
tl: true, tgl: true,
th: true, tha: true,
vi: true, vie: true,
zh: true, cmn: true,
ja: true, jpn: true,
ko: true, kor: true,
bn: true, ben: true,
gu: true, guj: true,
hi: true, hin: true,
kn: true, kan: true,
ta: true, tam: true,
te: true, tel: true,
ur: true, urd: true,
cs: true, ces: true,
el: true, ell: true,
la: true, lat: true,
mk: true, mkd: true,
sr: true, srp: true,
sk: true, slk: true,
be: true, bel: true,
bg: true, bul: true,
et: true, est: true,
hu: true, hun: true,
lv: true, lvs: true,
lt: true, lit: true,
pl: true, pol: true,
ro: true, ron: true,
ru: true, rus: true,
uk: true, ukr: true,
da: true, dan: true,
fi: true, fin: true,
is: true, isl: true,
no: true, nob: true,
sv: true, swe: true,
nl: true, nld: true,
en: true, eng: true,
fr: true, fra: true,
de: true, deu: true,
ga: true, gle: true,
it: true, ita: true,
pt: true, por: true,
es: true, spa: true,
ar: true, ara: true,
hy: true, hye: true,
he: true, heb: true,
kk: true, kaz: true,
mn: true, mon: true,
fa: true, pes: true,
tt: true, tat: true,
tr: true, tur: true,
tk: true, tuk: true,
yi: true, yid: true,
eo: true, epo: true,
tlh: true,
vo: true, vol: true,
}

View file

@ -0,0 +1,37 @@
import { supportedLangs } from "@/scripts/langmap"
export function isSupportedLang(langCode: string | null) {
if (!langCode) return false;
return supportedLangs[langCode] ?? false;
}
/**
* Compare two language codes to determine whether they are decisively different
* @returns false if they are close enough
*/
export function isSameLanguage(langCode1: string | null, langCode2: string | null) {
return (
languageContains(langCode1, langCode2) ||
languageContains(langCode2, langCode1)
);
}
/**
* Returns true if langCode1 contains langCode2
*/
export function languageContains(langCode1: string | null, langCode2: string | null) {
if (!langCode1 || !langCode2) return false;
return parentLanguage(langCode2) === langCode1;
}
export function parentLanguage(langCode: string | null) {
if (!langCode) return null;
if (["zh-hant", "zh-hans", "yue", "nan"].includes(langCode)) {
return "zh";
}
if (["nb", "nn"].includes(langCode)) {
return "no";
}
return langCode;
}