Browse Source

[CSM] Fix and improve minetest.get_language()

Previously this method would accidentally reset the locale
and break everything.
sfan5 4 years ago
parent
commit
c44318a253
3 changed files with 21 additions and 9 deletions
  1. 11 6
      clientmods/preview/init.lua
  2. 3 1
      doc/client_lua_api.txt
  3. 7 2
      src/script/lua_api/l_client.cpp

+ 11 - 6
clientmods/preview/init.lua

@@ -9,13 +9,18 @@ core.register_on_shutdown(function()
 end)
 local id = nil
 
-local server_info = core.get_server_info()
-print("Server version: " .. server_info.protocol_version)
-print("Server ip: " .. server_info.ip)
-print("Server address: " .. server_info.address)
-print("Server port: " .. server_info.port)
+do
+	local server_info = core.get_server_info()
+	print("Server version: " .. server_info.protocol_version)
+	print("Server ip: " .. server_info.ip)
+	print("Server address: " .. server_info.address)
+	print("Server port: " .. server_info.port)
 
-print("CSM restrictions: " .. dump(core.get_csm_restrictions()))
+	print("CSM restrictions: " .. dump(core.get_csm_restrictions()))
+
+	local l1, l2 = core.get_language()
+	print("Configured language: " .. l1 .. " / " .. l2)
+end
 
 mod_channel = core.mod_channel_join("experimental_preview")
 

+ 3 - 1
doc/client_lua_api.txt

@@ -634,7 +634,9 @@ Minetest namespace reference
    the trailing separator. This is useful to load additional Lua files
    contained in your mod:
    e.g. `dofile(minetest.get_modpath(minetest.get_current_modname()) .. "stuff.lua")`
-* `minetest.get_language()`: returns the currently set gettext language.
+* `minetest.get_language()`: returns two strings
+   * the current gettext locale
+   * the current language code (the same as used for client-side translations)
 * `minetest.get_version()`: returns a table containing components of the
    engine version.  Components:
     * `project`: Name of the project, eg, "Minetest"

+ 7 - 2
src/script/lua_api/l_client.cpp

@@ -230,9 +230,14 @@ int ModApiClient::l_get_node_or_nil(lua_State *L)
 
 int ModApiClient::l_get_language(lua_State *L)
 {
-	char *locale = setlocale(LC_ALL, "");
+	char *locale = setlocale(LC_MESSAGES, NULL);
+	std::string lang = gettext("LANG_CODE");
+	if (lang == "LANG_CODE")
+		lang = "";
+
 	lua_pushstring(L, locale);
-	return 1;
+	lua_pushstring(L, lang.c_str());
+	return 2;
 }
 
 int ModApiClient::l_get_wielded_item(lua_State *L)