137 lines
3.8 KiB
Lua
137 lines
3.8 KiB
Lua
-- TIP: to find all possible translations in the modules directory use the following command
|
|
-- find \( -name "*.lua" -o -name "*.otui" \) -exec grep -oE "tr\\('(\\\\'|[^'])*'" {} \; -exec grep -oE "tr\\(\"(\\\\\"|[^\"])*" {} \; | sort | uniq | sed "s/^tr(.\(.*\).$/[\"\1\"] = nil,/"
|
|
|
|
Locales = { }
|
|
|
|
-- private variables
|
|
local defaultLocaleName = 'en'
|
|
local installedLocales
|
|
local currentLocale
|
|
local localeComboBox
|
|
|
|
-- private functions
|
|
local function sendLocale(localeName)
|
|
local protocolGame = g_game.getProtocolGame()
|
|
if protocolGame then
|
|
protocolGame:sendExtendedOpcode(1, localeName)
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
local function onLocaleComboBoxOptionChange(self, optionText, optionData)
|
|
if Locales.setLocale(optionData) then
|
|
Settings.set('locale', optionData)
|
|
sendLocale(currentLocale.name)
|
|
reloadModules()
|
|
end
|
|
end
|
|
|
|
-- hooked functions
|
|
local function onGameStart()
|
|
sendLocale(currentLocale.name)
|
|
end
|
|
|
|
local function onServerSetLocale(protocol, opcode, buffer)
|
|
local locale = installedLocales[buffer]
|
|
if locale then
|
|
localeComboBox:setCurrentOption(locale.languageName)
|
|
end
|
|
end
|
|
|
|
-- public functions
|
|
function Locales.init()
|
|
installedLocales = {}
|
|
|
|
Locales.installLocales('locales')
|
|
|
|
local userLocaleName = Settings.get('locale')
|
|
if userLocaleName and Locales.setLocale(userLocaleName) then
|
|
pdebug('Using configured locale: ' .. userLocaleName)
|
|
else
|
|
pdebug('Using default locale: ' .. defaultLocaleName)
|
|
Locales.setLocale(defaultLocaleName)
|
|
Settings.set('locale', defaultLocaleName)
|
|
end
|
|
|
|
addEvent( function()
|
|
localeComboBox = createWidget('ComboBox', rootWidget:recursiveGetChildById('rightButtonsPanel'))
|
|
for key,value in pairs(installedLocales) do
|
|
localeComboBox:addOption(value.languageName, value.name)
|
|
end
|
|
localeComboBox:setCurrentOption(currentLocale.languageName)
|
|
localeComboBox.onOptionChange = onLocaleComboBoxOptionChange
|
|
end, false)
|
|
|
|
Extended.register(1, onServerSetLocale)
|
|
connect(g_game, { onGameStart = onGameStart })
|
|
end
|
|
|
|
function Locales.terminate()
|
|
installedLocales = nil
|
|
currentLocale = nil
|
|
localeComboBox = nil
|
|
Extended.unregister(1)
|
|
disconnect(g_game, { onGameStart = onGameStart })
|
|
end
|
|
|
|
function Locales.installLocale(locale)
|
|
if not locale or not locale.name then
|
|
error('Unable to install locale.')
|
|
end
|
|
|
|
local installedLocale = installedLocales[locale.name]
|
|
if installedLocale then
|
|
-- combine translations replacing with new if already exists
|
|
for word,translation in pairs(locale.translation) do
|
|
installedLocale.translation[word] = translation
|
|
end
|
|
else
|
|
installedLocales[locale.name] = locale
|
|
|
|
-- update combobox
|
|
end
|
|
end
|
|
|
|
function Locales.installLocales(directory)
|
|
dofiles(directory)
|
|
end
|
|
|
|
function Locales.setLocale(name)
|
|
local locale = installedLocales[name]
|
|
if not locale then
|
|
pwarning("Locale " .. name .. ' does not exist.')
|
|
return false
|
|
end
|
|
currentLocale = locale
|
|
return true
|
|
end
|
|
|
|
-- global function used to translate texts
|
|
function tr(text, ...)
|
|
if currentLocale then
|
|
if tonumber(text) then
|
|
-- todo: use locale information to calculate this. also detect floating numbers
|
|
local out = ''
|
|
local number = tostring(text):reverse()
|
|
for i=1,#number do
|
|
out = out .. number:sub(i, i)
|
|
if i % 3 == 0 and i ~= #number then
|
|
out = out .. ','
|
|
end
|
|
end
|
|
return out:reverse()
|
|
elseif tostring(text) then
|
|
local translation = currentLocale.translation[text]
|
|
if not translation then
|
|
if currentLocale.name ~= defaultLocaleName then
|
|
pwarning('Unable to translate: \"' .. text .. '\"')
|
|
end
|
|
translation = text
|
|
end
|
|
return string.format(translation, ...)
|
|
end
|
|
end
|
|
return text
|
|
end
|