feat: add user defined translations (#1756)

* feat: add user defined translations

* add refetch key for translation (#1757)

---------

Co-authored-by: Alex Christoffer Rasmussen <ac@omnivox.dk>
This commit is contained in:
Carlos Valente
2025-09-03 16:06:03 +02:00
committed by GitHub
parent ae15f3cdc5
commit 8d2d8ef979
26 changed files with 431 additions and 129 deletions
+4
View File
@@ -33,4 +33,8 @@ export const config = {
},
uploads: 'uploads',
logo: 'logo',
translations: {
directory: 'translations',
filename: 'translations.json',
},
};
+10
View File
@@ -81,12 +81,16 @@ export const srcFiles = {
clientIndexHtml: join(srcDir.clientDir, 'index.html'),
/** Path to bundled CSS */
cssOverride: join(srcDir.root, config.user, config.styles.directory, config.styles.filename),
/** Path to bundled translation */
translationsFile: join(srcDir.root, config.user, config.translations.directory, config.translations.filename),
/** Path to bundled external readme */
externalReadme: join(srcDir.root, config.external, 'README.md'),
/** Path to bundled user readme */
userReadme: join(srcDir.root, config.user, 'README.md'),
/** Path to bundled CSS readme */
cssReadme: join(srcDir.root, config.user, config.styles.directory, 'README.md'),
/** Path to bundled translation readme */
translationReadme: join(srcDir.root, config.user, config.translations.directory, 'README.md'),
/** Path to login */
login: join(srcDir.root, 'html/login.html'),
};
@@ -136,6 +140,8 @@ export const publicDir = {
/** path to external styles override */
stylesDir: join(resolvePublicDirectory, config.user, config.styles.directory),
logoDir: join(resolvePublicDirectory, config.user, config.logo),
/** path to translations folder */
translationsDir: join(resolvePublicDirectory, config.user, config.translations.directory),
} as const;
/**
@@ -148,10 +154,14 @@ export const publicFiles = {
restoreFile: join(publicDir.root, config.restoreFile),
/** path to CSS override file */
cssOverride: join(publicDir.stylesDir, config.styles.filename),
/** path to custom translation file */
translationsFile: join(publicDir.translationsDir, config.translations.filename),
/** path to external readme file */
externalReadme: join(publicDir.externalDir, 'README.md'),
/** path to user readme file */
userReadme: join(publicDir.userDir, 'README.md'),
/** path to CSS readme file */
cssReadme: join(publicDir.stylesDir, 'README.md'),
/** path to translation readme file */
translationReadme: join(publicDir.translationsDir, 'README.md'),
} as const;
+23
View File
@@ -0,0 +1,23 @@
import { copyFileSync, existsSync, writeFileSync } from 'fs';
import { ensureDirectory } from '../utils/fileManagement.js';
import { defaultTranslation } from '../user/translations/bundledTranslations.js';
import { publicDir, publicFiles, srcFiles } from './index.js';
/**
* ensures directories exist and populates translation
*/
export const populateTranslation = () => {
ensureDirectory(publicDir.translationsDir);
// if translations doesn't exist we want to use startup translation
try {
copyFileSync(srcFiles.translationReadme, publicFiles.translationReadme);
if (!existsSync(publicFiles.translationsFile)) {
// copy the startup translation only if user doesnt have one
writeFileSync(publicFiles.translationsFile, defaultTranslation, { encoding: 'utf-8' });
}
} catch (_) {
/* we do not handle this */
}
};