private static void ExportDeclaration()
        {
            ExporterMod.Log($"Start exporting all declarations");

            var outputPath = Path.Combine(Exporter.outputPath, "typings");

            if (Directory.Exists(outputPath))
            {
                Directory.Delete(outputPath, true);
            }
            Directory.CreateDirectory(outputPath);
            TypeScriptHelper.SaveAllTypesDeclaration(outputPath);

            ExporterMod.Log($"Complete exporting all declarations", true);
        }
        private static void ExportLangbase(string languagesPath, int index)
        {
            if (index >= LanguageMap.Count)
            {
                LongEventHandler.QueueLongEvent(delegate {
                    Prefs.LangFolderName = originLangFolderName;
                    PlayDataLoader.ClearAllPlayData();
                    PlayDataLoader.LoadAllPlayData(false);

                    ExportDeclaration();
                }, "LoadingLongEvent", false, null);
                return;
            }

            string         code       = LanguageMap[index][0];
            string         folderName = LanguageMap[index][1];
            LoadedLanguage lang       = null;

            foreach (var loadedLanugage in LanguageDatabase.AllLoadedLanguages)
            {
                if (loadedLanugage.folderName == folderName)
                {
                    lang = loadedLanugage;
                    break;
                }
            }
            if (lang == null)
            {
                throw new Exception($"{ExporterMod.Name} Language '{code}-{folderName}' no found.");
            }
            var path = Path.Combine(languagesPath, code);

            Directory.CreateDirectory(path);

            LongEventHandler.QueueLongEvent(delegate {
                Prefs.LangFolderName = folderName;
                ExporterMod.Log($"Start Loading language {Prefs.LangFolderName}");
                PlayDataLoader.ClearAllPlayData();
                PlayDataLoader.LoadAllPlayData(false);

                LongEventHandler.QueueLongEvent(delegate {
                    ExporterMod.Log($"Complete Loading language {Prefs.LangFolderName}", true);

                    ExporterMod.Log($"Start exporting language {Prefs.LangFolderName}");

                    var allLangTypes = typeof(ELang).AllSubclassesNonAbstract().ToList();
                    allLangTypes.Sort((Type a, Type b) => {
                        return(a.Name.CompareTo(b.Name));
                    });

                    foreach (var langType in allLangTypes)
                    {
                        var typeArguments = new Type[] { langType, (Activator.CreateInstance(langType) as ELang).DefType };
                        var databaseType  = typeof(Database <,>).MakeGenericType(typeArguments);
                        var category      = databaseType.GetProperty("Category").GetValue(null, null) as string;
                        databaseType.GetMethod("Save", BindingFlags.Static | BindingFlags.Public).Invoke(null, new[] { Path.Combine(path, category) });
                    }

                    ExporterMod.Log($"Complete exporting language {Prefs.LangFolderName}", true);

                    ExportLangbase(languagesPath, index + 1);
                }, "LoadingLongEvent", false, null);
            }, "LoadingLongEvent", false, null);



            //LongEventHandler.QueueLongEvent(delegate {
            //}, $"LoadingLongEvent", false, null);
        }