From 75fc94e1f978b155c63a24b95d37d7be6332bc05 Mon Sep 17 00:00:00 2001
From: DarkGod <darkgod@net-core.org>
Date: Thu, 19 Mar 2020 11:03:26 +0100
Subject: [PATCH] support loading locales from engine, modules and addons

---
 game/engines/default/engine/I18N.lua   | 18 +++++++++++++++++-
 game/engines/default/engine/Module.lua | 14 +++++++-------
 game/engines/default/engine/init.lua   |  7 ++++---
 game/modules/tome/init.lua             |  2 +-
 4 files changed, 29 insertions(+), 12 deletions(-)

diff --git a/game/engines/default/engine/I18N.lua b/game/engines/default/engine/I18N.lua
index 19d4052151..7f13b1f499 100644
--- a/game/engines/default/engine/I18N.lua
+++ b/game/engines/default/engine/I18N.lua
@@ -103,12 +103,24 @@ function _M:loadLocale(file)
 		end,
 	}, {__index=getfenv(2)})
 	local f, err = util.loadfilemods(file, env)
-	if not f and err then error(err) end
+	if not f and err then
+		if config.settings.cheat then
+			error(err)
+		else
+			print("[I18N] ERROR, localization file ", file, "not loaded due to error:", err)
+			return
+		end
+	end
 	f()
+	print("[I18N] Loaded locale file:", file)
 end
 
 function _M:setLocale(lc)
 	cur_locale_name = lc
+	if not locales[lc] then locales[lc] = {} end
+	if not locales_args[lc] then locales_args[lc] = {} end
+	if not locales_special[lc] then locales_special[lc] = {} end
+	if not flags[lc] then flags[lc] = {} end
 	cur_locale = locales[lc] or {}
 	cur_locale_args = locales_args[lc] or {}
 	cur_locale_special = locales_special[lc] or {}
@@ -155,6 +167,10 @@ function _M.setFlag(lc, flag, data)
 	end
 end
 
+function _M:getLocalesData()
+	return cur_locale_name, cur_locale, cur_locale_args, cur_locale_special, cur_flags, "::", locales, locales_args, locales_special, flags
+end
+
 function _M:test()
 	self:loadLocale("/data/locales/fr_FR.lua")
 	self:setLocale("fr_FR")
diff --git a/game/engines/default/engine/Module.lua b/game/engines/default/engine/Module.lua
index 0802bca18d..caf98cb10a 100644
--- a/game/engines/default/engine/Module.lua
+++ b/game/engines/default/engine/Module.lua
@@ -501,6 +501,11 @@ function _M:loadAddon(mod, add, hashlist, hooks_list)
 		elseif add.teaa then fs.mount("subdir:/data/|"..fs.getRealPath(add.teaa), "/data-"..add.short_name, true)
 		else fs.mount(base.."/data", "/data-"..add.short_name, true)
 		end
+
+		-- Load localizations, addons just need to provide the file and it's autoloaded
+		if mod.i18n_support and config.settings.locale then
+			I18N:loadLocale("/data-"..add.short_name.."/locales/"..config.settings.locale..".lua")
+		end
 	end
 	if add.superload then 
 		print(" * with superload")
@@ -939,14 +944,9 @@ function _M:instanciate(mod, name, new_game, no_reboot, extra_module_info)
 	mod.load("setup")
 
 	-- Load localizations
-	if mod.i18n_support then
-		local locale = config.settings.locale or "en_US"
-		I18N:setLocale(locale)
-		I18N:loadLocale("/data/i18n/"..locale..".lua")
+	if mod.i18n_support and config.settings.locale then
+		I18N:loadLocale("/data/locales/"..config.settings.locale..".lua")
 	end
-	
-	-- I18N:loadLocale("/data/locales/zh_hans.lua")
-	-- I18N:setLocale("zh_hans")
 
 	-- Load font packages
 	FontPackage:loadDefinition("/data/font/packages/default.lua")
diff --git a/game/engines/default/engine/init.lua b/game/engines/default/engine/init.lua
index f2399cef30..fc440e2572 100644
--- a/game/engines/default/engine/init.lua
+++ b/game/engines/default/engine/init.lua
@@ -125,9 +125,10 @@ if core.display.safeMode() then
 	config.settings.window = {size='800x600 Windowed'}
 end
 
--- I18N:loadLocale("/data/locales/zh_hans.lua")
--- I18N:setLocale("zh_hans")
-
+if config.settings.locale then
+	I18N:loadLocale("/data/locales/engine/"..config.settings.locale..".lua")
+	I18N:setLocale(config.settings.locale)
+end
 
 -- Default resolution as big as possible
 if not config.settings.window or not config.settings.window.size then
diff --git a/game/modules/tome/init.lua b/game/modules/tome/init.lua
index 46ae2bad68..d8bf4a959b 100644
--- a/game/modules/tome/init.lua
+++ b/game/modules/tome/init.lua
@@ -61,7 +61,7 @@ teams = {
 
 i18n_support = true
 show_funfacts = true
-loading_wait_ticks = 260
+loading_wait_ticks = 280
 profile_stats_fields = {"artifacts", "characters", "deaths", "uniques", "scores", "lore", "escorts"}
 allow_userchat = true -- We can talk to the online community
 no_get_name = true -- Name setting for new characters is done by the module itself
-- 
GitLab