c1_lua/lua/app/common/i18n_manager.lua
2023-04-21 17:36:56 +08:00

376 lines
10 KiB
Lua

local GlobalConst = require "app/config/localization/localization_global_const"
local FontMgr = require "app/common/font_manager"
local I18N = {
configs = {},
cacheGlobalFormatParamSequnce = {},
cacheNormalFormatParamSequnce = {},
cacheGlobalIndex = 0,
}
I18N.GlobalConst = GlobalConst
local MONSTER_METATABLE = {
__index = function(t, k)
if rawget(t, k) == nil then
local realId = ConfigManager:getConfig("monster")[k].monster_baseid
local v = t._realConfig[realId]
if v then
rawset(t, k, v)
end
return v
end
return rawget(t, k)
end
}
local CONFIG_PATH = "app/config/strings/%s/"
local SUPPORT_LANGUAGE_LIST = {
GConst.LANGUAGE.ENGLISH,
GConst.LANGUAGE.CHINESE,
GConst.LANGUAGE.CHINESE_TC,
-- -- GConst.LANGUAGE.RUSSIAN, -- 俄罗斯
-- -- GConst.LANGUAGE.THAILAND, -- 泰国
-- GConst.LANGUAGE.INDONESIA, -- 印度尼西亚
-- GConst.LANGUAGE.VIETNAMESE, -- 越南
-- GConst.LANGUAGE.FRENCH, -- 法语
-- -- GConst.LANGUAGE.ITALIAN, -- 意大利
-- GConst.LANGUAGE.GERMAN, -- 德国
-- -- GConst.LANGUAGE.SPANISH, -- 西班牙
-- GConst.LANGUAGE.PORTUGUESE, -- 葡萄牙
-- -- GConst.LANGUAGE.TURKISH, -- 土耳其
-- -- GConst.LANGUAGE.MALAYSIA, -- 马来西亚
-- GConst.LANGUAGE.JAPANESE, -- 日本
-- GConst.LANGUAGE.KOREAN, -- 韩国
}
local SUPPORT_SERVER_LANGUAGE = {
[GConst.LANGUAGE.ENGLISH] = "en_US",
[GConst.LANGUAGE.CHINESE] = "zh_CN",
[GConst.LANGUAGE.CHINESE_TC] = "zh_TW",
[GConst.LANGUAGE.FRENCH] = "fr_FR",
[GConst.LANGUAGE.GERMAN] = "de_DE",
[GConst.LANGUAGE.RUSSIAN] = "ru_RU",
[GConst.LANGUAGE.THAILAND] = "th_TH",
[GConst.LANGUAGE.INDONESIA] = "in_ID",
[GConst.LANGUAGE.VIETNAMESE] = "vi_VN",
[GConst.LANGUAGE.JAPANESE] = "ja_JP",
[GConst.LANGUAGE.KOREAN] = "ko_KR",
}
local LANGUAGE_NAME_KEY = {
[GConst.LANGUAGE.ENGLISH] = 1,
[GConst.LANGUAGE.CHINESE] = 1,
[GConst.LANGUAGE.CHINESE_TC] = 1,
[GConst.LANGUAGE.FRENCH] = 1,
-- [GConst.LANGUAGE.ITALIAN] = 1,
[GConst.LANGUAGE.GERMAN] = 1,
-- [GConst.LANGUAGE.SPANISH] = 1,
-- [GConst.LANGUAGE.RUSSIAN] = 1,
[GConst.LANGUAGE.PORTUGUESE] = 1,
-- [GConst.LANGUAGE.TURKISH] = 1,
-- [GConst.LANGUAGE.THAILAND] = 1,
-- [GConst.LANGUAGE.MALAYSIA] = 1,
[GConst.LANGUAGE.INDONESIA] = 1,
[GConst.LANGUAGE.VIETNAMESE] = 1,
[GConst.LANGUAGE.JAPANESE] = 1,
[GConst.LANGUAGE.KOREAN] = 1,
}
local MOBILE_LANG_MAP = {
["en"] = GConst.LANGUAGE.ENGLISH,
["cn"] = GConst.LANGUAGE.CHINESE,
["zh"] = GConst.LANGUAGE.CHINESE_TC,
["fr"] = GConst.LANGUAGE.FRENCH,
["it"] = GConst.LANGUAGE.ITALIAN,
["de"] = GConst.LANGUAGE.GERMAN,
["es"] = GConst.LANGUAGE.SPANISH,
["ru"] = GConst.LANGUAGE.RUSSIAN,
["pt"] = GConst.LANGUAGE.PORTUGUESE,
["tr"] = GConst.LANGUAGE.TURKISH,
["th"] = GConst.LANGUAGE.THAILAND,
["ms"] = GConst.LANGUAGE.MALAYSIA,
["in"] = GConst.LANGUAGE.INDONESIA,
["vi"] = GConst.LANGUAGE.VIETNAMESE,
["ja"] = GConst.LANGUAGE.JAPANESE,
["ko"] = GConst.LANGUAGE.KOREAN,
}
local LANGUAGE_NOMARL_SPRITE = {
[GConst.LANGUAGE.ENGLISH] = "setting_language_en1",
[GConst.LANGUAGE.CHINESE] = "setting_language_cn1",
[GConst.LANGUAGE.CHINESE_TC] = "setting_language_tw1",
[GConst.LANGUAGE.FRENCH] = "setting_language_fr1",
[GConst.LANGUAGE.ITALIAN] = "setting_language_it1",
[GConst.LANGUAGE.GERMAN] = "setting_language_de1",
[GConst.LANGUAGE.SPANISH] = "setting_language_sp1",
[GConst.LANGUAGE.RUSSIAN] = "setting_language_ru1",
[GConst.LANGUAGE.PORTUGUESE] = "setting_language_pt1",
[GConst.LANGUAGE.TURKISH] = "setting_language_tr1",
[GConst.LANGUAGE.THAILAND] = "setting_language_th1",
[GConst.LANGUAGE.MALAYSIA] = "setting_language_ms1",
[GConst.LANGUAGE.INDONESIA] = "setting_language_id1",
}
local LANGUAGE_HIGHLIGHT_SPRITE = {
[GConst.LANGUAGE.ENGLISH] = "setting_language_en2",
[GConst.LANGUAGE.CHINESE] = "setting_language_cn2",
[GConst.LANGUAGE.CHINESE_TC] = "setting_language_tw2",
[GConst.LANGUAGE.FRENCH] = "setting_language_fr2",
[GConst.LANGUAGE.ITALIAN] = "setting_language_it2",
[GConst.LANGUAGE.GERMAN] = "setting_language_de2",
[GConst.LANGUAGE.SPANISH] = "setting_language_sp2",
[GConst.LANGUAGE.RUSSIAN] = "setting_language_ru2",
[GConst.LANGUAGE.PORTUGUESE] = "setting_language_pt2",
[GConst.LANGUAGE.TURKISH] = "setting_language_tr2",
[GConst.LANGUAGE.THAILAND] = "setting_language_th2",
[GConst.LANGUAGE.MALAYSIA] = "setting_language_ms2",
[GConst.LANGUAGE.INDONESIA] = "setting_language_id2",
}
function I18N:init()
local curLanguage = LocalData:getSelectedLanguage()
if curLanguage == "" or not self:supportLanguage(curLanguage) then
curLanguage = self:getSystemLanguage()
if curLanguage == nil then
curLanguage = CS.BF.BFPlatform.GetCurrentLanguageInfo():GetFallbackLanguage()
end
end
local changeStatus = self:setLanguage(curLanguage, true)
if changeStatus then
FontMgr:changeLanguage(self.curLanguage or GConst.LANGUAGE.ENGLISH)
end
end
function I18N:supportLanguage(language)
return LANGUAGE_NAME_KEY[language]
end
function I18N:setLanguage(language, firstInit)
if not self:supportLanguage(language) then
local fallbackLanguage = CS.BF.BFPlatform.GetCurrentLanguageInfo():GetFallbackLanguage()
language = fallbackLanguage
end
if not language or language == self.curLanguage then
return
end
LocalData:setSelectedLanguage(language)
self:clear()
self.curLanguage = language
self.configPath = string.format(CONFIG_PATH, self.curLanguage)
local monsterTable = {
_realConfig = false
}
setmetatable(monsterTable, MONSTER_METATABLE)
self.configs["monster"] = {
data = monsterTable,
}
if not firstInit then
self:preLoadConfig()
end
Logger.logHighlight("setLanguage = %s", language)
return true
end
function I18N:onFontLoaded(callback)
FontMgr:onFontLoaded(callback)
end
function I18N:preLoadConfig()
-- local config = self:getConfig("monster")
-- if not config._realConfig then
-- config._realConfig = require(self.configPath .. "monster_base").data
-- end
end
function I18N:clear()
for name, v in pairs(self.configs) do
self:clearConfigCache(name)
self.configs[name] = nil
end
--清除缓存
self.cacheGlobalFormatParamSequnce = {}
self.cacheNormalFormatParamSequnce = {}
self.cacheGlobalIndex = 0
end
function I18N:clearConfigCache(configName)
package.loaded[self.configPath .. configName] = nil
end
function I18N:getCurLanguage()
return self.curLanguage
end
function I18N:getLanguageSprite(language)
return LANGUAGE_NOMARL_SPRITE[language]
end
function I18N:getSeletedSprite(language)
return LANGUAGE_HIGHLIGHT_SPRITE[language]
end
function I18N:getSystemLanguage()
local sdkLanguage = CS.BF.BFMain.Instance.SDKMgr:GetLanguage()
print("I18N get sdk language " .. sdkLanguage)
local languageInfo = string.split(sdkLanguage, "_")
if not languageInfo or #languageInfo ~= 2 then
print("I18N return system language nil")
return nil
end
local language = languageInfo[1]
local country = languageInfo[2]
if language and language == "zh" then
if country and country == "CN" then
language = "cn"
end
end
language = MOBILE_LANG_MAP[language]
if not self:supportLanguage(language) then
language = nil
end
if language then
Logger.log("I18N return system language %s", language)
else
Logger.log("I18N return system language nil")
end
return language
end
function I18N:getSupportLanguageList()
return SUPPORT_LANGUAGE_LIST
end
function I18N:_getConfig(configName)
local config
if configName == "global" then
config = {}
config.data = require(self.configPath .. configName)
else
config = require(self.configPath .. configName)
end
self.configs[configName] = config
return config
end
function I18N:getConfig(configName)
local config = self.configs[configName]
if config == nil then
config = self:_getConfig(configName)
end
return config.data
end
if NOT_PUBLISH then
I18N.__getConfig = I18N.getConfig
function I18N:getConfig(configName)
if string.lower(configName) ~= configName then
Logger.logFatal("I18N:getConfig 传入的表名不能有大写 " .. configName)
end
return self:__getConfig(configName)
end
end
function I18N:getConfigWithOtherKey(configName, keyName)
local config = self.configs[configName]
if config == nil then
config = self:_getConfig(configName)
end
if config.keys == nil then
return nil
end
return config.keys[keyName]
end
function I18N:getConfigNum(configName)
local config = self.configs[configName]
if config == nil then
config = self:_getConfig(configName)
end
return config.count
end
function I18N:getGlobalText(key, ...)
local config = self:getConfig("global")
local str = config[key]
if str == nil then
return ""
end
if ... then
local param = {...}
if self.cacheGlobalFormatParamSequnce[key] then
self.cacheGlobalIndex = 0
str = string.gsub(str, '{%d+}', function (s)
self.cacheGlobalIndex = self.cacheGlobalIndex + 1
return tostring(param[self.cacheGlobalFormatParamSequnce[key][self.cacheGlobalIndex]])
end)
else
self.cacheGlobalFormatParamSequnce[key] = {}
str = string.gsub(str, '{%d+}', function (s)
self.cacheGlobalIndex = tonumber(string.sub(s, 2,-2)) + 1
table.insert(self.cacheGlobalFormatParamSequnce[key], self.cacheGlobalIndex)
return tostring(param[self.cacheGlobalIndex])
end)
end
end
return str
end
function I18N:getText(configName, index, key, ...)
local config = self:getConfig(configName)
local row = config[index]
if row == nil then
return ""
end
local str = row[key]
if str == nil then
return ""
end
if ... then
local param = {...}
key = configName .. index .. key
if self.cacheNormalFormatParamSequnce[key] then
self.cacheNormalIndex = 0
str = string.gsub(str, '{%d+}', function (s)
self.cacheNormalIndex = self.cacheNormalIndex + 1
return tostring(param[self.cacheNormalFormatParamSequnce[key][self.cacheNormalIndex]])
end)
else
self.cacheNormalFormatParamSequnce[key] = {}
str = string.gsub(str, '{%d+}', function (s)
self.cacheNormalIndex = tonumber(string.sub(s, 2,-2)) + 1
table.insert(self.cacheNormalFormatParamSequnce[key], self.cacheNormalIndex)
return tostring(param[self.cacheNormalIndex])
end)
end
end
return str
end
function I18N:getFallbackLanguage()
if not self.fallbackLanguage then
local languageInfo = CS.BF.BFPlatform.GetCurrentLanguageInfo()
self.fallbackLanguage = languageInfo:GetFallbackLanguage()
end
return self.fallbackLanguage
end
function I18N:getLanguageAndArea()
if SUPPORT_SERVER_LANGUAGE[self:getCurLanguage()] then
return SUPPORT_SERVER_LANGUAGE[self:getCurLanguage()]
end
return SUPPORT_SERVER_LANGUAGE[GConst.LANGUAGE.ENGLISH]
end
return I18N