Skip to content

Commit

Permalink
feat: translation extensions
Browse files Browse the repository at this point in the history
  • Loading branch information
InvalidJoker committed Jan 24, 2025
1 parent 74cfadf commit a3cc6bf
Show file tree
Hide file tree
Showing 4 changed files with 102 additions and 2 deletions.
12 changes: 11 additions & 1 deletion src/main/kotlin/cc/modlabs/kpaper/extensions/PlayerExtensions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,14 @@ import com.mojang.brigadier.context.CommandContext
import dev.fruxz.stacked.text
import io.papermc.paper.command.brigadier.CommandSourceStack
import net.kyori.adventure.text.Component
import net.minecraft.server.level.ServerPlayer
import net.minecraft.server.network.ServerGamePacketListenerImpl
import org.bukkit.Bukkit
import org.bukkit.OfflinePlayer
import org.bukkit.Sound
import org.bukkit.attribute.Attribute
import org.bukkit.command.CommandSender
import org.bukkit.craftbukkit.entity.CraftPlayer
import org.bukkit.entity.Player
import java.util.*

Expand Down Expand Up @@ -72,4 +75,11 @@ fun Collection<Player>.sendMessagePlain(message: String) {

fun Collection<Player>.sendMessagePlain(message: Component) {
forEach { it.sendMessagePlain(message) }
}
}


val Player.connection: ServerGamePacketListenerImpl
get() {
val serverPlayer = (player as CraftPlayer).handle as ServerPlayer
return serverPlayer.connection
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package cc.modlabs.kpaper.extensions

import cc.modlabs.kpaper.translation.Translations
import org.bukkit.command.CommandSender
import org.bukkit.entity.Player
import java.util.*

fun getUnknownTranslation(key: String): String {
return "<hover:show_text:'Click to copy'><click:suggest_command:'$key'>$key</click></hover>"
}

val String.minecraftTranslated
get() = "<lang:$this>"


fun String.toTranslated(player: Player, placeholders: Map<String, Any?> = mapOf(), overwriteLang: String? = null): String {
return Translations.getTranslation(
overwriteLang ?: player.locale().code, this, placeholders) ?: getUnknownTranslation(this)
}

fun String.toTranslated(commandSender: CommandSender, placeholders: Map<String, Any?> = mapOf()): String {
return if (commandSender is Player) {
toTranslated(commandSender, placeholders)
} else {
Translations.getTranslation("en_US", this, placeholders) ?: getUnknownTranslation(this)
}
}

fun Player.translate(messageKey: String, placeholders: Map<String, Any?> = mapOf()): String {
return messageKey.toTranslated(this, placeholders)
}

fun CommandSender.translate(messageKey: String, placeholders: Map<String, Any?> = mapOf()): String {
return messageKey.toTranslated(this, placeholders)
}

val Locale.code: String
get() = this.language + (if (this.country.isNotEmpty()) "_$country" else "")

fun String.toMinecraftTranslated(vararg args: Any): String {
return "<lang:$this${
if (args.isNotEmpty()) {
args.joinToString(separator = ":", prefix = ":")
} else {
""
}
}>"
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import kotlinx.coroutines.launch
import java.util.concurrent.locks.ReadWriteLock
import java.util.concurrent.locks.ReentrantReadWriteLock

class TranslationCache(
class TranslationManager(
private val source: TranslationSource
) {

Expand Down
42 changes: 42 additions & 0 deletions src/main/kotlin/cc/modlabs/kpaper/translation/Translations.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package cc.modlabs.kpaper.translation

import cc.modlabs.kpaper.translation.interfaces.TranslationHook
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

object Translations {

lateinit var manager: TranslationManager
private val translationHooks = arrayListOf<TranslationHook>()

private fun loadTranslations(callback: ((Map<String, Int>) -> Unit)? = null) {
CoroutineScope(Dispatchers.Default).launch {
manager.loadTranslations(callback)
}
}

fun registerTranslationHook(hook: TranslationHook) {
translationHooks.add(hook)
}

fun getTranslation(language: String, key: String, placeholders: Map<String, Any?> = mapOf()): String? {
if (!::manager.isInitialized) return null

var translation = manager.get(language, key, placeholders)?.message ?: return null

for (hook in translationHooks) {
translation = hook.onHandleTranslation(language, key, placeholders, translation)
}

return translation
}

val translations = manager

fun load(translationManager: TranslationManager) {
manager = translationManager

loadTranslations()
}
}

0 comments on commit a3cc6bf

Please sign in to comment.