1
0
mirror of https://github.com/elk-zone/elk synced 2024-12-01 00:08:11 +09:00
elk/modules/emoji-mart-translation.ts
Cesar Gomez 0fdbb17591
feat(i18n): Emojimart localization and fetching entry at en … (#1731)
Co-authored-by: userquin <userquin@gmail.com>
2023-02-15 20:15:11 +01:00

64 lines
1.9 KiB
TypeScript

import fs from 'fs-extra'
import { createResolver, defineNuxtModule } from '@nuxt/kit'
import { i18n } from '../config/i18n'
import type { LocaleObject } from '#i18n'
const virtual = 'virtual:emoji-mart-lang-importer'
const resolvedVirtual = `\0${virtual}.mjs`
export default defineNuxtModule({
meta: {
name: 'emoji-mark-translation',
},
setup(_, nuxt) {
const resolver = createResolver(import.meta.url)
nuxt.hook('vite:extendConfig', async (viteInlineConfig) => {
viteInlineConfig.plugins = viteInlineConfig.plugins || []
viteInlineConfig.plugins.push({
name: 'vite-emoji-mart-translation',
enforce: 'pre',
resolveId(id) {
if (id === virtual)
return resolvedVirtual
},
async load(id) {
if (id === resolvedVirtual) {
const locales = await Promise.all(
Array
.from(new Set((i18n.locales as LocaleObject[]).map(l => l.code.split('-')[0])))
.map(async (l) => {
const exists = await isFile(resolver.resolve(`../node_modules/@emoji-mart/data/i18n/${l}.json`))
return [l, exists] as [code: string, exists: boolean]
}))
.then(l => l.filter(l => l[1]).map(l => l[0]))
const switchStmt = locales.filter(l => l[1]).map((l) => {
return `
case "${l}":
return import("@emoji-mart/data/i18n/${l}.json").catch(() => {});`
})
return `export default function(lang) {
switch(lang) {
${switchStmt.join('')}
default:
return import("@emoji-mart/data/i18n/en.json").catch(() => {});
}
}
`
}
},
})
})
},
})
async function isFile(path: string) {
return new Promise<boolean>((resolve) => {
fs.lstat(path, (err, stats) => {
if (err)
resolve(false)
else
resolve(stats.isFile())
})
})
}