local Localization = {} local JSON = require("cjson") local LocalizationCfg = require "Localization/LocalizationCfg" local LocalizationRegionCfg = require "Localization/LocalizationRegionCfg" local LocalizationParamOrderCfg = require "Localization/LocalizationParamOrderCfg" local private = {} local LocalSaveLanguageKey = "JWS2_LANGUAGE" local RegionValueKey = "JWS2_RegionValue" local RegionName = "hmt" --当前的游戏语言 Chinese local curLanguage --当前的sdk语言zh-CN local curLanguage2Server --当前的语言配置信息LanguageData local curLanguageData --日本需要屏蔽一些玩法,统一通过这个变量来控制 Localization.DisableSpecifiedFunctionsInJapan = false function Localization.SwitchLanguage(language) curLanguage = language curLanguage2Server = LocalizationCfg.GameToSdkLanguage(curLanguage) curLanguageData = DataSheetManager.LanguageData:GetDataByID(curLanguage) private.SaveLocalLanguage() end function Localization.GetLanguage() return curLanguage end function Localization.GetLanguage2Server() return curLanguage2Server end function Localization.GetDefaultState() return curLanguageData.DefaultState end function Localization.GetFileName() return curLanguageData.FileName end --获取数字转换单位(万) function Localization.GetCountUnit() return curLanguageData.Conversion end --获取数字转换单位(亿) function Localization.GetHundredMillionCountUnit() return curLanguageData.Conversion2 end function Localization.GetLanguageIDS(language) return DataSheetManager.LanguageData:GetDataByID(language).NameIDS end function Localization.GetSwitchLanguages() return LocalizationCfg.GetSwitchLanguages(GameAppInfo.Global_PackageType) end function Localization.GetImageDefaultPath() return curLanguageData.DefaultPath end function Localization.GetLanguageIndex(language) local region = LocalizationCfg.RegionLanguage[GameAppInfo.Global_PackageType] if region then for i,v in ipairs(region.SwitchLanguages) do if v == language then return i end end end return 1 end function Localization.GetLanguageByIndex(index) local region = LocalizationCfg.RegionLanguage[GameAppInfo.Global_PackageType] if region then return region.SwitchLanguages[index] end return curLanguage end --获取系统设备语言 function private.GetDeviceLanguage() logging.log(LTAG.LOG," GetDeviceLanguage Start") local systemLanguage = "zh-CN" logging.log(LTAG.LOG," GetDeviceLanguage ",systemLanguage) if systemLanguage then return LocalizationCfg.SdkToGameLanguage[systemLanguage] end end --获取系统本地存储语言 function private.GetGameLocalSaveLanguage() return PersistentData.DeviceData:Get(LocalSaveLanguageKey) end function private.Init() logging.log(LTAG.LOG," private.Init Start ",GameAppInfo.Global_PackageType) LocalizationCfg.Init(GameAppInfo.Global_PackageType, AppInfo.isOfficial) AuxUtil.GetFileNameFunc = Localization.GetFileName AuxUtil.GetDefaultPathFunc = Localization.GetImageDefaultPath AuxUtil.GetDefaultStateFunc = Localization.GetDefaultState AuxUtil.GetAbbreviationFunc = Localization.GetLanguage2Server local language = private.GetGameLocalSaveLanguage() local region = LocalizationCfg.RegionLanguage[GameAppInfo.Global_PackageType] if string.isNilOrEmpty(language) then curLanguage = private.GetDeviceLanguage() if curLanguage == nil then if region then curLanguage = region.language end end else curLanguage = language end --检测语言是否在语言列表中 if region and not table.containValue(region.SwitchLanguages, curLanguage) then curLanguage = region.language end curLanguage2Server = LocalizationCfg.GameToSdkLanguage(curLanguage) if language ~= curLanguage then private.SaveLocalLanguage() end Localization.InitParamOrderCfg() local ret,content = pcall(private.InitRegionId) if not ret then logging.error(LTAG.ERROR, "InitRegionId error ", content) end end function Localization.OnUncompressInternalFinish() curLanguageData = DataSheetManager.LanguageData:GetDataByID(curLanguage) Localization.DisableSpecifiedFunctionsInJapan = GameAppInfo.IsJapanesePackage() if GameAppInfo.IsVersionGreaterThan19000() then AuxUtil.SetNoBreakingSpace(Localization.IsAllChinese() or Localization.IsJapanese()) end end function private.SaveLocalLanguage() if not GameAppInfo.IsVersionGreaterThan119000() then UIUtils.SavePlayerPrefsStrValue(LocalSaveLanguageKey, curLanguage) end PersistentData.DeviceData:Set(LocalSaveLanguageKey, curLanguage, true) end function private.IsContainsLanguage(language,region) return table.containValue(region, language) end --运营活动文本,多语言解析 function Localization.GetOperationActivityLabel(json) if string.isNilOrEmpty(json) then return "OPACT_CONTENT_NIL" end local ret,content = pcall(JSON.decode,json) if ret and type(content) == 'table' then if content[curLanguage2Server] then return content[curLanguage2Server] else local switchLanguages = Localization.GetSwitchLanguages() for __, language in ipairs(switchLanguages) do if LocalizationCfg.GameToSdkLanguage(language) and content[LocalizationCfg.GameToSdkLanguage(language)] then return "OPACT_CONTENT_NOT_FOUND" end end end return content["common"] or "OPACT_CONTENT_NOT_FOUND" end return json end function Localization.GetCurLanguageText(content, defaultLanguage) if content[curLanguage2Server] then --玩家设备的系统语言 return content[curLanguage2Server] else --匹配系统语言,匹配不到返回默认语言 local switchLanguages = Localization.GetSwitchLanguages() for _, language in ipairs(switchLanguages) do local sdkLanguage = LocalizationCfg.GameToSdkLanguage(language) if sdkLanguage and content[sdkLanguage] then return content[sdkLanguage] end end end return content[defaultLanguage] end function Localization.InitParamOrderCfg() LocalizationParamOrderCfg.InitParamOrderCfg() end --设置参数顺序信息,idsId,参数顺序(2,1,3) function Localization.SetParamOrderData(idsId, ...) LocalizationParamOrderCfg.SetParamOrderData(idsId, ...) end function Localization.GetParamOrderEnumerator(idsId) return LocalizationParamOrderCfg.GetParamOrderEnumerator(idsId) end function Localization.HasParamOrderCfg(idsId) return LocalizationParamOrderCfg.HasParamOrderCfg(idsId) end function Localization.IsSwitchLanguage() return Localization.GetSwitchLanguages() and #Localization.GetSwitchLanguages() > 1 end --中文语言 function Localization.IsChinese() local language = Localization.GetLanguage() return language == LocalizationCfg.LANGUAGE_SC_WORLD or language == LocalizationCfg.LANGUAGE_SC_CHINA end --中文语言包括繁体 function Localization.IsAllChinese() return Localization.IsChinese() or Localization.IsTraditional() end --繁体中文 function Localization.IsTraditional() return Localization.GetLanguage() == LocalizationCfg.LANGUAGE_TRADITIONAL end function Localization.IsJapanese() return Localization.GetLanguage() == LocalizationCfg.LANGUAGE_JAPANESE end function Localization.IsVietnamese() return Localization.GetLanguage() == LocalizationCfg.LANGUAGE_VIETNAMESE end function Localization.IsEnglish() return Localization.GetLanguage() == LocalizationCfg.LANGUAGE_ENGLISH end function Localization.IsKorean() return Localization.GetLanguage() == LocalizationCfg.LANGUAGE_KOREAN end function Localization.IsIndonesian() return Localization.GetLanguage() == LocalizationCfg.LANGUAGE_INDONESIAN end function Localization.IsThailand() return Localization.GetLanguage() == LocalizationCfg.LANGUAGE_THAI end function private.InitRegionId() if GameAppInfo.IsOpenRegion() then local region = PersistentData.DeviceData:Get(RegionValueKey) if not string.isNilOrEmpty(region) then GameAppInfo.ResetProductId(region) for i,v in LocalizationRegionCfg.GetRegionTypeDataSheetIterator() do if GameAppInfo.Global_ProductId == v.Number then RegionName = v.Name end end else local timeZone = private.GetTimeZone() local regionId = LocalizationRegionCfg.GetRegionIdByTimeZone(timeZone) if regionId then local regionType = LocalizationRegionCfg.GetRegionTypeDataById(regionId) GameAppInfo.ResetProductId(regionType.Number) RegionName = regionType.Name else logging.error(LTAG.ERROR, "时区对应的大区异常", timeZone) end end end end function Localization.SaveRegion() logging.crit(LTAG.CRIT, "SaveRegion", GameAppInfo.Global_ProductId) PersistentData.DeviceData:Set(RegionValueKey, GameAppInfo.Global_ProductId, true) end function private.GetTimeZone() local now = os.time() local localutcseconds = os.difftime(now, os.time(os.date("!*t", now))) return math.floor(localutcseconds / 3600) end function Localization.GetRegionName() if GameAppInfo.IsOpenRegion() then return RegionName else if DEF.Package_PostType == "mirror" and GameAppInfo.IsOverseaPackage() then for i,v in LocalizationRegionCfg.GetRegionTypeDataSheetIterator() do if GameAppInfo.Global_ProductId == v.Number then return v.Name end end end return GameAppInfo.Global_PackageType end end function Localization.IsShowNTSDKSwichAccountBtn() if GameAppInfo.IsJapanesePackage() then local res if UNITY_ANDROID then res = LuaConst.SDKLoginType.Android[GameAppInfo.Global_PackageType] elseif UNITY_IOS then res = LuaConst.SDKLoginType.iOS[GameAppInfo.Global_PackageType] else res = LuaConst.SDKLoginType.default[GameAppInfo.Global_PackageType] end local splitRes = string.split(res,",") if #splitRes <= 1 then return false end end return true end private.Init() return Localization