Übersetzungen
Jeder muss es lesen können

Übersetzung
Es sollte möglich sein, das komplette Spiel einfach in eine andere Sprache zu übersetzen. Nach ein paar Experimenten habe ich für engine3 die Klasse I18n gebaut. Im Moment ist sie nicht mehr als das hier.
function I18n:new()
self.locale = nil
self.currentLocaleFile = nil
end
--- Convert string to i18n locale
---@param str? string
---@param replacements? table
function I18n:s(str, replacements)
if str == nil then
return
end
local strOut = tostring(str)
-- Maybe there is a overwrite
if self.locale[strOut] ~= nil then
strOut = self.locale[strOut]
end
-- Maybe there are replacements
if replacements then
return string.gsub(strOut, "[%%%d]+", replacements)
end
return strOut
end
---@param file string
---@param data table
function I18n:createI18nData(file, data)
self.locale = data
self.currentLocaleFile = file
end
--- Load the locale in memory
---@param file string Path to the source file .mp only at the moment
function I18n:load(file)
if type(file) ~= "string" then
error("Cannot load i18n file, is not a string")
end
if string.find(file, ".mp") == nil then
error("i18n file is is not supported: " .. file)
end
local msgPackData = Msgpack:load(file)
if msgPackData == nil then
error("File data is nil for file: " .. file)
return
end
self:createI18nData(file, msgPackData)
end
Im Spiel kann sie dann als globale Funktion überall so verwendet werden
-- load the selected language once
i18n:load(config.localeDefault) -- nl.mp
-- use the default english strings into the selected language
local i18nHoverText = i18n:s("Hello")
language.yaml
en:
"Hello" : null
nl:
"Hello" : "Hallo"
Wie du siehst, steht auch die Sprache ’en’ in der language.yaml, aber mit dem Wert null. Das bedeutet, dass der originale englische Satz verwendet werden soll. Damit ist es in Zukunft auch gleich möglich, das Englische in andere Sätze zu übersetzen.
en:
"Hello z" : "Hallo y"
nl:
"Hello z" : "Hallo y"
print(i18n:s("Hello z")) -- Hallo y
Für den Moment reicht das alles und scheint gut und schnell zu funktionieren.