/// <summary> /// Add a localization file. /// </summary> /// <param name="localization">The localization file to add.</param> public void AddLocalization(Localization localization) { if (-1 == this.codepage) { this.codepage = localization.Codepage; } foreach (WixVariableRow wixVariableRow in localization.Variables) { WixVariableRow existingWixVariableRow = (WixVariableRow)this.variables[wixVariableRow.Id]; if (null == existingWixVariableRow || (existingWixVariableRow.Overridable && !wixVariableRow.Overridable)) { this.variables[wixVariableRow.Id] = wixVariableRow; } else if (!wixVariableRow.Overridable) { this.OnMessage(WixErrors.DuplicateLocalizationIdentifier(wixVariableRow.SourceLineNumbers, wixVariableRow.Id)); } } foreach (KeyValuePair <string, LocalizedControl> localizedControl in localization.LocalizedControls) { if (!this.localizedControls.ContainsKey(localizedControl.Key)) { this.localizedControls.Add(localizedControl.Key, localizedControl.Value); } } }
/// <summary> /// Add a localization file. /// </summary> /// <param name="localization">The localization file to add.</param> public void AddLocalization(Localization localization) { if (-1 == this.codepage) { this.codepage = localization.Codepage; } else if (-1 != this.codepage && -1 != localization.Codepage && this.codepage != localization.Codepage) { this.OnMessage(WixErrors.DuplicateLocalizedCodepage(null, this.codepage)); } foreach (WixVariableRow wixVariableRow in localization.Variables) { WixVariableRow existingWixVariableRow = (WixVariableRow)this.variables[wixVariableRow.Id]; if (null == existingWixVariableRow || (existingWixVariableRow.Overridable && !wixVariableRow.Overridable)) { this.variables.Add(wixVariableRow.Id, wixVariableRow); } else if (!wixVariableRow.Overridable) { this.OnMessage(WixErrors.DuplicateLocalizationIdentifier(wixVariableRow.SourceLineNumbers, wixVariableRow.Id)); } } }
/// <summary> /// Parse a localization string. /// </summary> /// <param name="node">Element to parse.</param> private void ParseString(XmlNode node) { string id = null; bool overridable = false; SourceLineNumberCollection sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); foreach (XmlAttribute attrib in node.Attributes) { if (0 == attrib.NamespaceURI.Length || attrib.NamespaceURI == Localization.XmlNamespaceUri) { switch (attrib.LocalName) { case "Id": id = Common.GetAttributeIdentifierValue(sourceLineNumbers, attrib, null); break; case "Overridable": overridable = Common.IsYes(sourceLineNumbers, "String", attrib.Name, attrib.Value); break; case "Localizable": ; // do nothing break; default: throw new WixException(WixErrors.UnexpectedAttribute(sourceLineNumbers, attrib.OwnerElement.Name, attrib.Name)); } } else { throw new WixException(WixErrors.UnsupportedExtensionAttribute(sourceLineNumbers, attrib.OwnerElement.Name, attrib.Name)); } } string value = node.InnerText; if (null == id) { throw new WixException(WixErrors.ExpectedAttribute(sourceLineNumbers, "String", "Id")); } WixVariableRow wixVariableRow = new WixVariableRow(sourceLineNumbers, this.tableDefinitions["WixVariable"]); wixVariableRow.Id = id; wixVariableRow.Overridable = overridable; wixVariableRow.Value = value; WixVariableRow existingWixVariableRow = (WixVariableRow)this.variables[id]; if (null == existingWixVariableRow || (existingWixVariableRow.Overridable && !overridable)) { this.variables.Add(id, wixVariableRow); } else if (!overridable) { throw new WixException(WixErrors.DuplicateLocalizationIdentifier(sourceLineNumbers, id)); } }
/// <summary> /// Adds a WixVariableRow to a dictionary while performing the expected override checks. /// </summary> /// <param name="variables">Dictionary of variable rows.</param> /// <param name="wixVariableRow">Row to add to the variables dictionary.</param> private static void AddWixVariable(IDictionary <string, WixVariableRow> variables, WixVariableRow wixVariableRow) { WixVariableRow existingWixVariableRow; if (!variables.TryGetValue(wixVariableRow.Id, out existingWixVariableRow) || (existingWixVariableRow.Overridable && !wixVariableRow.Overridable)) { variables[wixVariableRow.Id] = wixVariableRow; } else if (!wixVariableRow.Overridable) { Messaging.Instance.OnMessage(WixErrors.DuplicateLocalizationIdentifier(wixVariableRow.SourceLineNumbers, wixVariableRow.Id)); } }
/// <summary> /// Merge the information from another localization object into this one. /// </summary> /// <param name="localization">The localization object to be merged into this one.</param> public void Merge(Localization localization) { foreach (WixVariableRow wixVariableRow in localization.Variables) { WixVariableRow existingWixVariableRow = (WixVariableRow)variables[wixVariableRow.Id]; if (null == existingWixVariableRow || (existingWixVariableRow.Overridable && !wixVariableRow.Overridable)) { variables[wixVariableRow.Id] = wixVariableRow; } else if (!wixVariableRow.Overridable) { throw new WixException(WixErrors.DuplicateLocalizationIdentifier(wixVariableRow.SourceLineNumbers, wixVariableRow.Id)); } } }
/// <summary> /// Parse a localization string. /// </summary> /// <param name="node">Element to parse.</param> private void ParseString(XElement node) { string id = null; bool overridable = false; SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); foreach (XAttribute attrib in node.Attributes()) { if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || Localization.WxlNamespace == attrib.Name.Namespace) { switch (attrib.Name.LocalName) { case "Id": id = Common.GetAttributeIdentifierValue(sourceLineNumbers, attrib, null); break; case "Overridable": overridable = YesNoType.Yes == Common.GetAttributeYesNoValue(sourceLineNumbers, attrib, null); break; case "Localizable": ; // do nothing break; default: throw new WixException(WixErrors.UnexpectedAttribute(sourceLineNumbers, attrib.Parent.Name.ToString(), attrib.Name.ToString())); } } else { throw new WixException(WixErrors.UnsupportedExtensionAttribute(sourceLineNumbers, attrib.Parent.Name.ToString(), attrib.Name.ToString())); } } string value = Common.GetInnerText(node); if (null == id) { throw new WixException(WixErrors.ExpectedAttribute(sourceLineNumbers, "String", "Id")); } else if (0 == id.Length) { throw new WixException(WixErrors.IllegalIdentifier(sourceLineNumbers, "String", "Id", 0)); } WixVariableRow wixVariableRow = new WixVariableRow(sourceLineNumbers, this.tableDefinitions["WixVariable"]); wixVariableRow.Id = id; wixVariableRow.Overridable = overridable; wixVariableRow.Value = value; WixVariableRow existingWixVariableRow = (WixVariableRow)this.variables[id]; if (null == existingWixVariableRow || (existingWixVariableRow.Overridable && !overridable)) { this.variables.Add(id, wixVariableRow); } else if (!overridable) { throw new WixException(WixErrors.DuplicateLocalizationIdentifier(sourceLineNumbers, id)); } }
/// <summary> /// Load localized strings from a wixloc file. /// </summary> /// <param name="path">Path to the wixloc file.</param> public void LoadFromFile(string path) { SourceLineNumberCollection sourceLineNumbers = SourceLineNumberCollection.FromFileName(path); try { XPathDocument doc = new XPathDocument(path); XPathNavigator nav = doc.CreateNavigator(); nav.MoveToRoot(); if (nav.MoveToFirstChild()) { // move to the first element (skipping comments and stuff) while (XPathNodeType.Element != nav.NodeType) { nav.MoveToNext(); } if ("WixLocalization" != nav.LocalName) { this.OnMessage(WixErrors.InvalidDocumentElement(sourceLineNumbers, nav.Name, "localization", "WixLocalization")); } if (nav.MoveToAttribute("Codepage", String.Empty)) { try { int newCodepage = Convert.ToInt32(nav.Value, CultureInfo.InvariantCulture.NumberFormat); // if the codepage has not been set if (-1 == this.codepage) { this.codepage = newCodepage; } else if (newCodepage != this.codepage) // fail if codepage has already been specified but is different { this.OnMessage(WixErrors.DuplicateLocalizedCodepage(sourceLineNumbers, nav.Value)); } } catch (FormatException) { this.OnMessage(WixErrors.IllegalIntegerValue(null, "WixLocalization", nav.Name, nav.Value)); } catch (OverflowException) { this.OnMessage(WixErrors.IllegalIntegerValue(null, "WixLocalization", nav.Name, nav.Value)); } nav.MoveToParent(); } if (nav.MoveToFirstChild()) { do { if (XPathNodeType.Element == nav.NodeType) { string localizationId = null; string localizationValue = String.Empty; if ("String" != nav.LocalName) { continue; } if (nav.MoveToAttribute("Id", String.Empty)) { localizationId = nav.Value; nav.MoveToParent(); } if (null == localizationId) { this.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, "String", "Id")); } if (nav.MoveToFirstChild()) { // find the text() of the element do { if (XPathNodeType.Text == nav.NodeType) { localizationValue = nav.Value; break; // found the text() of the element and bail } }while (nav.MoveToNext()); nav.MoveToParent(); // back up } if (!this.stringDictionary.ContainsKey(localizationId)) { this.stringDictionary.Add(localizationId, localizationValue); } else // duplicate localization identifier { this.OnMessage(WixErrors.DuplicateLocalizationIdentifier(sourceLineNumbers, localizationId)); } } }while (nav.MoveToNext()); } } } catch (DirectoryNotFoundException) { this.OnMessage(WixErrors.FileNotFound(path)); } catch (FileNotFoundException) { this.OnMessage(WixErrors.FileNotFound(path)); } catch (XmlException e) { this.OnMessage(WixErrors.InvalidXml(sourceLineNumbers, "localization", e.Message)); } }
/// <summary> /// Parse a localization string. /// </summary> /// <param name="reader">XmlReader where the localization file is persisted.</param> /// <param name="tableDefinitions">Collection containing TableDefinitions to use when loading the localization file.</param> /// <param name="localization">The localization being parsed.</param> private static void ParseString(XmlReader reader, TableDefinitionCollection tableDefinitions, Localization localization) { Debug.Assert("String" == reader.LocalName); bool empty = reader.IsEmptyElement; SourceLineNumberCollection sourceLineNumbers = SourceLineNumberCollection.FromUri(reader.BaseURI); string id = null; bool overridable = false; string value = String.Empty; // default this value to the empty string while (reader.MoveToNextAttribute()) { switch (reader.LocalName) { case "Id": id = reader.Value; break; case "Overridable": overridable = Common.IsYes(sourceLineNumbers, "String", reader.Name, reader.Value); break; default: if (!reader.NamespaceURI.StartsWith("http://www.w3.org/")) { throw new WixException(WixErrors.UnexpectedAttribute(sourceLineNumbers, "String", reader.Name)); } break; } } if (!empty) { bool done = false; while (!done && reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: throw new WixException(WixErrors.UnexpectedElement(sourceLineNumbers, "String", reader.Name)); case XmlNodeType.CDATA: case XmlNodeType.Text: if (0 < reader.Value.Length) { value = reader.Value; } break; case XmlNodeType.EndElement: done = true; break; } } if (!done) { throw new WixException(WixErrors.ExpectedEndElement(sourceLineNumbers, "String")); } } if (null == id) { throw new WixException(WixErrors.ExpectedAttribute(sourceLineNumbers, "String", "Id")); } WixVariableRow wixVariableRow = new WixVariableRow(sourceLineNumbers, tableDefinitions["WixVariable"]); wixVariableRow.Id = id; wixVariableRow.Overridable = overridable; wixVariableRow.Value = value; WixVariableRow existingWixVariableRow = (WixVariableRow)localization.variables[id]; if (null == existingWixVariableRow || (existingWixVariableRow.Overridable && !overridable)) { localization.variables.Add(id, wixVariableRow); } else if (!overridable) { throw new WixException(WixErrors.DuplicateLocalizationIdentifier(sourceLineNumbers, id)); } }