SyntaxGameServer/RCCService2020/ExtraContent/LuaPackages/Localization/LocalizationConsumer.lua

101 lines
3.1 KiB
Lua

local CorePackages = game:GetService("CorePackages")
local LocalizationService = game:GetService("LocalizationService")
local Roact = require(CorePackages.Roact)
local ExternalEventConnection = require(CorePackages.RoactUtilities.ExternalEventConnection)
local ArgCheck = require(CorePackages.ArgCheck)
local LocalizationKey = require(CorePackages.Localization.LocalizationKey)
local LocalizationConsumer = Roact.Component:extend("LocalizationConsumer")
function LocalizationConsumer:init()
local localization = self._context[LocalizationKey].localization
if localization == nil then
error("LocalizationConsumer must be below a LocalizationProvider.")
end
self.state = {
locale = LocalizationService.RobloxLocaleId,
}
self.updateLocalization = function(newLocale)
if settings():GetFFlag("AppBridgeStartupController") then
newLocale = localization:GetLocale()
end
if newLocale ~= self.state.locale then
self:setState({
locale = newLocale
})
end
end
if settings():GetFFlag("AppBridgeStartupController") then
self.connections = {
localization.changed:connect(self.updateLocalization)
}
end
end
function LocalizationConsumer:willUnmount()
if settings():GetFFlag("AppBridgeStartupController") then
for _, connection in pairs(self.connections) do
connection:disconnect()
end
end
end
function LocalizationConsumer:render()
local localization = self._context[LocalizationKey].localization
local render = self.props.render
local stringsToBeLocalized = self.props.stringsToBeLocalized
ArgCheck.isType(render, "function", "LocalizationConsumer.props.render")
ArgCheck.isType(stringsToBeLocalized, "table", "LocalizationConsumer.props.stringsToBeLocalized")
local localizedStrings = {}
for stringName, stringInfo in pairs(stringsToBeLocalized) do
if typeof(stringInfo) == "table" then
if typeof(stringInfo[1]) == "string" then
local success, result = pcall(function()
return localization:Format(stringInfo[1], stringInfo)
end)
ArgCheck.isEqual(success, true, string.format(
"LocalizationConsumer finding value for translation key[%s]: %s", stringName, stringInfo[1]))
localizedStrings[stringName] = success and result or ""
else
error(string.format("%s[1] in stringsToBeLocalized must be a string, got %s instead",
stringName, typeof(stringInfo[1])))
end
elseif typeof(stringInfo) == "string" then
local success, result = pcall(function()
return localization:Format(stringInfo)
end)
ArgCheck.isEqual(success, true, string.format(
"LocalizationConsumer finding value for translation key[%s]: %s", stringName, stringInfo))
localizedStrings[stringName] = success and result or ""
else
error(string.format("%s in stringsToBeLocalized must be a string or table, got %s instead",
stringName, typeof(stringInfo)))
end
end
if settings():GetFFlag("AppBridgeStartupController") then
return render(localizedStrings)
else
return Roact.createElement(ExternalEventConnection, {
event = LocalizationService:GetPropertyChangedSignal("RobloxLocaleId"),
callback = self.updateLocalization,
}, {
Component = render(localizedStrings),
})
end
end
return LocalizationConsumer