SimpleJavaEngine/src/main/java/speiger/src/coreengine/assets/language/LanguageManager.java

152 lines
3.4 KiB
Java

package speiger.src.coreengine.assets.language;
import java.util.Map;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import speiger.src.collections.objects.maps.impl.hash.Object2ObjectOpenHashMap;
import speiger.src.collections.objects.utils.maps.Object2ObjectMaps;
import speiger.src.coreengine.assets.AssetLocation;
import speiger.src.coreengine.assets.AssetManager;
import speiger.src.coreengine.assets.MultiAsset;
import speiger.src.coreengine.assets.reloader.IReloadableResource;
import speiger.src.coreengine.utils.collections.iterators.IterableWrapper;
public class LanguageManager implements IReloadableResource
{
final AssetLocation location = AssetLocation.of("lang");
Map<String, Language> languages = new Object2ObjectOpenHashMap<String, Language>();
AssetManager assets;
String currentLanguage;
@Override
public void reload()
{
languages.clear();
try(MultiAsset langs = assets.getAllAsset(location.subAsset("langs.json")))
{
for(int i = 0,m=langs.size();i<m;i++)
{
preLoadLanguage(langs.getAsset(i).getJsonObject());
}
}
catch(Exception e)
{
e.printStackTrace();
}
if(loadLanguage(currentLanguage))
{
I18n.CURRENT_LANGUAGE = languages.get(currentLanguage);
}
else
{
Language dummy = new Language("en_US", "English");
dummy.load(Object2ObjectMaps.empty());
I18n.CURRENT_LANGUAGE = dummy;
}
}
public boolean setLanguage(String lang)
{
if(loadLanguage(lang))
{
I18n.CURRENT_LANGUAGE = languages.get(lang);
currentLanguage = lang;
Language currentLang = languages.get(currentLanguage);
if(currentLang != null)
{
currentLang.clear();
}
return true;
}
return false;
}
protected boolean loadLanguage(String loadingLang)
{
Language lang = languages.get(loadingLang);
if(lang == null)
{
return false;
}
Map<String, String> map = new Object2ObjectOpenHashMap<String, String>();
loadLanguage(loadingLang, map);
if(loadingLang != "en_US")
{
loadLanguage("en_US", map);
}
lang.load(map);
return true;
}
protected void loadLanguage(String lang, Map<String, String> data)
{
try(MultiAsset language = assets.getAllAsset(location.subAsset(lang+".lang")))
{
for(int i = 0,m=language.size();i<m;i++)
{
try
{
for(String line : IterableWrapper.wrap(language.getAsset(i).getStringReader()))
{
if(line.isEmpty() || line.startsWith("#") || line.startsWith("//"))
{
continue;
}
String[] split = line.split("=", 1);
if(split.length == 2)
{
data.putIfAbsent(split[0].trim(), split[1].trim());
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
protected void preLoadLanguage(JsonObject object)
{
try
{
JsonArray array = object.getAsJsonArray("languages");
if(array == null)
{
return;
}
for(int i = 0,m=array.size();i<m;i++)
{
JsonArray subArray = array.get(i).getAsJsonArray();
if(subArray.size() != 2)
{
continue;
}
String key = subArray.get(0).getAsString();
String value = subArray.get(1).getAsString();
if(key.length() != 2 || value.length() > 16)
{
continue;
}
Language lang = languages.get(key);
if(lang == null)
{
languages.put(key, new Language(key, value));
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}