152 lines
3.4 KiB
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();
|
|
}
|
|
}
|
|
|
|
}
|