FreeTube/src/renderer/i18n/index.js

89 lines
2.4 KiB
JavaScript

import Vue from 'vue'
import VueI18n from 'vue-i18n'
import fs from 'fs'
// List of locales approved for use
import activeLocales from '../../../static/locales/activeLocales.json'
const isDev = process.env.NODE_ENV === 'development'
const messages = {}
if (isDev) {
const { load } = require('js-yaml')
// Take active locales and load respective YAML file
activeLocales.forEach((locale) => {
try {
// File location when running in dev
const doc = load(fs.readFileSync(`static/locales/${locale}.yaml`))
messages[locale] = doc
} catch (e) {
console.error(locale, e)
}
})
}
class CustomVueI18n extends VueI18n {
constructor(options) {
super(options)
this.allLocales = activeLocales
}
async loadLocale(locale) {
// we only lazy load locales for producation builds
if (!isDev) {
// don't need to load it if it's already loaded
if (this.availableLocales.includes(locale)) {
return
}
if (!this.allLocales.includes(locale)) {
console.error(`Unable to load unknown locale: "${locale}"`)
}
if (process.env.IS_ELECTRON) {
const { brotliDecompressSync } = require('zlib')
// locales are only compressed in our production Electron builds
try {
// decompress brotli compressed json file and then load it
// eslint-disable-next-line node/no-path-concat
const compressed = fs.readFileSync(`${__dirname}/static/locales/${locale}.json.br`)
const data = JSON.parse(brotliDecompressSync(compressed).toString())
this.setLocaleMessage(locale, data)
} catch (err) {
console.error(locale, err)
}
} else {
const url = new URL(window.location.href)
url.hash = ''
if (url.pathname.endsWith('index.html')) {
url.pathname = url.pathname.replace(/index\.html$/, '')
}
if (url.pathname) {
url.pathname += `${!url.pathname.endsWith('/') ? '/' : ''}static/locales/${locale}.json`
} else {
url.pathname = `/static/locales/${locale}.json`
}
const response = await fetch(url)
const data = await response.json()
this.setLocaleMessage(locale, data)
}
}
}
}
Vue.use(CustomVueI18n)
const i18n = new CustomVueI18n({
locale: 'en-US',
fallbackLocale: { default: 'en-US' },
messages
})
if (!isDev) {
i18n.loadLocale('en-US')
}
export default i18n