diff --git a/.github/workflows/jitpack.yml b/.github/workflows/jitpack.yml
index b60131f..11bc4a3 100644
--- a/.github/workflows/jitpack.yml
+++ b/.github/workflows/jitpack.yml
@@ -1,8 +1,6 @@
name: Trigger Jitpack Build
on:
push:
- branches: [ master ]
- workflow_dispatch:
jobs:
build:
diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts
index 94f8e5b..3490f7c 100644
--- a/core/common/build.gradle.kts
+++ b/core/common/build.gradle.kts
@@ -33,11 +33,16 @@ dependencies {
shadow("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0")
shadow("com.charleskorn.kaml:kaml:0.53.0")
+ // Config
+ @Suppress("VulnerableLibrariesLocal", "RedundantSuppression")
+ shadow("org.yaml:snakeyaml:1.33")
+
// Math
shadow("org.joml:joml:1.10.5")
// Adventure
- shadow("net.kyori:adventure-api:4.12.0")
+ shadow("net.kyori:adventure-api:4.13.1")
+ shadow("net.kyori:adventure-text-minimessage:4.13.1")
// Commands
shadow("cloud.commandframework:cloud-core:1.8.3")
diff --git a/core/common/src/main/kotlin/dev/koding/catalyst/core/common/api/messages/Localization.kt b/core/common/src/main/kotlin/dev/koding/catalyst/core/common/api/messages/Localization.kt
new file mode 100644
index 0000000..21a2d9b
--- /dev/null
+++ b/core/common/src/main/kotlin/dev/koding/catalyst/core/common/api/messages/Localization.kt
@@ -0,0 +1,100 @@
+/*
+ * Catalyst - Minecraft plugin development toolkit
+ * Copyright (C) 2023 Koding Development
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ */
+package dev.koding.catalyst.core.common.api.messages
+
+import org.yaml.snakeyaml.Yaml
+import java.io.InputStream
+import java.util.Locale
+import java.util.concurrent.ConcurrentHashMap
+
+/**
+ * Localization provides a way to store translations for a plugin.
+ * It is a collection of [Translation] objects, which are collections of [Message] objects.
+ *
+ * It is recommended to use the [loadFromFile] method to load translations from a YAML file,
+ * but it is also possible to manually register translations. (Though we do not recommend this)
+ *
+ * @see Translation
+ */
+class Localization {
+
+ companion object {
+ /**
+ * The default locale to use when no other locale is specified.
+ */
+ val DEFAULT_LOCALE: Locale = Locale.US
+ }
+
+ /**
+ * The translations for this instance.
+ */
+ internal val translations = ConcurrentHashMap()
+
+ /**
+ * Load the translations from a YAML file.
+ *
+ * @param locale The locale of the file
+ * @param stream The input stream to read from
+ */
+ fun loadFromFile(locale: Locale, stream: InputStream) {
+ val data = Yaml().load