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

io.github.freya022.botcommands.internal.commands.application.localization.BCLocalizationFunction.kt Maven / Gradle / Ivy

package io.github.freya022.botcommands.internal.commands.application.localization

import io.github.freya022.botcommands.api.core.service.getService
import io.github.freya022.botcommands.api.core.utils.enumMapOf
import io.github.freya022.botcommands.api.localization.Localization
import io.github.freya022.botcommands.api.localization.LocalizationService
import io.github.freya022.botcommands.internal.core.BContextImpl
import io.github.freya022.botcommands.internal.core.SingleLogger
import net.dv8tion.jda.api.interactions.DiscordLocale
import net.dv8tion.jda.api.interactions.commands.localization.LocalizationFunction
import java.util.*

private val singleLogger = SingleLogger.of()

internal class BCLocalizationFunction(context: BContextImpl) : LocalizationFunction {
    private val logMissingLocalizationKeys = context.applicationConfig.logMissingLocalizationKeys
    private val localizationService: LocalizationService = context.getService()
    private val baseNameToLocalesMap: Map> = context.applicationConfig.baseNameToLocalesMap

    override fun apply(localizationKey: String): Map {
        val map: MutableMap = enumMapOf()

        forEachBundle { baseName, javaLocale, discordLocale, localization ->
            val template = localization[localizationKey]
            if (template != null) {
                map[discordLocale] = template.localize()
            } else if (logMissingLocalizationKeys) {
                singleLogger.warn(baseName, discordLocale, localizationKey) {
                    "Localization template '${localizationKey}' could not be found in bundle '${baseName}' with Java locale '${javaLocale}' (from Discord's $discordLocale) or below"
                }
            }
        }

        return map
    }

    private fun forEachBundle(block: (baseName: String, javaLocale: Locale, discordLocale: DiscordLocale, localization: Localization) -> Unit) {
        baseNameToLocalesMap.forEach { (baseName, discordLocales) ->
            discordLocales.forEach localeLoop@{ discordLocale ->
                val javaLocale = discordLocale.toLocale()
                val instance = localizationService.getInstance(baseName, javaLocale)
                    ?: return@localeLoop singleLogger.warn(baseName, discordLocale) {
                        "Localization bundle '${baseName}' with Java locale '${javaLocale}' (from Discord's $discordLocale) was specified to be valid but was not found at all."
                    }

                if (instance.effectiveLocale !== javaLocale) {
                    singleLogger.warn(baseName, discordLocale, instance.effectiveLocale.toLanguageTag()) {
                        "Localization bundle '${baseName}' with Java locale '${javaLocale}' (from Discord's $discordLocale) was specified to be valid but was not found, falling back to '${instance.effectiveLocale}'"
                    }
                }

                block(baseName, javaLocale, discordLocale, instance)
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy