We are open to, and grateful for, any contributions made by the community.
By contributing you agree to the LICENSE of this repository.
By contributing you agree to respect the Code of Conduct of this repository.
Please follow conventional commits
Please update the tests to reflect your code changes. Pull requests will not be accepted if they are failing on GitHub actions.
Darkhold supports multiple languages, and we welcome translation contributions! Here's how you can help:
| Language | Status | Progress |
|---|---|---|
| English (en) | ✅ Complete | 427/427 messages |
| Spanish (es) | ✅ Complete | 427/427 messages |
| French (fr) | ✅ Complete | 427/427 messages |
| German (de) | ✅ Complete | 427/427 messages |
All core languages are now complete! We welcome contributions for additional languages (Portuguese, Italian, Japanese, Chinese, etc.).
-
Fork the repository
-
Find the translation file in
src/main/resources/- French:
messages_fr.properties - German:
messages_de.properties - Or create a new one:
messages_XX.properties(where XX is the language code)
- French:
-
Translate the messages
- Use
messages.properties(English) as the source - Use
messages_es.properties(Spanish) as a reference for structure - Keep keys in English, only translate values after the
=sign - Don't translate:
app.name=Darkhold, technical terms (PIN, URL, Excel, CSV) - Use formal tone: "vous" (French), "Sie" (German), "usted" (Spanish)
- Use
-
Example:
# English (messages.properties) game.title=Game game.waiting=Waiting for players... # French (messages_fr.properties) game.title=Jeu game.waiting=En attente des joueurs... # German (messages_de.properties) game.title=Spiel game.waiting=Warten auf Spieler...
-
Test your translations:
./gradlew bootRun # Navigate to the app and change language in the navbar -
Submit a Pull Request
- Title:
i18n: Complete French translationsori18n: Add Portuguese translations - Description: Mention which language and how many messages were translated
- Title:
- Copy
messages_es.propertiestomessages_XX.properties(XX = your language code) - Update the header comment to reflect your language
- Translate all 427 messages
- Update
language-manager.jsto add your language to the selector:// In src/main/resources/static/scripts/language-manager.js // Add your language to the available languages
- Submit a PR!
- Natural & Idiomatic: Translate meaning, not word-for-word
- Consistent Terminology: Use the same translation for repeated terms
- Context Matters: Consider where the message appears (button, heading, error, etc.)
- Test in UI: Always test your translations in the actual interface
- Character Limits: Some UI elements have space constraints, keep translations concise
- Preserve Formatting: Keep line breaks (
\n), placeholders, and HTML entities
Open an issue with the i18n label if you have questions about translations!
We're particularly looking for native speakers to help with:
- 🇫🇷 French (needs 372 more messages)
- 🇩🇪 German (needs 372 more messages)
- 🇵🇹 Portuguese (new language)
- 🇯🇵 Japanese (new language)
- 🇨🇳 Chinese (new language)
Thank you for helping make Darkhold accessible to more people! 🌍