using System; using System.Collections.Generic; using System.IO; using System.Linq; using UnityEditor; using UnityEngine; using Object = UnityEngine.Object; namespace I2.Loc { [InitializeOnLoad] public class UpgradeManager { static bool mAlreadyCheckedPlugins; static UpgradeManager() { EditorApplication.update += AutoCheckPlugins; } public static void AutoCheckPlugins() { CheckPlugins (); } public static void CheckPlugins( bool bForce = false ) { EditorApplication.update -= AutoCheckPlugins; if (mAlreadyCheckedPlugins && !bForce) return; mAlreadyCheckedPlugins = true; EnablePlugins(bForce); CreateLanguageSources(); //CreateScriptLocalization(); } const string EditorPrefs_AutoEnablePlugins = "I2Loc AutoEnablePlugins"; [MenuItem( "Tools/I2 Localization/Enable Plugins/Force Detection", false, 0 )] public static void ForceCheckPlugins() { CheckPlugins( true ); } [MenuItem( "Tools/I2 Localization/Enable Plugins/Enable Auto Detection", false, 1 )] public static void EnableAutoCheckPlugins() { EditorPrefs.SetBool(EditorPrefs_AutoEnablePlugins, true); } [MenuItem( "Tools/I2 Localization/Enable Plugins/Enable Auto Detection", true)] public static bool ValidEnableAutoCheckPlugins() { return !EditorPrefs.GetBool(EditorPrefs_AutoEnablePlugins, true); } [MenuItem( "Tools/I2 Localization/Enable Plugins/Disable Auto Detection", false, 2 )] public static void DisableAutoCheckPlugins() { EditorPrefs.SetBool(EditorPrefs_AutoEnablePlugins, false); } [MenuItem( "Tools/I2 Localization/Enable Plugins/Disable Auto Detection", true)] public static bool ValidDisableAutoCheckPlugins() { return EditorPrefs.GetBool(EditorPrefs_AutoEnablePlugins, true); } [MenuItem("Tools/I2 Localization/Toggle Highlight Localized", false, 17)] public static void ToogleH() { LocalizationManager.HighlightLocalizedTargets = !LocalizationManager.HighlightLocalizedTargets; LocalizationManager.LocalizeAll(true); } [MenuItem("Tools/I2 Localization/Create Temp")] public static void CreateTemp() { LanguageSourceData source = LocalizationManager.Sources[0]; for (int i = 0; i < 1000; ++i) source.AddTerm("Term " + i, eTermType.Text, false); source.UpdateDictionary(true); } public static void EnablePlugins( bool bForce = false ) { if (!bForce) { bool AutoEnablePlugins = EditorPrefs.GetBool(EditorPrefs_AutoEnablePlugins, true); if (!AutoEnablePlugins) return; } //var tar = System.Enum.GetValues(typeof(BuildTargetGroup)); foreach (BuildTargetGroup target in Enum.GetValues(typeof(BuildTargetGroup))) if (target!=BuildTargetGroup.Unknown && !target.HasAttributeOfType()) { #if UNITY_5_6 if (target == BuildTargetGroup.Switch) continue; // some releases of 5.6 defined BuildTargetGroup.Switch but didn't handled it correctly #endif EnablePluginsOnPlatform( target ); } // Force these one (iPhone has the same # than iOS and iPhone is deprecated, so iOS was been skipped) EnablePluginsOnPlatform(BuildTargetGroup.iOS); } static void EnablePluginsOnPlatform( BuildTargetGroup Platform ) { string Settings = PlayerSettings.GetScriptingDefineSymbolsForGroup(Platform ); bool HasChanged = false; List symbols = new List( Settings.Split(';')); HasChanged |= UpdateSettings("NGUI", "NGUIDebug", "", ref symbols); HasChanged |= UpdateSettings("DFGUI", "dfPanel", "", ref symbols); HasChanged |= UpdateSettings("TK2D", "tk2dTextMesh", "", ref symbols); HasChanged |= UpdateSettings( "TextMeshPro", "TMPro.TMP_FontAsset", "TextMeshPro", ref symbols ); HasChanged |= UpdateSettings( "SVG", "SVGImporter.SVGAsset", "", ref symbols ); if (HasChanged) { try { Settings = string.Empty; for (int i=0,imax=symbols.Count; i0) Settings += ";"; Settings += symbols[i]; } PlayerSettings.SetScriptingDefineSymbolsForGroup(Platform, Settings ); } catch (Exception) { } } } static bool UpdateSettings( string mPlugin, string mType, string AssemblyType, ref List symbols) { try { bool hasPluginClass = false; if (!string.IsNullOrEmpty( AssemblyType )) { var rtype = AppDomain.CurrentDomain.GetAssemblies() .Where( assembly => assembly.FullName.Contains(AssemblyType) ) .Select( assembly => assembly.GetType( mType, false ) ) .Where( t => t!=null ) .FirstOrDefault(); if (rtype != null) hasPluginClass = true; } if (!hasPluginClass) hasPluginClass = typeof( Localize ).Assembly.GetType( mType, false )!=null; bool hasPluginDef = symbols.IndexOf(mPlugin)>=0; if (hasPluginClass != hasPluginDef) { if (hasPluginClass) symbols.Add(mPlugin); else symbols.Remove(mPlugin); return true; } } catch(Exception) { } return false; } //[MenuItem( "Tools/I2 Localization/Create I2Languages", false, 1)] public static void CreateLanguageSources() { if (LocalizationManager.GlobalSources==null || LocalizationManager.GlobalSources.Length==0) return; Object GlobalSource = Resources.Load(LocalizationManager.GlobalSources[0]); LanguageSourceData sourceData = null; string sourcePath = null; if (GlobalSource != null) { if (GlobalSource is GameObject) { // I2Languages was a prefab before 2018.3, it should be converted to an ScriptableObject sourcePath = AssetDatabase.GetAssetPath(GlobalSource); LanguageSource langSourceObj = (GlobalSource as GameObject).GetComponent(); sourceData = langSourceObj.mSource; } else { return; } } LanguageSourceAsset asset = ScriptableObject.CreateInstance(); if (sourceData != null) { asset.mSource = sourceData; AssetDatabase.DeleteAsset(sourcePath); } if (string.IsNullOrEmpty(sourcePath)) { //string PluginPath = GetI2LocalizationPath(); string ResourcesFolder = "Assets/Resources";//PluginPath.Substring(0, PluginPath.Length-"/Localization".Length) + "/Resources"; string fullresFolder = Application.dataPath + ResourcesFolder.Replace("Assets", ""); if (!Directory.Exists(fullresFolder)) Directory.CreateDirectory(fullresFolder); sourcePath = ResourcesFolder + "/" + LocalizationManager.GlobalSources[0] + ".asset"; } else { sourcePath = sourcePath.Replace(".prefab", ".asset"); } AssetDatabase.CreateAsset(asset, sourcePath); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } [MenuItem("Tools/I2 Localization/Help", false, 30)] [MenuItem("Help/I2 Localization")] public static void MainHelp() { Application.OpenURL(LocalizeInspector.HelpURL_Documentation); } [MenuItem("Tools/I2 Localization/Open I2Languages.asset", false, 0)] public static void OpenGlobalSource() { CreateLanguageSources(); LanguageSourceAsset GO = Resources.Load(LocalizationManager.GlobalSources[0]); if (GO == null) Debug.Log("Unable to find Global Language at Assets/Resources/" + LocalizationManager.GlobalSources[0] + ".asset"); Selection.activeObject = GO; } /*static void CreateScriptLocalization() { string[] assets = AssetDatabase.FindAssets("ScriptLocalization"); if (assets.Length>0) return; string ScriptsFolder = "Assets"; string ScriptText = LocalizationEditor.mScriptLocalizationHeader + " }\n}"; System.IO.File.WriteAllText(ScriptsFolder + "/ScriptLocalization.cs", ScriptText); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); }*/ public static string GetI2LocalizationPath() { string[] assets = AssetDatabase.FindAssets("LocalizationManager"); if (assets.Length==0) return string.Empty; string PluginPath = AssetDatabase.GUIDToAssetPath(assets[0]); PluginPath = PluginPath.Substring(0, PluginPath.Length - "/Scripts/LocalizationManager.cs".Length); return PluginPath; } public static string GetI2Path() { string pluginPath = GetI2LocalizationPath(); return pluginPath.Substring(0, pluginPath.Length-"/Localization".Length); } public static string GetI2CommonResourcesPath() { string I2Path = GetI2Path(); return I2Path + "/Resources"; } } public static class UpgradeManagerHelper { public static bool HasAttributeOfType(this Enum enumVal) where T:Attribute { var type = enumVal.GetType(); var memInfo = type.GetMember(enumVal.ToString()); var attributes = memInfo[0].GetCustomAttributes(typeof(T), false); return attributes.Length > 0; } } }