tibia-client/modules/client_locales/locales.lua

139 lines
4.0 KiB
Lua
Raw Normal View History

2012-04-27 08:52:49 +02:00
-- TIP: to find all possible translations in the modules directory use the following command
2012-04-27 22:21:11 +02:00
-- find \( -name "*.lua" -o -name "*.otui" \) -exec grep -oE "tr\\('(\\\\'|[^'])*'" {} \; -exec grep -oE "tr\\(\"(\\\\\"|[^\"])*" {} \; | sort | uniq | sed "s/^tr(.\(.*\).$/[\"\1\"] = nil,/"
2012-04-27 08:52:49 +02:00
2012-04-26 04:57:56 +02:00
Locales = { }
-- private variables
2012-04-27 08:52:49 +02:00
local defaultLocaleName = 'en'
2012-04-26 04:57:56 +02:00
local installedLocales
local currentLocale
2012-04-27 00:28:31 +02:00
local localeComboBox
-- private functions
local function sendLocale(localeName)
local protocolGame = g_game.getProtocolGame()
if protocolGame then
2012-07-06 07:00:49 +02:00
protocolGame:sendExtendedOpcode(ExtendedLocales, localeName)
return true
end
return false
end
2012-04-27 00:28:31 +02:00
local function onLocaleComboBoxOptionChange(self, optionText, optionData)
if Locales.setLocale(optionData) then
2012-06-26 00:13:30 +02:00
g_settings.set('locale', optionData)
sendLocale(currentLocale.name)
2012-06-26 00:13:30 +02:00
g_modules.reloadModules()
end
end
-- hooked functions
local function onGameStart()
sendLocale(currentLocale.name)
end
2012-07-06 07:00:49 +02:00
local function onExtendedLocales(protocol, opcode, buffer)
local locale = installedLocales[buffer]
if locale then
localeComboBox:setCurrentOption(locale.languageName)
end
2012-04-27 00:28:31 +02:00
end
2012-04-26 04:57:56 +02:00
-- public functions
function Locales.init()
installedLocales = {}
2012-04-26 18:45:25 +02:00
Locales.installLocales('locales')
2012-04-26 04:57:56 +02:00
2012-06-26 00:13:30 +02:00
local userLocaleName = g_settings.get('locale', 'false')
if userLocaleName ~= 'false' and Locales.setLocale(userLocaleName) then
pdebug('Using configured locale: ' .. userLocaleName)
else
pdebug('Using default locale: ' .. defaultLocaleName)
Locales.setLocale(defaultLocaleName)
2012-06-26 00:13:30 +02:00
g_settings.set('locale', defaultLocaleName)
2012-04-26 04:57:56 +02:00
end
2012-04-27 08:52:49 +02:00
2012-04-27 00:28:31 +02:00
addEvent( function()
2012-06-26 00:13:30 +02:00
localeComboBox = g_ui.createWidget('ComboBox', rootWidget:recursiveGetChildById('rightButtonsPanel'))
2012-04-27 00:28:31 +02:00
for key,value in pairs(installedLocales) do
localeComboBox:addOption(value.languageName, value.name)
end
localeComboBox:setCurrentOption(currentLocale.languageName)
localeComboBox.onOptionChange = onLocaleComboBoxOptionChange
end, false)
2012-07-06 07:00:49 +02:00
Extended.register(ExtendedLocales, onExtendedLocales)
connect(g_game, { onGameStart = onGameStart })
2012-04-26 04:57:56 +02:00
end
function Locales.terminate()
installedLocales = nil
currentLocale = nil
2012-04-27 00:28:31 +02:00
localeComboBox = nil
2012-07-06 07:00:49 +02:00
Extended.unregister(ExtendedLocales)
disconnect(g_game, { onGameStart = onGameStart })
2012-04-26 04:57:56 +02:00
end
function Locales.installLocale(locale)
if not locale or not locale.name then
error('Unable to install locale.')
2012-04-26 04:57:56 +02:00
end
2012-04-26 18:45:25 +02:00
local installedLocale = installedLocales[locale.name]
if installedLocale then
for word,translation in pairs(locale.translation) do
installedLocale.translation[word] = translation
end
else
installedLocales[locale.name] = locale
if localeComboBox then
localeComboBox.onOptionChange = nil
localeComboBox:addOption(locale.languageName, locale.name)
localeComboBox.onOptionChange = onLocaleComboBoxOptionChange
end
2012-04-26 18:45:25 +02:00
end
end
function Locales.installLocales(directory)
dofiles(directory)
2012-04-26 04:57:56 +02:00
end
function Locales.setLocale(name)
local locale = installedLocales[name]
if not locale then
pwarning("Locale " .. name .. ' does not exist.')
2012-04-27 08:52:49 +02:00
return false
2012-04-26 04:57:56 +02:00
end
currentLocale = locale
2012-04-27 08:52:49 +02:00
return true
2012-04-26 04:57:56 +02:00
end
-- global function used to translate texts
2012-04-26 04:57:56 +02:00
function tr(text, ...)
if currentLocale then
if tonumber(text) then
2012-04-26 18:45:25 +02:00
-- 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()
2012-04-26 04:57:56 +02:00
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
2012-04-26 04:57:56 +02:00
end
return string.format(translation, ...)
2012-04-26 04:57:56 +02:00
end
end
return text
end