All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.freya02.botcommands.internal.localization.LocalizationContextImpl.kt Maven / Gradle / Ivy

package com.freya02.botcommands.internal.localization

import com.freya02.botcommands.api.localization.Localization
import com.freya02.botcommands.api.localization.context.AppLocalizationContext
import com.freya02.botcommands.api.localization.context.TextLocalizationContext
import com.freya02.botcommands.internal.throwUser
import net.dv8tion.jda.api.interactions.DiscordLocale
import java.util.*

internal class LocalizationContextImpl(
    private val localizationBundle: String,
    private val localizationPrefix: String?,
    private val guildLocale: DiscordLocale?,
    private val userLocale: DiscordLocale?
) : TextLocalizationContext, AppLocalizationContext {
    override fun withGuildLocale(guildLocale: DiscordLocale?): LocalizationContextImpl {
        return LocalizationContextImpl(localizationBundle, localizationPrefix, guildLocale, userLocale)
    }

    override fun withUserLocale(userLocale: DiscordLocale?): LocalizationContextImpl {
        return LocalizationContextImpl(localizationBundle, localizationPrefix, guildLocale, userLocale)
    }

    override fun withBundle(localizationBundle: String): LocalizationContextImpl {
        return LocalizationContextImpl(localizationBundle, localizationPrefix, guildLocale, userLocale)
    }

    override fun withPrefix(localizationPrefix: String?): LocalizationContextImpl {
        return LocalizationContextImpl(localizationBundle, localizationPrefix, guildLocale, userLocale)
    }

    fun withLocales(guildLocale: DiscordLocale, userLocale: DiscordLocale): LocalizationContextImpl {
        return LocalizationContextImpl(localizationBundle, localizationPrefix, guildLocale, userLocale)
    }

    override fun localize(
        locale: DiscordLocale,
        localizationBundle: String,
        localizationPath: String,
        vararg entries: Localization.Entry
    ): String {
        val instance = Localization.getInstance(localizationBundle, Locale.forLanguageTag(locale.locale))
            ?: throwUser("Found no localization instance for bundle '$localizationBundle' and locale '$locale'")

        val effectivePath = when (localizationPrefix) {
            null -> localizationPath
            else -> "$localizationPrefix.$localizationPath"
        }

        val template = instance[effectivePath]
            ?: throwUser("Found no localization template for '$effectivePath' (in bundle '$localizationBundle' with locale '${instance.effectiveLocale}')")

        return template.localize(*entries)
    }

    override fun localize(localizationBundle: String, localizationPath: String, vararg entries: Localization.Entry): String = when {
        userLocale != null -> localizeUser(localizationPath, localizationBundle, *entries)
        guildLocale != null -> localizeGuild(localizationPath, localizationBundle, *entries)
        else -> localize(DiscordLocale.ENGLISH_US, localizationBundle, localizationPath, *entries)
    }

    override fun localize(locale: DiscordLocale, localizationPath: String, vararg entries: Localization.Entry): String =
        localize(locale, localizationBundle, localizationPath, *entries)

    override fun localize(localizationPath: String, vararg entries: Localization.Entry): String = when {
        userLocale != null -> localizeUser(localizationPath, *entries)
        guildLocale != null -> localizeGuild(localizationPath, *entries)
        else -> localize(DiscordLocale.ENGLISH_US, localizationPath, *entries)
    }

    override fun getLocalizationPrefix(): String? {
        return localizationPrefix
    }

    override fun getLocalizationBundle(): String {
        return localizationBundle
    }

    override fun hasGuildLocale(): Boolean {
        return guildLocale != null
    }

    override fun getGuildLocale(): DiscordLocale =
        guildLocale ?: throwUser("Cannot guild localize on an event which doesn't provide guild localization")

    override fun getUserLocale(): DiscordLocale =
        userLocale ?: throwUser("Cannot user localize on an event which doesn't provide user localization")
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy