Logo Signal From The Stars

Vertalingen

Iedereen moet het kunnen lezen

Martin avatar
  • Martin
  • 2 min read
zo veel mogelijk talen

Vertaling

Het moest mogelijk zijn om eenvoudig het complete spel te vertalen naar een andere taal. Na wat experimenten heb ik voor engine3 de I18n class gemaakt. Op dit moment is het niet meer dan dit.

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

In het spel kan het vervolgens al global function overal gebruikt worden op de volgende manier

-- 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"

Zoals je kunt zien staat ook de ’en’ taal in de language.yaml maar die heeft als value null. Dit betekend dat de originele engelse zin gebruikt moet worden. Hiermee is het meteen mogelijk om in de toekomst ook het engelse te vertalen naar andere zinnen.

en:
    "Hello z" : "Hallo y"
nl:
    "Hello z" : "Hallo y"
print(i18n:s("Hello z")) -- Hallo y

Voor nu is dit allemaal afdoende en lijkt goed en snel te werken.