Переводы
Прочитать должен каждый

Перевод
Нужно было, чтобы всю игру можно было легко перевести на другой язык. После нескольких экспериментов я сделал для engine3 класс I18n. Пока это не более чем вот это.
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
В игре его потом можно использовать где угодно как глобальную функцию, вот так
-- 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"
Как видите, в language.yaml есть и язык ’en’, но со значением null. Это значит, что нужно использовать исходную английскую фразу. Так в будущем можно сразу переводить и английский в другие фразы.
en:
"Hello z" : "Hallo y"
nl:
"Hello z" : "Hallo y"
print(i18n:s("Hello z")) -- Hallo y
Пока этого достаточно, и всё, похоже, работает хорошо и быстро.