77using System . Text ;
88using GlobalEnums ;
99using Language ;
10- using LanguageSupport . Consts ;
1110using Modding ;
11+ using On . UnityEngine . UI ;
1212using UnityEngine ;
1313
1414namespace LanguageSupport
@@ -17,7 +17,8 @@ class LanguageSupport : Mod
1717 {
1818 internal static LanguageSupport Instance ;
1919
20- public LanguageStrings LangStrings { get ; private set ; }
20+ private readonly string FOLDER = "LanguageSupport" ;
21+ private readonly string DIR ;
2122
2223 public override string GetVersion ( )
2324 {
@@ -36,18 +37,30 @@ public LanguageSupport() : base("Language Support")
3637 {
3738 Instance = this ;
3839
39- LangStrings = new LanguageStrings ( ) ;
40-
41- InitCallbacks ( ) ;
42-
43- InitLanguage ( ) ;
40+ switch ( SystemInfo . operatingSystemFamily )
41+ {
42+ case OperatingSystemFamily . MacOSX :
43+ DIR = Path . GetFullPath ( Application . dataPath + "/Resources/Data/Managed/Mods/" + FOLDER ) ;
44+ break ;
45+ default :
46+ DIR = Path . GetFullPath ( Application . dataPath + "/Managed/Mods/" + FOLDER ) ;
47+ break ;
48+ }
49+ if ( ! Directory . Exists ( DIR ) )
50+ {
51+ Directory . CreateDirectory ( DIR ) ;
52+ }
4453 }
4554
4655 public override void Initialize ( )
4756 {
4857 Log ( "Initializing" ) ;
4958 Instance = this ;
5059
60+ InitCallbacks ( ) ;
61+
62+ InitLanguage ( ) ;
63+
5164 foreach ( var t in GameObject . FindObjectsOfType < UnityEngine . UI . MenuLanguageSetting > ( ) )
5265 {
5366 t . RefreshControls ( ) ;
@@ -59,114 +72,132 @@ public override void Initialize()
5972 private void InitCallbacks ( )
6073 {
6174 // Hooks
62- ModHooks . Instance . LanguageGetHook += OnLanguageGetHook ;
63- On . UnityEngine . UI . MenuLanguageSetting . RefreshAvailableLanguages += OnMenuLanguageSettingRefreshAvailableLanguages ;
6475 On . Language . Language . HasLanguageFile += OnLanguageHasLanguageFile ;
65- On . Language . Language . LoadAvailableLanguages += OnLanguageLoadAvailableLanguages ;
66- On . LocalizationSettings . GetLanguageEnum += OnLocalizationSettingsGetLanguageEnum ;
76+ On . Language . Language . GetLanguageFileContents += OnLanguageGetLanguageFileContents ;
77+ On . UnityEngine . UI . MenuLanguageSetting . RefreshAvailableLanguages += OnMenuLanguageSettingRefreshAvailableLanguages ;
6778 }
6879
6980 private void InitLanguage ( )
7081 {
71- typeof ( Language . Language ) . GetMethod ( "LoadAvailableLanguages" , BindingFlags . NonPublic | BindingFlags . Static ) . Invoke ( null , null ) ;
72- Language . Language . LoadLanguage ( ) ;
73- }
82+ #region Dump English Files
7483
75- private void OnMenuLanguageSettingRefreshAvailableLanguages ( On . UnityEngine . UI . MenuLanguageSetting . orig_RefreshAvailableLanguages orig , UnityEngine . UI . MenuLanguageSetting self )
76- {
77- orig ( self ) ;
78- List < SupportedLanguages > supLang = new List < SupportedLanguages > ( ( SupportedLanguages [ ] ) self . GetType ( ) . GetField ( "langs" , BindingFlags . NonPublic | BindingFlags . Instance ) . GetValue ( self ) ) ;
79- foreach ( var pair in LangStrings . jsonDict )
84+ if ( ! Directory . Exists ( $ "{ DIR } /EN") )
8085 {
81- try
82- {
83- SupportedLanguages t = ( SupportedLanguages ) Enum . Parse ( typeof ( LanguageCode ) , pair . Key , true ) ;
84- supLang . Add ( t ) ;
85- }
86- catch ( Exception e )
86+ Directory . CreateDirectory ( $ "{ DIR } /EN") ;
87+ }
88+ string [ ] sheets = new string [ ]
89+ {
90+ "Achievements" ,
91+ "Backer Messages" ,
92+ "Banker" ,
93+ "Charm Slug" ,
94+ "Cornifer" ,
95+ "CP2" ,
96+ "CP3" ,
97+ "Credits List" ,
98+ "Dream Witch" ,
99+ "Dreamers" ,
100+ "Elderbug" ,
101+ "Enemy Dreams" ,
102+ "General" ,
103+ "Ghosts" ,
104+ "Hornet" ,
105+ "Hunter" ,
106+ "Iselda" ,
107+ "Jiji" ,
108+ "Journal" ,
109+ "Lore Tablets" ,
110+ "MainMenu" ,
111+ "Map Zones" ,
112+ "Minor NPC" ,
113+ "Nailmasters" ,
114+ "Nailsmith" ,
115+ "Prices" ,
116+ "Prompts" ,
117+ "Quirrel" ,
118+ "Relic Dealer" ,
119+ "Shaman" ,
120+ "Sly" ,
121+ "Stag" ,
122+ "StagMenu" ,
123+ "Titles" ,
124+ "UI" ,
125+ "Zote"
126+ } ;
127+ foreach ( var sheet in sheets )
128+ {
129+ if ( ! File . Exists ( $ "{ DIR } /EN/{ sheet } .txt") )
87130 {
88- supLang . Add ( ( SupportedLanguages ) LangStrings . numberToName . First ( x => x . Value == pair . Key ) . Key ) ;
131+ string t = ( ( TextAsset ) Resources . Load ( $ "Languages/EN_{ sheet } ", typeof ( TextAsset ) ) ) . text ;
132+ using ( StreamWriter outputFile = new StreamWriter ( $ "{ DIR } /EN/{ sheet } .txt") )
133+ {
134+ outputFile . Write ( t ) ;
135+ }
89136 }
90137 }
91- self . GetType ( ) . GetField ( "langs" , BindingFlags . NonPublic | BindingFlags . Instance ) . SetValue ( self , supLang . ToArray ( ) ) ;
138+
139+ #endregion
140+
141+ typeof ( Language . Language ) . GetMethod ( "LoadAvailableLanguages" , BindingFlags . NonPublic | BindingFlags . Static ) . Invoke ( null , null ) ;
142+ Language . Language . LoadLanguage ( ) ;
92143 }
93144
94145 private bool OnLanguageHasLanguageFile ( On . Language . Language . orig_HasLanguageFile orig , string lang , string sheetTitle )
95146 {
96147 var ret = orig ( lang , sheetTitle ) ;
97148 if ( ! ret )
98149 {
99- foreach ( var pair in LangStrings . jsonDict )
150+ if ( File . Exists ( $ " { DIR } / { lang } / { sheetTitle } .txt" ) )
100151 {
101- if ( lang == pair . Key )
102- {
103- ret = true ;
104- }
152+ ret = true ;
105153 }
106154 }
107155 return ret ;
108156 }
109157
110- private void OnLanguageLoadAvailableLanguages ( On . Language . Language . orig_LoadAvailableLanguages orig )
158+ private string OnLanguageGetLanguageFileContents ( On . Language . Language . orig_GetLanguageFileContents orig , string sheetTitle )
111159 {
112- orig ( ) ;
113- List < string > langs = ( List < string > ) typeof ( Language . Language ) . GetField ( "availableLanguages" , BindingFlags . Static | BindingFlags . NonPublic ) . GetValue ( null ) ;
114-
115- foreach ( var pair in LangStrings . jsonDict )
160+ string ret = orig ( sheetTitle ) ;
161+ if ( ret == string . Empty )
116162 {
117- langs . Add ( pair . Key ) ;
118- }
119- Log ( "Discovered Languages:" ) ;
120- foreach ( var s in langs )
121- {
122- Log ( $ "Language: \" { s } \" ") ;
163+ if ( File . Exists ( $ "{ DIR } /{ Language . Language . CurrentLanguage ( ) } /{ sheetTitle } .txt") )
164+ {
165+ return File . ReadAllText ( $ "{ DIR } /{ Language . Language . CurrentLanguage ( ) } /{ sheetTitle } .txt") ;
166+ }
123167 }
124-
125- typeof ( Language . Language ) . GetField ( "availableLanguages" , BindingFlags . Static | BindingFlags . NonPublic ) . SetValue ( null , langs ) ;
168+ return ret ;
126169 }
127170
128- private LanguageCode OnLocalizationSettingsGetLanguageEnum ( On . LocalizationSettings . orig_GetLanguageEnum orig , string langCode )
171+ private void OnMenuLanguageSettingRefreshAvailableLanguages ( On . UnityEngine . UI . MenuLanguageSetting . orig_RefreshAvailableLanguages orig , UnityEngine . UI . MenuLanguageSetting self )
129172 {
130- try
173+ orig ( self ) ;
174+ SupportedLanguages [ ] langs ;
175+ if ( GameManager . instance . gameConfig . hideLanguageOption )
131176 {
132- Enum . Parse ( typeof ( LanguageCode ) , langCode , true ) ;
133- return orig ( langCode ) ;
177+ langs = ( Enum . GetValues ( typeof ( TestingLanguages ) ) as SupportedLanguages [ ] ) ;
134178 }
135- catch ( Exception e )
179+ else
136180 {
137- foreach ( var pair in LangStrings . numberToName )
138- {
139- if ( langCode == pair . Key . ToString ( ) )
140- {
141- return ( LanguageCode ) pair . Key ;
142- }
143- }
181+ langs = ( Enum . GetValues ( typeof ( SupportedLanguages ) ) as SupportedLanguages [ ] ) ;
144182 }
145- return LanguageCode . EN ;
146- }
147183
148- #region Get/Set Hooks
184+ List < SupportedLanguages > finalLangs = new List < SupportedLanguages > ( ( SupportedLanguages [ ] ) self . GetType ( ) . GetField ( "langs" , BindingFlags . NonPublic | BindingFlags . Instance ) . GetValue ( self ) ) ;
149185
150- private string OnLanguageGetHook ( string key , string sheet )
151- {
152- if ( sheet == "MainMenu" )
186+ foreach ( var l in langs )
153187 {
154- foreach ( var pair in LangStrings . numberToName )
188+ if ( File . Exists ( $ " { DIR } / { l } /General.txt" ) )
155189 {
156- if ( key == $ "LANG_{ pair . Key } ")
157- {
158- return pair . Value ;
159- }
190+ finalLangs . Add ( l ) ;
160191 }
161192 }
162- if ( LangStrings . ContainsKey ( key , sheet ) )
193+
194+ self . GetType ( ) . GetField ( "langs" , BindingFlags . NonPublic | BindingFlags . Instance ) . SetValue ( self , finalLangs . ToArray ( ) ) ;
195+
196+ self . optionList = new string [ finalLangs . Count ] ;
197+ for ( int i = 0 ; i < finalLangs . Count ; i ++ )
163198 {
164- return LangStrings . Get ( key , sheet ) ;
199+ self . optionList [ i ] = finalLangs [ i ] . ToString ( ) ;
165200 }
166- return Language . Language . GetInternal ( key , sheet ) ;
167201 }
168-
169- #endregion Get/Set Hooks
170-
171202 }
172203}
0 commit comments