-- Variable that contains the default language code of the mod (English) EID.DefaultLanguageCode = "en_us" -- List of all valid languages EID.Languages = { "en_us", -- English "fr", -- French "pt", -- Portuguese "pt_br", -- Brazilian Portuguese "ru", -- Russian "spa", -- Spanish "it", -- Italian "bul", -- Bulgarian "pl", -- Polish "de", -- German "tr_tr", -- Turkish "ko_kr", -- Korean "zh_cn", -- Simplified Chinese "ja_jp", -- Japanese "cs_cz", -- Czech "nl_nl", -- Dutch "uk_ua", -- Ukrainian "el_gr", -- Greek "ro_ro", -- Romanian "vi" -- Vietnamese } -- List of languages where it is allowed to do line-breaks between UTF-8 characters in a description EID.BreakUtf8CharsLanguage = { ['zh_cn'] = true } --#region Luadoc definitions ---@alias EID_LanguageCode ---| "bul" @Bulgarian ---| "cs_cz" @Czech ---| "de" @German ---| "el_gr" @Greek ---| "en_us" @English ---| "spa" @Spanish ---| "fr" @French ---| "it" @Italian ---| "ja_jp" @Japanese ---| "ko_kr" @Korean ---| "nl_nl" @Dutch ---| "pl" @Polish ---| "pt_br" @Brasilian Portuguese ---| "pt" @Portuguese ---| "ro_ro" @Romanian ---| "ru" @Russian ---| "tr_tr" @Turkish ---| "uk_ua" @Ukrainian ---| "vi" @Vietnamese ---| "zh_cn" @Simplified Chinese --#endregion -- Map the game's built-in language option strings to EID's EID.LanguageMap = { ["jp"] = "ja_jp", ["es"] = "spa", ["de"] = "de", ["fr"] = "fr", ["ru"] = "ru", ["kr"] = "ko_kr", ["zh"] = "zh_cn", } ---Get the current Language. Defaults to english if none is set. ---@return EID_LanguageCode function EID:getLanguage() local lang = EID.Config["Language"] -- Reset invalid languages (like en_us_detailed) if EID.descriptions[lang] == nil then EID.Config["Language"] = "auto" lang = "auto" end if lang == "auto" then local langToReturn = Options and EID.LanguageMap[Options.Language] or EID.DefaultLanguageCode -- Use game language, if available. -- don't do any updating if on a Repentance version before v1.7.9b if Isaac.RunCallback ~= nil then for _, callbackData in pairs(Isaac.GetCallbacks("EID_EVALUATE_AUTO_LANG")) do local newString = callbackData.Function(callbackData.Mod, langToReturn) if newString and type(newString) == "string" and EID.descriptions[newString] ~= nil then langToReturn = newString end end end return langToReturn end ---@cast lang EID_LanguageCode return lang end --- Attempts to load all language packs from a given game version function EID:LoadLanguagePacks(gameVersion) --modular item informations local _, _ = pcall(require, "descriptions." .. gameVersion .. ".item_data") --transformation informations local _, _ = pcall(require, "descriptions." .. gameVersion .. ".transformations") --load languages for _, languageCode in ipairs(EID.Languages) do local wasSuccessful, err = pcall(require, "descriptions." .. gameVersion .. "." .. languageCode) if not wasSuccessful and not string.find(err, "not found") then EID:WriteErrorMsg("Loading Languagepack '" .. languageCode .. "' (" .. gameVersion .. ") failed: " .. tostring(err)) end -- load item name lists wasSuccessful, err = pcall(require, "descriptions.names." .. languageCode) if not wasSuccessful and not string.find(err, "not found") then EID:WriteErrorMsg("Loading Languagepack '" .. languageCode .. "' (Names) failed: " .. tostring(err)) end -- remove item names that are from DLCs above ab+ EID:RemoveREPItemNames(languageCode) -- load modular descriptions wasSuccessful, err = pcall(require, "descriptions.modular." .. languageCode) if not wasSuccessful and not string.find(err, "not found") then EID:WriteErrorMsg("Loading Languagepack '" .. languageCode .. "' (modular) failed: " .. tostring(err)) end end end -- remove item names that are from DLCs above ab+ function EID:RemoveREPItemNames(languageCode) if EID.GameVersion ~= "ab+" then return end for id=553, 732 do -- remove collectible names. Ab+ = 1 to 552 EID.ItemNames[languageCode]["5.100."..id] = nil end for id=129, 189 do -- remove trinket names. Ab+ = 1 to 128 EID.ItemNames[languageCode]["5.350."..id] = nil end for id=54, 97 do -- remove card names. Ab+ = 1 to 53 EID.ItemNames[languageCode]["5.300."..id] = nil end for id=47, 49 do -- remove pill names. Ab+ = 1 to 46 EID.ItemNames[languageCode]["5.70."..id] = nil end end --- Initializes handling of alternative language codes for all languages function EID:AdjustLanguageConfigSetting() if EID.Config["Language"] == "auto" then -- If the language is set to "auto", we will not adjust the language codes return end for _, languageCode in ipairs(EID.Languages) do if languageCode == EID.Config["Language"] then -- If the language is set to a valid language code, we will not adjust it return end -- If the language is not set to a valid language code, we will adjust it if EID.descriptions[languageCode] then for _, altLanguageCode in ipairs(EID.descriptions[languageCode].alternativeLanguageCodes or {}) do if altLanguageCode == EID.Config["Language"] then EID.Config["Language"] = languageCode return end end end end EID:WriteErrorMsg("No valid language code found for '"..EID.Config["Language"].."', resetting to 'auto'") EID.Config["Language"] = "auto" end --- Initializes handling of alternative language codes for all languages function EID:InitAltLanguageCodes() for _, languageCode in ipairs(EID.Languages) do if EID.descriptions[languageCode] and EID.descriptions[languageCode].alternativeLanguageCodes then for _, altlanguageCode in ipairs(EID.descriptions[languageCode].alternativeLanguageCodes) do EID:AddAlternativeLanguageCode(languageCode, altlanguageCode) end end end end --- Initializes handling of alternative language codes for a specific language using meta-table that redirect table accesses to the original table function EID:AddAlternativeLanguageCode(originalLanguageCode, newLanguageCode) EID.descriptions[newLanguageCode] = setmetatable({}, { __index = EID.descriptions[originalLanguageCode], __newindex = function(_, key, value) EID.descriptions[originalLanguageCode][key] = value end, __pairs = function(_) return pairs(EID.descriptions[originalLanguageCode]) end, }) end --- Initializes and loads all language packs for the current game version, --- including handling for Repentance and Repentance+ expansions, --- and sorts the language list after loading. function EID:InitializeLanguagePacks() -- load AB+ descriptions EID:LoadLanguagePacks(EID.GameVersion) EID:InitAltLanguageCodes() -- load Repentance descriptions if EID.isRepentance then EID.GameVersion = "rep" EID:LoadLanguagePacks(EID.GameVersion) -- Load Repentance+ descriptions if EID.isRepentancePlus then EID.GameVersion = "rep+" if REPENTOGON then EID.GameVersion = "rgon" end EID:LoadLanguagePacks(EID.GameVersion) end end -- sort table after loading the languages in their specified order table.sort(EID.Languages) end