/// <summary> /// /// </summary> /// <param name="db"></param> /// <param name="input"></param> /// <param name="mode"></param> /// <returns></returns> static public int ImportToSingleLanguageDBFromFile(SingleLanguageDB db, ILocalizationFile input, LocalizationDB.ImportMode mode = LocalizationDB.ImportMode.kReplace) { // for now, all input file will be marked as english... if (!input.VerifyHeader("english")) { return(0); } int importCount = 0; int count = input.CountLines(); if (count > 0) { for (int i = 0; i < count; ++i) { if (input.IsLineLocalizationData(i)) { string tag = ""; int ver = 0; string data = ""; string rest = ""; input.GetData(i, ref tag, ref ver, ref data, ref rest); if (db.Import(tag, ver, data, mode)) { ++importCount; } } } } return(importCount); }
public void Execute(ILocalizationFile localization) { using (Stream stream = DetermineFileStream()) { Write(localization, stream); } }
public static void Write(ILocalizationFile localization, Stream stream) { //File format is // VERSION // HEADER // PAYLOAD // // VERSION consists of // version identifier (unsigned 4 bytes) // // HEADER consists of // Number of items (N) (unsigned 4 bytes) // // PAYLOAD consists of // N occurences of ITEM // // ITEM consists of // GUID (16 bytes) // STRING // // STRING is string represented however BinaryWriter/BinaryReader represent it //When allocating initial memory we'll guess that each string is on average 100 bytes including the header const uint BYTES_PER_STRING_GUESS = 100; var data = localization.ExistingLocalizations.ToDictionary(x => x, x => localization.Localize(x)); stream.SetLength(data.Count * BYTES_PER_STRING_GUESS); //Header size is negligible uint VERSION = 0; using (var binaryWriter = new BinaryWriter(stream, Encoding.UTF8, true)) { binaryWriter.Write(VERSION); binaryWriter.Write((uint)data.Count); foreach (var kvp in data) { var guidBytes = kvp.Key.Guid.ToByteArray(); binaryWriter.Write(guidBytes, 0, guidBytes.Length); binaryWriter.Write(kvp.Value); } } stream.SetLength(stream.Position); }
/// <summary> /// /// </summary> /// <param name="db"></param> /// <param name="path"></param> /// <param name="fileFormat"></param> /// <param name="overridePattern"></param> /// <param name="mode"></param> /// <returns></returns> static public int BatchImportToSingleLanguageDB(SingleLanguageDB db, string path, LocalizationFileFormat fileFormat, string overridePattern = null, LocalizationDB.ImportMode mode = LocalizationDB.ImportMode.kReplace) { if (!Directory.Exists(path)) { return(0); } string pattern = overridePattern != null ? overridePattern : fileFormat.GetLocalizationFileInstance().DefaultNamePattern(); int totalCount = 0; foreach (var filename in Directory.EnumerateFiles(path, pattern)) { ILocalizationFile file = fileFormat.GetLocalizationFileInstance(); file.Read(filename); totalCount += ImportToSingleLanguageDBFromFile(db, file, mode); } return(totalCount); }
/// <summary> /// /// </summary> /// <param name="db"></param> /// <param name="reference"></param> /// <param name="output"></param> /// <returns></returns> static public bool ExportLocalization(SingleLanguageDB db, ILocalizationFile reference, ILocalizationFile output) { // for now, all input file will be marked as english... if (!reference.VerifyHeader("english")) { return(false); } output.GenHeader("english"); int count = reference.CountLines(); if (count > 0) { for (int i = reference.HeaderLines(); i < count; ++i) { if (reference.IsLineLocalizationData(i)) { string tag = ""; int ver = 0; string data = ""; string rest = ""; reference.GetData(i, ref tag, ref ver, ref data, ref rest); if (db != null) { string localizeddata = db.LookupText(tag, ver); if (localizeddata != null) { output.AppendLine(tag, ver, localizeddata, rest); continue; } } output.AppendLine(tag, ver, data, rest); } else { string data = ""; reference.GetNonLocalizationData(i, ref data); output.AppendLine(null, 0, data, null); } } } return(true); }
/// <summary> /// /// </summary> /// <param name="db"></param> /// <param name="refPath"></param> /// <param name="refFileFormat"></param> /// <param name="overrideRefPattern"></param> /// <param name="outPath"></param> /// <param name="outFileFormat"></param> /// <param name="splitLine"></param> /// <returns></returns> static public bool BatchExportLocalization(SingleLanguageDB db, string refPath, LocalizationFileFormat refFileFormat, string overrideRefPattern, string outPath, LocalizationFileFormat outFileFormat, int splitLine = 0) { if (!Directory.Exists(refPath)) { return(false); } string refpattern = overrideRefPattern != null ? overrideRefPattern : refFileFormat.GetLocalizationFileInstance().DefaultNamePattern(); foreach (var filename in Directory.EnumerateFiles(refPath, refpattern)) { ILocalizationFile reffile = refFileFormat.GetLocalizationFileInstance(); reffile.Read(filename); ILocalizationFile outfile = outFileFormat.GetLocalizationFileInstance(); if (!outfile.CanWrite()) { continue; } if (!ExportLocalization(db, reffile, outfile)) { continue; } string newName = Path.GetFileNameWithoutExtension(filename); Directory.CreateDirectory(outPath); if (splitLine <= 0) { outfile.Write(outPath + "\\" + newName + "." + outfile.DefaultExtension()); } else { int count = outfile.CountLines(); if (count > 0) { ILocalizationFile splitFile = outFileFormat.GetLocalizationFileInstance(); splitFile.GenHeader("english"); int contentCount = 0; int fileCount = 1; for (int i = outfile.HeaderLines(); i < count; ++i) { if (contentCount >= splitLine) { splitFile.Write(outPath + "\\" + newName + "-" + fileCount.ToString() + "." + splitFile.DefaultExtension()); fileCount++; contentCount = 0; if (i != count - 1) { splitFile = outFileFormat.GetLocalizationFileInstance(); splitFile.GenHeader("english"); } } if (outfile.IsLineLocalizationData(i)) { string tag = ""; int ver = 0; string data = ""; string rest = ""; outfile.GetData(i, ref tag, ref ver, ref data, ref rest); splitFile.AppendLine(tag, ver, data, rest); contentCount++; } else { string data = ""; outfile.GetNonLocalizationData(i, ref data); splitFile.AppendLine(null, 0, data, null); } } splitFile.Write(outPath + "\\" + newName + "-" + fileCount.ToString() + "." + splitFile.DefaultExtension()); } } } return(true); }