diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6ec2e510f9715e943f9b6f3e3983a1903cb7a3eb..68d66780c72d7f8379ef185956280ea386fb7178 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
 
 ## [Unreleased]
 
+### Changed
+
+- Update intllib support to avoid using deprecated functions.
+
 ### Added
 
 - Brazilian and Dutch translations.
diff --git a/init.lua b/init.lua
index 08bc0a67864d65fae726089f572db83461833c77..e3897781dc0342abc095fff97cbae88d8a1cb462 100644
--- a/init.lua
+++ b/init.lua
@@ -10,15 +10,12 @@ Licensed under the zlib license. See LICENSE.md for more information.
 
 moreores = {}
 
-local S
-if minetest.get_modpath("intllib") then
-	S = intllib.Getter()
-else
-	S = function(s) return s end
-end
-
 local modpath = minetest.get_modpath("moreores")
 
+local S, NS = dofile(modpath .. "/intllib.lua")
+moreores.S = S
+moreores.NS = NS
+
 dofile(modpath .. "/_config.txt")
 
 -- `mg` mapgen support
diff --git a/intllib.lua b/intllib.lua
new file mode 100644
index 0000000000000000000000000000000000000000..c7af2c2b038cbdd8afe23d7dfb23aa741a91c0f7
--- /dev/null
+++ b/intllib.lua
@@ -0,0 +1,44 @@
+-- Fallback functions for when `intllib` is not installed.
+-- Code released under Unlicense <http://unlicense.org>.
+
+-- Get the latest version of this file at:
+--   https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua
+
+local function format(str, ...)
+	local args = { ... }
+	local function repl(escape, open, num, close)
+		if escape == "" then
+			local replacement = tostring(args[tonumber(num)])
+			if open == "" then
+				replacement = replacement..close
+			end
+			return replacement
+		else
+			return "@"..open..num..close
+		end
+	end
+	return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl))
+end
+
+local gettext, ngettext
+if minetest.get_modpath("intllib") then
+	if intllib.make_gettext_pair then
+		-- New method using gettext.
+		gettext, ngettext = intllib.make_gettext_pair()
+	else
+		-- Old method using text files.
+		gettext = intllib.Getter()
+	end
+end
+
+-- Fill in missing functions.
+
+gettext = gettext or function(msgid, ...)
+	return format(msgid, ...)
+end
+
+ngettext = ngettext or function(msgid, msgid_plural, n, ...)
+	return format(n==1 and msgid or msgid_plural, ...)
+end
+
+return gettext, ngettext