Velocity Example

Please note that velocity is handled slightly different due to how their plugin API works. E.g. you need to implement the `Languaged` interface.

Maven Artifact


@Plugin(id = "myplugin", name = "MyPlugin", version = "1.0", authors = {"You"})
public class MyPlugin implements Languaged {
    private final Logger logger;
    private final File dataFolder;
    private LanguageManager lang;
    public MyPlugin(ProxyServer proxy, Logger logger, @DataDirectory Path dataFolder) {
        this.logger = logger;
        this.dataFolder = dataFolder.toFile();
    public void onProxyInitialization(ProxyInitializeEvent event) {    
        # Load LanguageManager. Either call that in onEnable or your config loading method.
        # Will automatically save and load any lang.<locale>.yml configs in the languages folder
        # Gets and saves language files to the folder "languages".
        # Default locale is "en"
        lang = new LanguageManager(this, "languages", "en");
        # Set the provider for the language of a certain sender
        # If null is returned then it will use the default locale
        # (This provider is the same as which is used by default)
        lang.setProvider(sender -> {
            if (sender instanceof ProxiedPlayer) {
                return ((ProxiedPlayer) sender).getLocale().getLanguage().replace('-', '_');
            return null;
    public String getName() {
        return getClass().getAnnotation(Plugin.class).name();
    public File getDataFolder() {
        return dataFolder;
    public Logger getLogger() {
        return logger;
     * Get a message from a language config for a certain sender
     * @param sender        The sender to get the string for. (Language is based on this)
     * @param key           The language key in the config
     * @param replacements  An option array for replacements.
     *                (2n)-th will be the placeholder, (2n+1)-th the value. 
     *                Placeholders have to be surrounded by percentage signs: %placeholder%
     * @return The string from the config which matches the sender's language (or the default one) with the replacements replaced (or an error message, never null)
    public String getMessage(CommandSender sender, String key, String... replacements) {
        return lang.getConfig(sender).get(key, replacements);