Update LOCFile interface

This commit is contained in:
miku-666
2022-07-15 16:24:57 +02:00
parent 2d319747a9
commit 317df94bbe
4 changed files with 97 additions and 66 deletions

View File

@@ -9,12 +9,17 @@ namespace PckStudio.Classes.FileTypes
{
public class LOCFile
{
// loc key => language, name
public Dictionary<string, Dictionary<string, string>> keys { get; set; } = new Dictionary<string, Dictionary<string, string>>();
public class InvalidLanguageException : Exception
{
private string _language;
public string Language => _language;
public InvalidLanguageException(string message, string language) : base(message)
{
_language = language;
}
}
public List<string> languages = new List<string>(valid_languages.Length);
public static readonly string[] valid_languages = new string[]
public static readonly string[] ValidLanguages = new string[]
{
"cs-CS",
"cs-CZ",
@@ -84,63 +89,96 @@ namespace PckStudio.Classes.FileTypes
"zh-HanS",
"zh-HanT",
};
public void InitializeDefault(string PackName)
private Dictionary<string, Dictionary<string, string>> _lockeys = new Dictionary<string, Dictionary<string, string>>();
private List<string> _languages = new List<string>(ValidLanguages.Length);
public Dictionary<string, Dictionary<string, string>> LocKeys => _lockeys;
public List<string> Languages => _languages;
public void InitializeDefault(string packName)
=> Initialize("en-EN", ("IDS_DISPLAY_NAME", packName));
public void Initialize(string language, params (string, string)[] locKeyValuePairs)
{
AddLanguage("en-EN");
AddLocKey("IDS_DISPLAY_NAME", PackName);
AddLanguage(language);
foreach (var locKeyValue in locKeyValuePairs)
AddLocKey(locKeyValue.Item1, locKeyValue.Item2);
}
public void AddSingleLocKey(string locKey, string language, string value)
public string GetLocEntry(string locKey, string language)
{
if (keys.ContainsKey(locKey)) throw new Exception("Loc key already exists");
if (!languages.Contains(language)) throw new Exception("Language not found");
var dict = new Dictionary<string, string>();
dict.Add(language, value);
keys.Add(locKey, dict);
if (!LocKeys.ContainsKey(locKey))
throw new KeyNotFoundException("Loc key not found");
if (!Languages.Contains(language)) throw new KeyNotFoundException("Language Entry not found");
return GetTranslation(locKey)[language]?? string.Empty;
}
public void AddLocKey(string locKey, string value)
private Dictionary<string, string> GetTranslation(string locKey)
{
if (string.IsNullOrEmpty(locKey) || string.IsNullOrEmpty(value))
throw new ArgumentNullException("string cant be null");
if (keys.ContainsKey(locKey))
throw new Exception("loc key already exists");
foreach (var langauge in languages)
{
AddSingleLocKey(locKey, langauge, value);
}
if (!LocKeys.ContainsKey(locKey))
LocKeys.Add(locKey, new Dictionary<string, string>());
return LocKeys[locKey];
}
public void ChangeSingleEntry(string locKey, string language, string newValue)
public void SetLocEntry(string locKey, string language, string value)
{
if (!keys.ContainsKey(locKey)) throw new KeyNotFoundException("Loc key not found");
if (!keys[locKey].ContainsKey(language) || !languages.Contains(language)) throw new KeyNotFoundException("Language Entry not found");
keys[locKey][language] = newValue;
if (!LocKeys.ContainsKey(locKey))
LocKeys.Add(locKey, new Dictionary<string, string>());
if (!Languages.Contains(language))
throw new KeyNotFoundException(nameof(language));
GetTranslation(locKey)[language] = value;
}
public bool AddSingleLocEntry(string locKey, string language, string value)
{
if (string.IsNullOrEmpty(locKey) ||
string.IsNullOrEmpty(language) ||
string.IsNullOrEmpty(value) ||
LocKeys.ContainsKey(locKey))
return false;
SetLocEntry(locKey, language, value);
return true;
}
public bool AddLocKey(string locKey, string value)
{
if (LocKeys.ContainsKey(locKey))
return false;
Languages.ForEach( langauge => AddSingleLocEntry(locKey, langauge, value) );
return true;
}
public void ChangeSingleEntry(string locKey, string language, string newValue)
=> SetLocEntry(locKey, language, newValue);
public void ChangeEntry(string locKey, string newValue)
{
if (string.IsNullOrEmpty(locKey) || string.IsNullOrEmpty(newValue))
throw new ArgumentNullException("string cant be null");
if (!keys.ContainsKey(locKey))
throw new KeyNotFoundException("loc key not found");
foreach (var langauge in languages)
{
ChangeSingleEntry(locKey, langauge, newValue);
}
}
=> Languages.ForEach(langauge => SetLocEntry(locKey, langauge, newValue));
public void RemoveEntry(string locKey)
public void RemoveLocKey(string locKey)
{
if (!keys.ContainsKey(locKey)) throw new KeyNotFoundException("Loc key not found");
keys.Remove(locKey);
if (!LocKeys.ContainsKey(locKey))
throw new KeyNotFoundException(nameof(locKey));
LocKeys.Remove(locKey);
}
public void AddLanguage(string language)
{
if (!valid_languages.Contains(language)) throw new Exception("Invalid language");
languages.Add(language);
if (!ValidLanguages.Contains(language))
throw new InvalidLanguageException("Invalid language", language);
if (Languages.Contains(language))
throw new InvalidLanguageException("Language already exists", language);
Languages.Add(language);
foreach(var key in LocKeys.Keys)
SetLocEntry(key, language, "");
}
public void RemoveLanguage(string language)
{
if (!ValidLanguages.Contains(language))
throw new InvalidLanguageException("Invalid language", language);
if (!Languages.Contains(language))
throw new InvalidLanguageException("Language doesn't exist", language);
if (Languages.Remove(language))
foreach (var translation in LocKeys.Values)
translation.Remove(language);
}
}
}

View File

@@ -25,12 +25,12 @@ namespace PckStudio.Classes.IO.LOC
{
int loc_type = ReadInt(stream);
int language_count = ReadInt(stream);
List<string> keys = null;
if (loc_type == 2) keys = ReadKeys(stream);
bool lookUpKey = loc_type == 2;
List<string> keys = lookUpKey ? ReadKeys(stream) : null;
for (int i = 0; i < language_count; i++)
{
string language = ReadString(stream);
_file.languages.Add(language);
_file.Languages.Add(language);
ReadInt(stream); // padding ???
}
for (int i = 0; i < language_count; i++)
@@ -38,21 +38,14 @@ namespace PckStudio.Classes.IO.LOC
ReadInt(stream);
stream.ReadByte();
string language = ReadString(stream);
if (!_file.languages.Contains(language))
if (!_file.Languages.Contains(language))
throw new Exception("language not found");
int count = ReadInt(stream);
for (int j = 0; j < count; j++)
{
string key = loc_type == 2 ? keys[j] : ReadString(stream);
string key = lookUpKey ? keys[j] : ReadString(stream);
string value = ReadString(stream);
if (_file.keys.ContainsKey(key))
{
_file.keys[key].Add(language, value);
continue;
}
var dict = new Dictionary<string, string>();
dict.Add(language, value);
_file.keys.Add(key, dict);
_file.SetLocEntry(key, language, value);
}
}
return _file;

View File

@@ -25,7 +25,7 @@ namespace PckStudio.Classes.IO.LOC
{
if (_locfile == null) throw new ArgumentNullException("Loc File is null");
WriteInt(stream, type);
WriteInt(stream, _locfile.languages.Count);
WriteInt(stream, _locfile.Languages.Count);
if (type == 2) WriteLocKeys(stream);
WriteLanguages(stream);
WriteLanguageEntries(stream, type);
@@ -35,14 +35,14 @@ namespace PckStudio.Classes.IO.LOC
private void WriteLocKeys(Stream stream)
{
stream.WriteByte(0);
WriteInt(stream, _locfile.keys.Count);
foreach (var key in _locfile.keys.Keys)
WriteInt(stream, _locfile.LocKeys.Count);
foreach (var key in _locfile.LocKeys.Keys)
WriteString(stream, key);
}
private void WriteLanguages(Stream stream)
{
foreach (var language in _locfile.languages)
foreach (var language in _locfile.Languages)
{
WriteString(stream, language);
WriteInt(stream, 0);
@@ -51,16 +51,16 @@ namespace PckStudio.Classes.IO.LOC
private void WriteLanguageEntries(Stream stream, int type)
{
foreach (var language in _locfile.languages)
foreach (var language in _locfile.Languages)
{
WriteInt(stream, 0x1337);
stream.WriteByte(0);
WriteString(stream, language);
WriteInt(stream, _locfile.keys.Keys.Count);
foreach(var locKey in _locfile.keys.Keys)
WriteInt(stream, _locfile.LocKeys.Keys.Count);
foreach(var locKey in _locfile.LocKeys.Keys)
{
if (type == 0) WriteString(stream, locKey);
WriteString(stream, _locfile.keys[locKey][language]);
WriteString(stream, _locfile.LocKeys[locKey][language]);
}
}
}

View File

@@ -353,7 +353,7 @@ namespace PckStudio
foreach (var property in file.properties)
{
if (property.Item1 == "THEMENAMEID" || property.Item1 == "DISPLAYNAMEID")
locFile.RemoveEntry(property.Item2);
locFile.RemoveLocKey(property.Item2);
}
TrySetLocFile(locFile);
}