/// <summary> /// Create a new file content /// </summary> public TranslationFileContent(TranslationFile file, String group) { if (file == null) throw new ArgumentNullException("file"); this.File = file; this.Group = group; this.Content = new List<TranslationFileValue>(); }
/// <summary> /// Create a new content /// </summary> public TranslationContent(String group, TranslationFile neutral, TranslationFile translations) { if (neutral == null) throw new ArgumentNullException("neutral"); this.Group = group; this.Content = new List<TranslationContentValue>(); this.NeutralFile = neutral; this.TranslationsFile = translations; }
/// <summary> /// Add a file in the group /// </summary> public TranslationFile AddFile(String file) { var tf = FindFile(file); if (tf == null) { tf = new TranslationFile(file); Files.Add(tf); } return tf; }
/// <summary> /// Read the translations from a translation file /// </summary> public static IEnumerable<TranslationFileValue> ReadFile(TranslationFile file, String group) { if (file == null) return null; if (String.Equals("dll", file.FileType, StringComparison.OrdinalIgnoreCase)) return ReadExecutableFile(group ?? file.FileName, file.File); if (String.Equals("exe", file.FileType, StringComparison.OrdinalIgnoreCase)) return ReadExecutableFile(group ?? file.FileName, file.File); if (String.Equals("resx", file.FileType, StringComparison.OrdinalIgnoreCase)) return ReadResourceFile(group ?? file.FileName, file.File); if (String.Equals("xml", file.FileType, StringComparison.OrdinalIgnoreCase)) return ReadXmlDocFile(file.File); throw new ArgumentException(Locales.SR.Error_CantReadFileType, file.FileType); }
/// <summary> /// New translation file /// </summary> public TranslationFileViewModel(GroupViewModel group, TranslationFile file) { this.Group = group; this.File = file; if (this.File.IsNeutral) { this.Caption = Locales.SR.NeutralLanguageFile_Caption; } else { try { this.Culture = CultureInfo.GetCultureInfo(file.Language); } catch { } if (this.Culture == null) this.Caption = String.Format(Locales.SR.UnknownLanguageFile_Caption, this.File.Language); else this.Caption = this.Culture.DisplayName; } }
/// <summary> /// Load a content /// </summary> public static TranslationFileContent Load(TranslationFile file, String group) { TranslationFileContent content = new TranslationFileContent(file, group); content.LoadContent(); return content; }
/// <summary> /// Scan for extensions translations /// </summary> int ScanForExtensionsInFolder(String folder) { int result = 0; if (!Directory.Exists(folder)) return result; // Search all .xml files with a .dll foreach (var dllFile in Directory.GetFiles(folder, "*.dll", SearchOption.TopDirectoryOnly)) { var dllTf = new TranslationFile(dllFile); // Exclude known DLL if (String.Equals("SmallBasicLibrary", dllTf.FileName, StringComparison.OrdinalIgnoreCase)) continue; // Check the the neutral XML file exists if (!File.Exists(dllFile.Substring(0, dllFile.Length - 4) + ".xml")) continue; // Search XML files for this DLL var files = Directory.GetFiles(folder, dllTf.FileName + "*.xml", SearchOption.TopDirectoryOnly); if (files.Length == 0) continue; // Find or create the extension group var group = FindOrCreateGroup(dllTf.FileName, String.Format(Locales.SR.TransGroup_Extension_Caption, dllTf.FileName)); // Add files foreach (var file in files) group.AddFile(file); result++; } return result; }
/// <summary> /// Write the translations in a XmlDoc file /// </summary> public static void WriteXmlDocFile(TranslationFile file, IEnumerable<TranslationFileValue> translations) { XElement members = new XElement("members"); XDocument xdoc = new XDocument( new XDeclaration("1.0", "UTF-8", null), new XElement("doc", new XElement("assembly", new XElement("name", file.FileName)), members ) ); foreach (var gTranslations in translations.GroupBy(m=>m.ReferenceGroup)) { XElement member = new XElement("member", new XAttribute("name", gTranslations.Key)); foreach (var trans in gTranslations) { XElement xtrans; var parts = trans.ReferenceCode.Split('@'); try { xtrans = XElement.Parse(String.Format("<{0}>{1}</{0}>", parts[0], trans.Translation)); } catch { xtrans = new XElement(parts[0], trans.Translation); } for (int i = 1; i < parts.Length; i++) { var aparts = parts[1].Split(new char[] { ':' }, 2); xtrans.Add(new XAttribute(aparts[0], aparts[1])); } member.Add(xtrans); } members.Add(member); } xdoc.Save(file.File); }
/// <summary> /// Write the translations in a resource file /// </summary> public static void WriteResourceFile(TranslationFile file, IEnumerable<TranslationFileValue> translations) { XDocument xdoc = XDocument.Parse(Properties.Resources.BaseXmlResourceFile); foreach (var trans in translations) { var xTrans = new XElement( "data", new XAttribute("name", trans.ReferenceCode), new XAttribute(XNamespace.Xml + "space", "preserve"), new XElement("value", trans.Translation) ); if (!String.IsNullOrWhiteSpace(trans.Description)) xTrans.Add(new XElement("comment", trans.Description)); xdoc.Root.Add(xTrans); } xdoc.Save(file.File); }
/// <summary> /// Write the translation in a file /// </summary> public static bool WriteFile(TranslationFile file, String group, IEnumerable<TranslationFileValue> values, bool backupExistingFile) { if (file == null) return false; if (String.Equals("dll", file.FileType, StringComparison.OrdinalIgnoreCase)) return false; if (String.Equals("exe", file.FileType, StringComparison.OrdinalIgnoreCase)) return false; if (String.Equals("resx", file.FileType, StringComparison.OrdinalIgnoreCase)) { if (backupExistingFile) BackupFile(file.File); WriteResourceFile(file, values); return true; } if (String.Equals("xml", file.FileType, StringComparison.OrdinalIgnoreCase)) { if (backupExistingFile) BackupFile(file.File); WriteXmlDocFile(file, values); return true; } throw new ArgumentException(Locales.SR.Error_CantWriteFileType, file.FileType); }