feat(i18n): Emojimart localization and fetching
entry at en
… (#1731)
Co-authored-by: userquin <userquin@gmail.com>
This commit is contained in:
parent
3118ed6012
commit
0fdbb17591
11 changed files with 94 additions and 9 deletions
63
modules/emoji-mart-translation.ts
Normal file
63
modules/emoji-mart-translation.ts
Normal file
|
@ -0,0 +1,63 @@
|
|||
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())
|
||||
})
|
||||
})
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue