Localization
The plugin supports multiple languages with full translation coverage.
Supported Languages
| Language | Code | Status |
|---|---|---|
| English | en-US | ✅ Complete |
| German | de-DE | ✅ Complete |
Configuration
Set the language in config.json:
{
"language": "en-US"
}
Language Files
Language files are located in:
Server/Languages/
├── en-US/
│ └── achievements.lang
└── de-DE/
└── achievements.lang
File Format
Language files use a simple key-value format:
# Comments start with #
key.path.name=Translated text
key.path.with.placeholder=Hello, {0}!
Key Structure
Achievement Names
achievements.name.first_blood=First Blood
achievements.name.spider_hunter_1=Spider Hunter I
achievements.name.spider_hunter_2=Spider Hunter II
Achievement Descriptions
achievements.desc.first_blood=Kill your first enemy
achievements.desc.spider_hunter_1=Kill 1 spider
achievements.desc.spider_hunter_2=Kill 10 spiders
Title Names
achievements.title.spider_slayer=Spider Slayer
achievements.title.monster_hunter=Monster Hunter
achievements.title.veteran=Veteran
UI Text
achievements.ui.gallery=Achievement Gallery
achievements.ui.search=Search...
achievements.ui.all=All
achievements.ui.combat=Combat
achievements.ui.progression=Progression
achievements.ui.exploration=Exploration
achievements.ui.social=Social
achievements.ui.completed=Completed
achievements.ui.locked=Locked
achievements.ui.unlocked=Unlocked
achievements.ui.progress=Progress
achievements.ui.requires=Requires
achievements.ui.reward=Reward
achievements.ui.title=Title
achievements.ui.prev=Previous
achievements.ui.next=Next
achievements.ui.page=Page
Trigger Descriptions
achievements.trigger.blocks_mined=Mine {0} blocks
achievements.trigger.blocks_placed=Place {0} blocks
achievements.trigger.kills=Kill {0} {1}
achievements.trigger.items_crafted=Craft {0} {1}
achievements.trigger.playtime_minutes=Play for {0} minutes
achievements.trigger.distance_walked=Walk {0} blocks
achievements.trigger.chat_messages=Send {0} chat messages
achievements.trigger.zones_discovered=Discover {0} zones
Command Messages
achievements.cmd.grant.success=Granted {0} to {1}
achievements.cmd.grant.already=Player already has this achievement
achievements.cmd.revoke.success=Revoked {0} from {1}
achievements.cmd.revoke.not_unlocked=Player doesn't have this achievement
achievements.cmd.list.header={0}'s Achievements ({1}/{2}):
achievements.cmd.list.empty=No achievements unlocked
Broadcast Messages
achievements.broadcast.unlock={0} unlocked: {1}
achievements.broadcast.title={0} earned the title: {1}
Adding Custom Translations
For Custom Achievements
When creating custom achievements, add translations:
custom_achievements.json:
{
"achievements": [
{
"id": "my_custom_achievement",
"category": "progression",
"trigger": { "type": "blocks_mined", "target": "any", "count": 100 }
}
]
}
en-US/achievements.lang:
achievements.name.my_custom_achievement=My Custom Achievement
achievements.desc.my_custom_achievement=Mine 100 blocks of any type
de-DE/achievements.lang:
achievements.name.my_custom_achievement=Mein Eigenes Achievement
achievements.desc.my_custom_achievement=Baue 100 Blöcke beliebiger Art ab
Fallback Behavior
If a translation is missing:
- Uses the achievement
idformatted as display name my_custom_achievement→My Custom Achievement- Underscores become spaces, words capitalized
Placeholders
Numbered Placeholders
# {0} = first parameter, {1} = second, etc.
achievements.trigger.kills=Kill {0} {1}
# Result: "Kill 50 Spiders"
Named Placeholders (in code)
achievements.broadcast.unlock={player} unlocked: {achievement}
Adding a New Language
Step 1: Create Directory
Server/Languages/
└── fr-FR/ ← New language folder
└── achievements.lang
Step 2: Copy English File
Copy en-US/achievements.lang to your new folder.
Step 3: Translate
Translate all values (keep keys unchanged):
# English
achievements.ui.gallery=Achievement Gallery
# French
achievements.ui.gallery=Galerie des Succès
Step 4: Configure
{
"language": "fr-FR"
}
Translation Guidelines
Consistency
- Use consistent terminology throughout
- Match game terminology where applicable
- Keep placeholder positions logical
Length
- UI elements have limited space
- Test translations in-game
- Abbreviate if necessary
Special Characters
- Umlauts and accents are supported (ä, ö, ü, é, etc.)
- Unicode characters work
- Emoji support depends on client font
Example Translations
Achievement Chain (English)
achievements.name.miner_1=Novice Miner
achievements.name.miner_2=Apprentice Miner
achievements.name.miner_3=Journeyman Miner
achievements.name.miner_4=Master Miner
achievements.desc.miner_1=Mine 100 blocks
achievements.desc.miner_2=Mine 1,000 blocks
achievements.desc.miner_3=Mine 10,000 blocks
achievements.desc.miner_4=Mine 100,000 blocks
Achievement Chain (German)
achievements.name.miner_1=Bergbau-Anfänger
achievements.name.miner_2=Bergbau-Lehrling
achievements.name.miner_3=Bergbau-Geselle
achievements.name.miner_4=Bergbau-Meister
achievements.desc.miner_1=Baue 100 Blöcke ab
achievements.desc.miner_2=Baue 1.000 Blöcke ab
achievements.desc.miner_3=Baue 10.000 Blöcke ab
achievements.desc.miner_4=Baue 100.000 Blöcke ab
Hot Reload
Language changes require a server restart to take effect.
Development
During development, consider creating a reload command to test translations without restarting.