Skip to main content

Localization

The plugin supports multiple languages with full translation coverage.

Supported Languages

LanguageCodeStatus
Englishen-US✅ Complete
Germande-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:

  1. Uses the achievement id formatted as display name
  2. my_custom_achievementMy Custom Achievement
  3. 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.