Translation files for the Plexverse server. This repository contains all translation keys and their localized strings for multiple languages. We welcome anyone to contribute to translating the server, create a pull request with any changes you'd like to make!
Note
Translations can take up to 24 hours to propagate to in-game servers after being merged.
- English (
en) - Base language, source of truth - French (
fr) - Spanish (
es) - Russian (
ru) - Pirate (
pir)
If you'd like another language supported, please reach out to our team on discord. We're happy to onboard new languages!
The repository is organized by language, with each language having its own directory:
translations/
├── english/ # Base English translations (source of truth)
│ ├── Admin_en.json
│ ├── Badges_en.json
│ ├── Death_en.json
│ ├── Game_en.json
│ ├── Kits_en.json
│ ├── Lobby_en.json
│ ├── Queue_en.json
│ ├── Settings_en.json
│ └── Stats_en.json
├── french/ # French translations
│ ├── Badges_fr.json
│ └── ...
├── spanish/ # Spanish translations
│ ├── Badges_es.json
│ └── ...
├── russian/ # Russian translations
│ ├── Badges_ru.json
│ └── ...
├── pirate/ # Pirate translations
│ ├── Badges_pir.json
│ └── ...
└── .scripts/ # Validation scripts
└── validate-translations.js
Each translation file is a JSON file containing key-value pairs. Keys can be nested objects for organization:
{
"simple-key": "Simple translation",
"nested-key": {
"name": "Nested name",
"description": "Nested description"
}
}Translation strings support:
- Color codes: Use
§followed by a color code (e.g.,§afor green,§cfor red) - Placeholders: Use
%%variable%%for dynamic content (e.g.,%%player%%,%%time%%) - Special characters: Unicode characters and emojis are supported
- Add the key to the appropriate English file in
english/ - Add the same key to all other language files
- For new languages, copy the English content as a starting point
- Edit the translation in the appropriate language file
- Ensure the key structure matches the English version
- Maintain the same JSON structure and formatting
- English is the source of truth: All keys must exist in English files
- All languages must have all keys: The validation system ensures this
- Keep placeholder variables: Maintain
%%variable%%placeholders in all languages - Preserve formatting codes: Keep
§color codes and special characters - Do not translate game names: Game names, mode names, and other proper nouns should remain in their original form
- Do not translate variable names: Variable names in placeholders (e.g.,
%%player%%,%%time%%) should not be translated
A GitHub Action automatically validates translations on every pull request:
- Checks that all English keys exist in all other languages
- Runs separate validation checks for each changed language
- Only validates languages that were modified (or all languages if English changed)
- Fails the PR if any keys are missing
You can validate translations locally using the Node.js script:
# Validate a specific language
node .scripts/validate-translations.js french
# Validate multiple languages
node .scripts/validate-translations.js french spanishThe script will:
- ✓ Report success if all keys are present
- ✗ Report missing keys if any are found
- Exit with code 1 if validation fails
Each language folder has a CODEOWNERS file that automatically requests review from the appropriate proofreader team:
english/→@proofreader-englishfrench/→@proofreader-frenchspanish/→@proofreader-spanishrussian/→@proofreader-russianpirate/→@proofreader-pirate
When you modify files in a language folder, the corresponding proofreader team will be automatically requested as a reviewer. Feel free to ask people from this team to review if you don't get a response on github within a few days.
- All translation keys must be present: The validation check must pass
- Proofreader approval: The appropriate language proofreader must approve
- No missing keys: All English keys must exist in all other languages
Translation files follow this naming pattern:
{Category}_{language_code}.json- Examples:
Game_en.json(English)Game_fr.json(French)Game_es.json(Spanish)Game_ru.json(Russian)Game_pir.json(Pirate)
- Admin: Admin-related messages and error notifications
- Badges: Badge names and descriptions
- Death: Death-related messages
- Game: In-game messages and UI text
- Kits: Kit names and descriptions
- Lobby: Lobby interface text
- Queue: Queue and matchmaking messages
- Settings: Settings menu text
- Stats: Statistics display text
- Fork the repository
- Create a branch for your changes
- Make your translation edits
- Run validation locally to ensure all keys are present
- Commit and push your changes
- Create a pull request
- Wait for validation to pass and proofreader approval
If validation fails, check:
- All English keys exist in the language you're editing
- File names match the pattern
{Category}_{language_code}.json - JSON syntax is valid (no trailing commas, proper quotes)
- Nested keys use dot notation (e.g.,
parent.child)
If you see missing keys in validation:
- Check the English file for the key structure
- Add the missing key to the language file
- Maintain the same structure (nested objects, etc.)
Validates that all English translation keys exist in specified language files.
Usage:
node .scripts/validate-translations.js <language1> [language2] ...Example:
node .scripts/validate-translations.js french spanishExit Codes:
0: All keys present1: Missing keys found