-
Notifications
You must be signed in to change notification settings - Fork 2
Translations
ViTransfer supports multiple languages. The language is set by an admin under Settings → Language and applies to everything: admin pages, client share pages, and email notifications.
| Code | Language | Status |
|---|---|---|
en |
English | ✅ Complete (default) |
nl |
Nederlands | ✅ Complete |
de |
Deutsch | ✅ Complete |
Want to add your language? It's easy — you only need to translate one JSON file and send it to us.
Download en.json from the repository:
📁 src/locales/en.json
This is the reference file with all ~1,400 strings. Rename your copy to your language code (e.g., de.json for German, fr.json for French — see ISO 639-1 codes).
Open the file in any text editor and translate only the values (the right side). Never touch the keys (left side):
{
"common": {
"save": "Speichern",
"cancel": "Abbrechen"
}
}That's it — go through the file section by section and translate each value.
Pick whatever is easiest for you:
- GitHub Issue — open an issue and attach your translated file
-
Pull Request — add your
xx.jsontosrc/locales/and open a PR - Direct message — reach out via the contact info on vitransfer.com
We'll review it, wire it into the app, and credit you as a contributor. You don't need to touch any code — we handle the rest.
Found a typo or a better way to phrase something? Same process:
- Download the existing file (e.g.,
nl.json) - Make your corrections
- Send it via Issue, PR, or direct message
Even fixing a single string helps — you don't need to review the whole file.
- ViTransfer — the app name, always stays as-is
- Brand names — GitHub, Docker Hub, Ko-fi, Gotify, ntfy, Pushover, Telegram, Google Calendar, Outlook, Apple Calendar
- Technical terms — SMTP, OTP, HTTPS, HSTS, JWT, TUS, HTML, SVG, URL, IP, VAPID, FPS, ZIP, HTTP, ProRes, PCM, PassKey, Codec
-
Format patterns —
HH:MM:SS:FF,MM:SS,v1, v2, v3,720p,1080p,ABCD-1234
Some strings have variables inside {curly braces} — translate around them but don't rename them:
"pageOf": "Seite {page} von {pages}"Email templates use {{DOUBLE_BRACES}} and HTML tags — keep those exactly as-is:
"greeting": "Hallo <strong>{{RECIPIENT_NAME}}</strong>,"| Context | Who sees it | Tone |
|---|---|---|
| Admin pages (settings, projects, users) | Admins | Casual / informal |
| Client pages (share, comments, approval) | Clients | Professional / polite |
| Email templates | Clients | Formal |
For languages with formal/informal forms (e.g., German Sie/du, French vous/tu, Dutch u/je): use informal for admin, formal for client-facing content.
The file is organized by section. Here's what each one covers:
| Section | Content |
|---|---|
common |
Shared words (Save, Cancel, Delete, Loading, etc.) |
auth |
Login, password reset, PassKey |
nav |
Navigation menu |
projects |
Project creation, editing, archiving |
videos |
Uploads, versions, assets, player |
comments |
Feedback, replies, annotations, attachments |
share |
Client share page and authentication |
settings |
All admin settings subsections |
security |
Security events dashboard |
analytics |
Project statistics |
recipients |
Client recipient management |
clients |
Client directory |
users |
Admin user management |
calendar |
Calendar and deadlines |
controls |
Video player and drawing tools |
email |
All email notification templates |
reprocess |
Video reprocessing dialogs |
unapprove |
Project unapproval dialogs |
device |
Workflow integration (DaVinci Resolve, Premiere Pro) |
unsubscribe |
Email unsubscribe page |
notFound |
404 page |
session |
Session timeout warnings |
If you're adding the translation to the codebase yourself:
- Place
xx.jsoninsrc/locales/ - Register the locale in
src/i18n/locale.ts:export const SUPPORTED_LOCALES = ['en', 'nl', 'xx'] as const export const LOCALE_NAMES: Record<string, string> = { en: 'English', nl: 'Nederlands', xx: 'Your Language', }
- Add the language label in
settings.languagein every existing locale file:"language": { "en": "English", "nl": "Dutch", "xx": "Your Language Name" }
- Validate your JSON:
node -e "JSON.parse(require('fs').readFileSync('src/locales/xx.json')); console.log('Valid')" - Check key parity with English:
node -e " const fs = require('fs'); const en = JSON.parse(fs.readFileSync('src/locales/en.json')); const xx = JSON.parse(fs.readFileSync('src/locales/xx.json')); function keys(o, p) { p = p || ''; let r = []; for (const k in o) { const f = p ? p+'.'+k : k; if (typeof o[k] === 'object' && o[k]) r = r.concat(keys(o[k], f)); else r.push(f); } return r; } const ek = keys(en), xk = keys(xx); const missing = ek.filter(function(k) { return xk.indexOf(k) < 0; }); const extra = xk.filter(function(k) { return ek.indexOf(k) < 0; }); if (missing.length) console.log('Missing:', missing); if (extra.length) console.log('Extra:', extra); if (!missing.length && !extra.length) console.log('All keys match!'); "
- Run
npm run buildto confirm no type errors.
| File | Purpose |
|---|---|
src/locales/en.json |
English translations (source of truth) |
src/locales/nl.json |
Dutch translations |
src/i18n/locale.ts |
Supported locales, display names, helpers |
src/i18n/request.ts |
next-intl config — loads language from database |
prisma/schema.prisma |
Settings.language stores the active language |
Navigation: Home | Features | Installation | Platform Guides | Configuration | Admin Settings | Usage Guide | Client Guide | Security | Maintenance | Troubleshooting | Screenshots | Contributing | Translations | License