/// <summary> /// StringTableを読み込み、言語ファイルを返す。 /// 言語ファイルにファイル履歴の枠組みを作成し設定する。 /// </summary> /// <param name="path">StringTableファイルのパス</param> /// <param name="productLine">製品区分</param> /// <param name="fileID">FileID</param> /// <returns>言語ファイル</returns> public static MieLanguageFile LoadFromXml(string path, MieProduct.NProductLine productLine, out string fileID) { //// StringTableの読み込み var stringTableFile = StringTableFile.Load(path); //// ファイル履歴の作成 MieLanguageHistoryFile mieLanguageHistoryFile = new MieLanguageHistoryFile(stringTableFile.Name); //// FileIDを統一形式に変換する。 fileID = MieFileUtils.ConvertFileIDToCommon(stringTableFile.Name); var commonFileID = MieStringUtils.NormalizedFileID(fileID); var fileCode = MieHashTools.ComputeFileID(commonFileID); var mieLanguageFile = new MieLanguageFile(fileCode); stringTableFile .Entries .ForEach(entry => { var referenceID = MieTranslationLib.MieUtils.MieHashTools.ComputeReferenceID(stringTableFile.Name, entry.ID); var mieLanguageEntry = new MieLanguageEntry(entry.ID, entry.DefaultText, entry.FemaleText, productLine, referenceID); mieLanguageFile.AddEntry(mieLanguageEntry); }); return(mieLanguageFile); }
public static void SaveToSysyemDB(MieSystemDB systemDb, MieLanguageInfo langInfo) { using (SQLiteTransaction trans = systemDb.Connection.BeginTransaction()) { foreach (var langFile in langInfo.Items.Values) { if (langFile.FileCode == 0) { var msg = $"Unknown FileCode({langFile.FileCode})."; logger.Fatal(msg); throw new Exception(msg); } else { SQLiteCommand cmd = systemDb.Connection.CreateCommand(); cmd.CommandText = "INSERT INTO LanguageEntries VALUES(@FileCode,@ID,@ReferenceID,@ReferenceText,@DefaultText,@FemaleText,@ProductLine,@UpdatedAt);"; //// パラメータのセット cmd.Parameters.Add("FileCode", System.Data.DbType.Int64); cmd.Parameters.Add("ID", System.Data.DbType.Int32); cmd.Parameters.Add("ReferenceID", System.Data.DbType.Int64); cmd.Parameters.Add("ReferenceText", System.Data.DbType.String); cmd.Parameters.Add("DefaultText", System.Data.DbType.String); cmd.Parameters.Add("FemaleText", System.Data.DbType.String); cmd.Parameters.Add("ProductLine", System.Data.DbType.Int32); cmd.Parameters.Add("UpdatedAt", System.Data.DbType.Int64); foreach (var entry in langFile.Items) { cmd.Parameters["FileCode"].Value = langFile.FileCode; cmd.Parameters["ID"].Value = entry.ID; cmd.Parameters["ReferenceID"].Value = entry.ReferenceID; cmd.Parameters["ReferenceText"].Value = MieHashTools.ComputeHashIds(entry.ReferenceID); cmd.Parameters["DefaultText"].Value = entry.DefaultText; cmd.Parameters["FemaleText"].Value = entry.FemaleText; cmd.Parameters["ProductLine"].Value = (int)entry.ProductLine; cmd.Parameters["UpdatedAt"].Value = entry.UpdatedAt.Ticks; try { cmd.ExecuteNonQuery(); } catch (Exception ex) { logger.Error(ex, $"LanguageEntries: FileCode({langFile.FileCode}) ID({entry.ID})"); } } } } trans.Commit(); } }
/// <summary> /// 日本語化とXMLファイルの保存。 /// </summary> /// <param name="fileID">FileID</param> /// <param name="enFolderPath">原文のXMLファイルのパス</param> /// <param name="jpFolderPath">日本語版のXMLファイルのパス</param> /// <param name="transSheetFile">翻訳シートファイル</param> /// <param name="useReferenceID">ReferenceIDの有無</param> public static void SaveToXml( string fileID, string enFolderPath, string jpFolderPath, MieTransSheetFile transSheetFile, bool useReferenceID = false) { //// StringTableの読み込み var enPath = Path.Combine(enFolderPath, fileID + ".stringtable"); { //// Bugfix: stringtable内のNameパラメーターに誤りがあるため、修正する。 enPath = enPath.Replace("bounty encounters", "bounty_encounters"); } var stringTableFile = StringTableFile.Load(enPath); //// ファイル履歴の作成 MieLanguageHistoryFile mieLanguageHistoryFile = new MieLanguageHistoryFile(stringTableFile.Name); //// FileIDを統一形式に変換する。 var commonFileID = MieStringUtils.NormalizedFileID(fileID); var fileCode = MieHashTools.ComputeFileID(commonFileID); if (transSheetFile == null) { //// 翻訳シートがない場合は転記しない。 } else { foreach (var entry in stringTableFile.Entries) { MieTransSheetEntry sheetEntry = transSheetFile.GetEntry(entry.ID); if (sheetEntry == null || string.IsNullOrWhiteSpace(entry.DefaultText)) { //// 原文の翻訳テキストが存在しない場合は転記しない。 } else { if (string.IsNullOrWhiteSpace(sheetEntry.DefaultTranslationText)) { //// 翻訳テキストが存在しない場合は転記しない。 } else { entry.DefaultText = sheetEntry.DefaultTranslationText; if (!string.IsNullOrWhiteSpace(entry.FemaleText)) { //// 女性版テキストが存在する場合は標準テキストを転記する。 entry.FemaleText = sheetEntry.DefaultTranslationText; } } } if (sheetEntry != null) { if (sheetEntry.FileID.StartsWith(@"game")) { if (useReferenceID) { entry.DefaultText = $"{sheetEntry.ReferenceID}:{entry.DefaultText}"; } } } } } var jpPath = Path.Combine(jpFolderPath, fileID + ".stringtable"); var jpFolder = Path.GetDirectoryName(jpPath); MieCommonUtils.SafeCreateDirectory(jpFolder); StringTableFile.Save(stringTableFile, jpPath, StringTableFile.ExportType.Xml); }
public static void CreateXml( string fileID, MieLanguageFile langFile, string jpPath, MieTransSheetFile transSheetFile, bool useMT, bool useReferenceID) { var stringTableFile = new StringTableFile(fileID); foreach (var tableEntry in langFile.Items) { MieTransSheetEntry transSheetEntry = null; if (transSheetFile != null) { transSheetEntry = transSheetFile.GetEntry(tableEntry.ID); } var translatedText = string.Empty; if (transSheetEntry == null) { //// 翻訳シートエントリーがないので、ReferenceIDを個別に算出。 //// no | useRef | en | result //// 0 | o | o | ref付きen //// 1 | o | x | en //// 2 | x | o | en //// 3 | x | x | en if (useReferenceID && !string.IsNullOrEmpty(tableEntry.DefaultText)) //// 0 { //// 翻訳シートにエントリーが存在しない。 logger.Error($"TransSheetEntry not found. Product({tableEntry.ProductLine.ToString()}) FileID({fileID}), ID({tableEntry.ID})"); //// ReferenceIDを算出。 long referenceID = MieHashTools.ComputeReferenceID(stringTableFile.Name, tableEntry.ID); //// ReferenceIDからhash文字列を生成 var strReferenceID = $"{MieHashTools.ComputeHashIds(referenceID)}:"; translatedText = $"{strReferenceID}{tableEntry.DefaultText}"; } else { translatedText = tableEntry.DefaultText; } } else { //// 翻訳 translatedText = transSheetEntry.Translate(tableEntry.DefaultText, useMT, useReferenceID); } if (string.IsNullOrWhiteSpace(tableEntry.FemaleText)) { //// 女性の台詞なしの場合。 var entry = new StringTableFile.Entry(tableEntry.ID, translatedText); stringTableFile.Entries.Add(entry); } else { //// 女性の台詞ありの場合。 //// 男性と同じ台詞を割り当てる。 var entry = new StringTableFile.Entry(tableEntry.ID, translatedText, translatedText); stringTableFile.Entries.Add(entry); } } Console.WriteLine(fileID); SaveToXml(fileID, stringTableFile, jpPath); }