MuffinTranslate
Requirements
Paper only. Spigot, Bukkit and Forge are not supported, and the jar will not load on them
Paper 26.2 or 26.1.2 need Java 25 · Paper 1.21.11, 1.21.8, 1.21.4, 1.21.1 and 1.20.6 need Java 21
PacketEvents 2.13.0 or newer, installed as a plugin. MuffinTranslate does not start without it
Python 3.10 or newer on the machine running the server. The plugin builds its own private environment on the first start, about 50 MB, and installs nothing system-wide. If Python lives somewhere unusual, point config.yml at it with engine.python.executable
About 170 MB of disk per language, downloaded once and kept
An internet connection for the first download and for the licence check. Translation itself runs on your server and no text ever leaves it
Setup
1. Download the file for your Paper version. Getting the wrong one is the most common mistake: a jar built for Java 25 will not load on a server running Java 21
2. Install PacketEvents 2.13.0 or newer
3. Put the jar in your plugins folder and start the server
4. The first start takes a few minutes: the plugin builds its Python environment and downloads the language packs. Watch the bar or the console, both say how far along it is
5. Players get the language menu the first time they join, and can reopen it any time with /mtranslate
Languages
The free version covers 3 languages: English plus 2 of your choice. English cannot be given up, because every translation is routed through it.
Pick them in config.yml under language.enabled, then restart or run /mtranslate reload. An operator can also turn them on from the menu with /mtranslate admin, which downloads what is missing straight away.
Each language is two packs of about 85 MB, downloaded once. Turning a language off keeps the packs on disk, so turning it back on is instant.
Watching a download
While packs come down, operators see a bar at the top of the screen with the language, which pack of how many, the megabytes and the overall percentage. The same progress is written to the console every 25%, so it can be followed over SSH with nobody in game.
The bar is shown to operators and to anyone holding muffintranslate.progress. It appears only while something is actually downloading: if a language is already on disk, there is nothing to show. To check whether your client receives it, run /mtranslate progress - when nothing is downloading it sends a ten-second test bar.
Words you never want translated
Ranks, worlds, shops, kits: the names a server gives its own things read worse translated than left alone. They live in glossary.yml, and 75 of the usual ones come with the plugin.
You do not have to open the file: /mtranslate glossary shows what is protected now, add puts one more in and remove takes one out. Both save and reload straight away, so the change is live before you close the chat.
Matching ignores case unless you turn protection.glossary-case-sensitive on, so a short everyday word like "end" protects the end of an ordinary sentence too. If a word reads oddly in chat, remove it and see.
Commands
/mtranslate - your language menu, for every player
/mtranslate set <language> - pick your language without the menu
/mtranslate status - engine, cache and chat counters
/mtranslate admin - choose the server languages (operators)
/mtranslate glossary - the words never translated: see them (operators)
/mtranslate glossary add <word> - protect one more, right away
/mtranslate glossary remove <word> - let a word be translated again
/mtranslate progress - what is downloading, plus a test bar (operators)
/mtranslate reload - reload config.yml and glossary.yml (operators)
/mtranslate cache stats|clear - show or empty the translation cache (operators)
/muffinlic key <your key> - save your licence key and check it, no restart
/muffinlic status - what this server is licensed for, and when it last checked
/muffinlic check - check now, without waiting for the next round
/muffinlic release - hand back this machine's activation slot, for instance before moving host
/muffinlic reload - read the key from license.yml again
/muffinlic repair - clear the local licence state and check again
/mtl is short for /mtranslate.
Permissions
muffintranslate.use - use the language menu. Everyone, by default
muffintranslate.admin - server languages, reload, cache. Operators, by default
muffintranslate.progress - see the download bar. Operators, by default
muffinlic.admin - licence status, checks and the activation slot. Operators, by default
What the plugin writes on disk
In plugins/MuffinTranslate/ you will find config.yml, license.yml, glossary.yml and players.yml. Those are yours to edit.
Everything else is internal: runtime/ holds the Python environment and the language packs, cache.bin and cache-results.bin hold saved translations, and the hidden .data/ folder holds the licence bookkeeping. Nothing in there needs editing, and .data/ in particular is best left alone - deleting it makes this machine ask for a new activation slot, and copying it to another server makes the two count as one machine.
Licence
All 50 languages need a key. Once you have one, run /muffinlic key YOUR-KEY in the server console: the plugin saves it and checks it straight away, with no restart and nothing to edit by hand. If you prefer, paste it into plugins/MuffinTranslate/license.yml and run /muffinlic reload.
The key is checked online shortly after startup and once an hour after that. If our servers cannot be reached, your paid features stay on for 48 hours, so an outage on our side does not switch your server off. The plugin never kicks a player and never stops the server, whatever the licence says.
One activation slot is one server instance. On a Bungee or Velocity network, every backend that loads the plugin counts as one activation. Moving to a new host? Run /muffinlic release on the old machine first and the slot goes back to the pool.
Network and privacy
The server reaches the internet for two things only: downloading the language packs the first time, and the hourly licence check. Translation happens on your own machine, and no chat message ever leaves it.
If something does not work
The plugin does not load at all - check the Java version against the list at the top, and check that PacketEvents is installed and enabled
"No Python found" in the console - install Python 3.10 or newer, or set engine.python.executable in config.yml to its full path
A language stays untranslated - its packs are still downloading, or the download failed. /mtranslate progress says which
No bar on screen - it only shows while something is downloading. /mtranslate progress sends a test bar when nothing is
Cannot connect to the server at all - that is not this plugin. A connection refused happens before any plugin code runs
Support
For access and support write to info@muffin-suite.com