/// <summary> /// Delegate constructor for getting field value from original translation /// </summary> /// <param name="settings">Language settings</param> /// <typeparam name="T">Type of data</typeparam> /// <returns>Resulting delegate to get string from</returns> /// <exception cref="ArgumentException">Throws exception if given field info was not found in assmebly</exception> public static Func <T, string> GetOriginalTextDelegate <T>(LanguageSettings settings) { var fieldInfo = typeof(T).GetField(settings.OriginalLanguage, BindingFlags.Public | BindingFlags.Instance); if (fieldInfo == null) { throw new ArgumentException($"LanguageSettings has incorrect original translation value -- used {settings.OriginalLanguage} but it do not exists"); } var d = new Func <T, string>(arg => (string)fieldInfo.GetValue(arg)); return(param => d(param)); }
/// <summary> /// Updates target file with new template data using settings /// </summary> /// <param name="settings">Settings</param> /// <param name="targetFile">Target file</param> /// <param name="template">Template file</param> public void UpdateTranslationItems(LanguageSettings settings, LanguageData targetFile, LanguageData template) { var missMatchList = new List <TranslationProto>(); var tempTranslationTable = targetFile.TranslationTable.ToList(); // Find invalid or missing translations foreach (var translationProto in tempTranslationTable) { var match = template.TranslationTable.FirstOrDefault(proto => proto.Name == translationProto.Name); if (match != null) { if (match.Original != translationProto.Original) { translationProto.IsValid = false; missMatchList.Add(translationProto); ConsoleLogger.LogWarning($"Translation for {translationProto.Original} -- {translationProto.Translation} is no longer valid! This entry original meaning has changed"); } else { translationProto.Original = match.Original; if (translationProto.Original.StartsWith("UI")) { translationProto.Translation = match.Original; } } } else { translationProto.IsValid = false; missMatchList.Add(translationProto); ConsoleLogger.LogWarning($"Translation for {translationProto.Original} -- {translationProto.Translation} is no longer valid! This entry was probably removed"); } } // New translations foreach (var translationProto in template.TranslationTable) { var match = targetFile.TranslationTable.FirstOrDefault(proto => proto.Name == translationProto.Name); if (match == null) { missMatchList.Add(translationProto); tempTranslationTable.Add(translationProto); ConsoleLogger.LogWarning($"New translation entry for {translationProto.Original} (Upgrade from {settings.GameVersion} to {GameConfig.gameVersion.ToFullString()})"); } } targetFile.TranslationTable = tempTranslationTable; settings.GameVersion = GameConfig.gameVersion.ToFullString(); }
/// <summary> /// Copy constructor to generate new Language data from in Game Data /// </summary> /// <param name="settings">Settings</param> /// <param name="stringProto">In game translations</param> public LanguageData(LanguageSettings settings, ProtoSet <StringProto> stringProto) { settings.VersionUpdate(); TranslationTable = new List <TranslationProto>(stringProto.Length); var translationDelegate = GetOriginalTextDelegate <StringProto>(settings); for (var i = 0; i < stringProto.dataArray.Length; i++) { var proto = stringProto.dataArray[i]; TranslationProto translationProto = new TranslationProto(); translationProto.IsValid = true; translationProto.Original = translationDelegate(proto); translationProto.Translation = translationDelegate(proto); translationProto.Name = proto.Name; TranslationTable.Add(translationProto); } }
/// <summary> /// Constructor of the container with settings alread loaded into memory /// </summary> /// <param name="settings"></param> public LanguageContainer(LanguageSettings settings) { Settings = settings; }