= Updated localizer code
This commit is contained in:
+37
-47
@@ -3,13 +3,17 @@ package core;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import org.ini4j.InvalidFileFormatException;
|
||||
import org.ini4j.Profile.Section;
|
||||
import org.ini4j.Wini;
|
||||
|
||||
import org.sqlite.SQLiteConfig.Encoding;
|
||||
import dataStructures.SectionedKeyValueStore;
|
||||
import utils.FileUtils;
|
||||
import utils.GlobalLog;
|
||||
import utils.LogFilter;
|
||||
@@ -23,8 +27,8 @@ public class Localizer
|
||||
public final static String filename = "localization.config";
|
||||
public final static String functionName = "Localizer.Stub";
|
||||
|
||||
// Local translation
|
||||
private static HashMap<String, LocInfo> translated = new HashMap<String, LocInfo>();
|
||||
// Local translation storage
|
||||
private static SectionedKeyValueStore stringStore;
|
||||
|
||||
// Logging
|
||||
private static void Log(String str) { GlobalLog.Log(LogFilter.Strings, str); }
|
||||
@@ -87,37 +91,45 @@ public class Localizer
|
||||
// the string in question if one can be found.
|
||||
public static String Stub(String input)
|
||||
{
|
||||
if(translated.containsKey(input))
|
||||
{
|
||||
String value = translated.get(input).phrase;
|
||||
if(value.trim().length() > 0)
|
||||
return value;
|
||||
}
|
||||
if(stringStore == null)
|
||||
return input;
|
||||
|
||||
return input;
|
||||
return stringStore.GetKey(input);
|
||||
}
|
||||
|
||||
// Reads a file to string, adapted from https://stackoverflow.com/a/326440/5383198
|
||||
static String ReadFileAsString(String path, Charset encoding)
|
||||
{
|
||||
try
|
||||
{
|
||||
byte[] encoded = Files.readAllBytes(Paths.get(path));
|
||||
return new String(encoded, encoding);
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
Warn("No file found to read from!");
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
// Update localization from the disk on file. Creates the file if it doesn't exist.
|
||||
// This file is internally formatted as an ini file.
|
||||
public static void UpdateLocFromDisk()
|
||||
{
|
||||
Log("Attempting to read localization file");
|
||||
|
||||
try
|
||||
{
|
||||
File file = new File(filename);
|
||||
file.createNewFile();
|
||||
|
||||
Wini ini = new Wini(file);
|
||||
|
||||
for(String str : ini.keySet())
|
||||
String fileContents = ReadFileAsString(filename, Charset.defaultCharset());
|
||||
if(fileContents == null)
|
||||
{
|
||||
// Store everything in all .ini sections
|
||||
Section sec = ini.get(str);
|
||||
for(String s : sec.keySet())
|
||||
{
|
||||
if(!translated.containsKey(s))
|
||||
translated.put(s, new LocInfo(sec.getName(), sec.get(s, String.class)));
|
||||
}
|
||||
File file = new File(filename);
|
||||
file.createNewFile();
|
||||
}
|
||||
else
|
||||
{
|
||||
stringStore = new SectionedKeyValueStore(fileContents);
|
||||
}
|
||||
}
|
||||
catch(InvalidFileFormatException e)
|
||||
@@ -138,24 +150,8 @@ public class Localizer
|
||||
try
|
||||
{
|
||||
PrintWriter pw = new PrintWriter(filename);
|
||||
pw.println(stringStore.toString());
|
||||
pw.close();
|
||||
|
||||
File file = new File(filename);
|
||||
file.createNewFile();
|
||||
|
||||
Wini ini = new Wini(file);
|
||||
|
||||
for(String s : translated.keySet())
|
||||
{
|
||||
LocInfo toWrite = translated.get(s);
|
||||
ini.put(toWrite.file, s, toWrite.phrase);
|
||||
}
|
||||
|
||||
ini.store();
|
||||
}
|
||||
catch(InvalidFileFormatException e)
|
||||
{
|
||||
Error("File issue with format during localization file write");
|
||||
}
|
||||
catch(IOException e)
|
||||
{
|
||||
@@ -171,12 +167,6 @@ public class Localizer
|
||||
FileUtils.AcquireAllFiles(".\\src").forEach((path) -> StripForContents(path, localizeList));
|
||||
|
||||
for(LocInfo toStub : localizeList)
|
||||
{
|
||||
if(!translated.containsKey(toStub.phrase))
|
||||
{
|
||||
translated.put(toStub.phrase, new LocInfo(toStub.file, ""));
|
||||
Log("Found new stubbed phrase '" + toStub.phrase + "' in " + toStub.file);
|
||||
}
|
||||
}
|
||||
stringStore.AddKeyValue(toStub.file, toStub.phrase, toStub.phrase);
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,8 @@ package dataStructures;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
// This is a class designed to parse ini inspired key-value pairs that are sectioned off.
|
||||
// The difference here is that this is more permissive than an ini file, and only accepts
|
||||
@@ -13,20 +15,27 @@ import java.util.Map;
|
||||
// Valid Ridiculous Key&\n\t_.:;foo =Some Value
|
||||
// Key=
|
||||
//
|
||||
public class SectionedKeyValue
|
||||
// Note that the sections are NOT designed to allow for duplicate keys across them. This is a restriction
|
||||
// of the structure, but can be changed later potentially.
|
||||
public class SectionedKeyValueStore
|
||||
{
|
||||
// Variables
|
||||
public final char SectionStart = '[';
|
||||
public final char SectionEnd = ']';
|
||||
public final char KeyValueLineSeparator = '\n';
|
||||
public final String KeyValueSplit = "=";
|
||||
|
||||
// [Key: SectionName, [Key: KeyString, Value: ValueString]]
|
||||
private HashMap<String, HashMap<String, String>> sectionKeyValue;
|
||||
|
||||
// [Key: KeyString, Value: ValueString]]
|
||||
private HashMap<String, String> keyValue;
|
||||
|
||||
// String constructor that parses the input string into the object
|
||||
public SectionedKeyValue(String input)
|
||||
public SectionedKeyValueStore(String input)
|
||||
{
|
||||
sectionKeyValue = new HashMap<String, HashMap<String, String>>();
|
||||
|
||||
keyValue = new HashMap<String, String>();
|
||||
Parse(input);
|
||||
}
|
||||
|
||||
@@ -36,18 +45,59 @@ public class SectionedKeyValue
|
||||
{
|
||||
AddSection(sectionName);
|
||||
sectionKeyValue.get(sectionName).putIfAbsent(key, value);
|
||||
keyValue.putIfAbsent(key, value);
|
||||
}
|
||||
|
||||
// Returns a HashMap of Keys to Values for a given section
|
||||
@SuppressWarnings("unchecked")
|
||||
public HashMap<String, String> GetSection(String sectionName)
|
||||
{
|
||||
return sectionKeyValue.get(sectionName);
|
||||
return (HashMap<String, String>) sectionKeyValue.get(sectionName).clone();
|
||||
}
|
||||
|
||||
// Look up a global key
|
||||
public String GetKey(String key)
|
||||
{
|
||||
if(keyValue.containsKey(key))
|
||||
return keyValue.get(key);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
// Calls back on each item in the entire structure. Provides section, then a pair of the keyString and valueString.
|
||||
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||
public void ForEach(BiConsumer<? super String, Pair<? super String, ? super String>> action)
|
||||
{
|
||||
Iterator it = sectionKeyValue.entrySet().iterator();
|
||||
while (it.hasNext())
|
||||
{
|
||||
Map.Entry pair = (Map.Entry)it.next();
|
||||
Iterator internal = ((HashMap<String, String>)pair.getValue()).entrySet().iterator();
|
||||
|
||||
while(internal.hasNext())
|
||||
{
|
||||
Map.Entry internalPair = (Map.Entry)internal.next();
|
||||
action.accept((String)pair.getKey(), new Pair<String, String>((String)internalPair.getKey(), (String)internalPair.getValue()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Calls back each item in the structure but does not priv
|
||||
@SuppressWarnings({"rawtypes"})
|
||||
public void ForEach(Consumer<Pair<? super String, ? super String>> action)
|
||||
{
|
||||
Iterator it = keyValue.entrySet().iterator();
|
||||
while (it.hasNext())
|
||||
{
|
||||
Map.Entry pair = (Map.Entry)it.next();
|
||||
action.accept(new Pair<String, String>((String)pair.getKey(), (String)pair.getValue()));
|
||||
}
|
||||
}
|
||||
|
||||
// Stores the internal hashmap as a string then reutrns it.
|
||||
// Places 1 newline between the sections.
|
||||
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||
public String ToString()
|
||||
public String toString()
|
||||
{
|
||||
String out = "";
|
||||
|
||||
@@ -55,7 +105,7 @@ public class SectionedKeyValue
|
||||
while (it.hasNext())
|
||||
{
|
||||
Map.Entry pair = (Map.Entry)it.next();
|
||||
out += ("" + SectionStart + pair.getKey() + SectionEnd);
|
||||
out += ("" + SectionStart + pair.getKey() + SectionEnd + "\n");
|
||||
|
||||
Iterator internal = ((HashMap<String, String>)pair.getValue()).entrySet().iterator();
|
||||
|
||||
@@ -115,6 +165,7 @@ public class SectionedKeyValue
|
||||
String key = line.substring(0, splitPos);
|
||||
String value = line.substring(splitPos + KeyValueSplit.length());
|
||||
sectionKeyValue.get(sectionName).putIfAbsent(key, value);
|
||||
keyValue.putIfAbsent(key, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+5
-4
@@ -32,16 +32,17 @@ public class Main extends ListenerAdapter
|
||||
// Main test location
|
||||
public static void main(String[] args) throws InterruptedException, LoginException, Exception
|
||||
{
|
||||
// Localizer startup - Potentially integrate with the factory. Needs to happen first tho.
|
||||
Localizer.UpdateLocFromDisk();
|
||||
Localizer.ScrapeAll();
|
||||
Localizer.SaveLocToDisk();
|
||||
|
||||
// Facotry startup.
|
||||
databaseManager = ObjectBuilderFactory.ConstructDatabaseManager();
|
||||
commandManager = ObjectBuilderFactory.ConstructCommandManager();
|
||||
rpManager = ObjectBuilderFactory.ConstructRPManager();
|
||||
stats = ObjectBuilderFactory.ConstructStats(commandManager);
|
||||
|
||||
// Localizer startup - Potentially integrate with the factory.
|
||||
Localizer.UpdateLocFromDisk();
|
||||
Localizer.ScrapeAll();
|
||||
Localizer.SaveLocToDisk();
|
||||
|
||||
// Bot startup
|
||||
kitty = new JDABuilder(AccountType.BOT).setToken(Ref.TestToken).buildBlocking();
|
||||
|
||||
Reference in New Issue
Block a user