/// <summary> /// Get a localized control. /// </summary> /// <param name="dialog">The optional id of the control's dialog.</param> /// <param name="control">The id of the control.</param> /// <returns>The localized control or null if it wasn't found.</returns> public LocalizedControl GetLocalizedControl(string dialog, string control) { LocalizedControl localizedControl; this.localizedControls.TryGetValue(LocalizedControl.GetKey(dialog, control), out localizedControl); return(localizedControl); }
/// <summary> /// Parse a localized control. /// </summary> /// <param name="node">Element to parse.</param> /// <param name="localizedControls">Dictionary of localized controls.</param> private static void ParseUI(XElement node, IDictionary <string, LocalizedControl> localizedControls) { string dialog = null; string control = null; int x = CompilerConstants.IntegerNotSet; int y = CompilerConstants.IntegerNotSet; int width = CompilerConstants.IntegerNotSet; int height = CompilerConstants.IntegerNotSet; int attribs = 0; string text = null; SourceLineNumber sourceLineNumbers = SourceLineNumber.CreateFromXObject(node); foreach (XAttribute attrib in node.Attributes()) { if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || Localizer.WxlNamespace == attrib.Name.Namespace) { switch (attrib.Name.LocalName) { case "Dialog": dialog = Common.GetAttributeIdentifierValue(sourceLineNumbers, attrib); break; case "Control": control = Common.GetAttributeIdentifierValue(sourceLineNumbers, attrib); break; case "X": x = Common.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, short.MaxValue); break; case "Y": y = Common.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, short.MaxValue); break; case "Width": width = Common.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, short.MaxValue); break; case "Height": height = Common.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, short.MaxValue); break; case "RightToLeft": if (YesNoType.Yes == Common.GetAttributeYesNoValue(sourceLineNumbers, attrib)) { attribs |= MsiInterop.MsidbControlAttributesRTLRO; } break; case "RightAligned": if (YesNoType.Yes == Common.GetAttributeYesNoValue(sourceLineNumbers, attrib)) { attribs |= MsiInterop.MsidbControlAttributesRightAligned; } break; case "LeftScroll": if (YesNoType.Yes == Common.GetAttributeYesNoValue(sourceLineNumbers, attrib)) { attribs |= MsiInterop.MsidbControlAttributesLeftScroll; } break; default: Common.UnexpectedAttribute(sourceLineNumbers, attrib); break; } } else { Common.UnexpectedAttribute(sourceLineNumbers, attrib); } } text = Common.GetInnerText(node); if (String.IsNullOrEmpty(control) && 0 < attribs) { if (MsiInterop.MsidbControlAttributesRTLRO == (attribs & MsiInterop.MsidbControlAttributesRTLRO)) { Messaging.Instance.OnMessage(WixErrors.IllegalAttributeWithoutOtherAttributes(sourceLineNumbers, node.Name.ToString(), "RightToLeft", "Control")); } else if (MsiInterop.MsidbControlAttributesRightAligned == (attribs & MsiInterop.MsidbControlAttributesRightAligned)) { Messaging.Instance.OnMessage(WixErrors.IllegalAttributeWithoutOtherAttributes(sourceLineNumbers, node.Name.ToString(), "RightAligned", "Control")); } else if (MsiInterop.MsidbControlAttributesLeftScroll == (attribs & MsiInterop.MsidbControlAttributesLeftScroll)) { Messaging.Instance.OnMessage(WixErrors.IllegalAttributeWithoutOtherAttributes(sourceLineNumbers, node.Name.ToString(), "LeftScroll", "Control")); } } if (String.IsNullOrEmpty(control) && String.IsNullOrEmpty(dialog)) { Messaging.Instance.OnMessage(WixErrors.ExpectedAttributesWithOtherAttribute(sourceLineNumbers, node.Name.ToString(), "Dialog", "Control")); } if (!Messaging.Instance.EncounteredError) { LocalizedControl localizedControl = new LocalizedControl(dialog, control, x, y, width, height, attribs, text); string key = localizedControl.GetKey(); if (localizedControls.ContainsKey(key)) { if (String.IsNullOrEmpty(localizedControl.Control)) { Messaging.Instance.OnMessage(WixErrors.DuplicatedUiLocalization(sourceLineNumbers, localizedControl.Dialog)); } else { Messaging.Instance.OnMessage(WixErrors.DuplicatedUiLocalization(sourceLineNumbers, localizedControl.Dialog, localizedControl.Control)); } } else { localizedControls.Add(key, localizedControl); } } }
/// <summary> /// Parse a localized control. /// </summary> /// <param name="node">Element to parse.</param> /// <param name="localization">The localization being parsed.</param> private void ParseUI(XElement node) { string dialog = null; string control = null; int x = CompilerConstants.IntegerNotSet; int y = CompilerConstants.IntegerNotSet; int width = CompilerConstants.IntegerNotSet; int height = CompilerConstants.IntegerNotSet; int attribs = 0; string text = null; 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 "Dialog": dialog = Common.GetAttributeIdentifierValue(sourceLineNumbers, attrib, null); break; case "Control": control = Common.GetAttributeIdentifierValue(sourceLineNumbers, attrib, null); break; case "X": x = Common.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, short.MaxValue, null); break; case "Y": y = Common.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, short.MaxValue, null); break; case "Width": width = Common.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, short.MaxValue, null); break; case "Height": height = Common.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, short.MaxValue, null); break; case "RightToLeft": if (YesNoType.Yes == Common.GetAttributeYesNoValue(sourceLineNumbers, attrib, null)) { attribs |= MsiInterop.MsidbControlAttributesRTLRO; } break; case "RightAligned": if (YesNoType.Yes == Common.GetAttributeYesNoValue(sourceLineNumbers, attrib, null)) { attribs |= MsiInterop.MsidbControlAttributesRightAligned; } break; case "LeftScroll": if (YesNoType.Yes == Common.GetAttributeYesNoValue(sourceLineNumbers, attrib, null)) { attribs |= MsiInterop.MsidbControlAttributesLeftScroll; } break; default: Common.UnexpectedAttribute(sourceLineNumbers, attrib, Localization.OnMessage); break; } } else { Common.UnsupportedExtensionAttribute(sourceLineNumbers, attrib, Localization.OnMessage); } } text = Common.GetInnerText(node); if (String.IsNullOrEmpty(control) && 0 < attribs) { if (MsiInterop.MsidbControlAttributesRTLRO == (attribs & MsiInterop.MsidbControlAttributesRTLRO)) { throw new WixException(WixErrors.IllegalAttributeWithoutOtherAttributes(sourceLineNumbers, node.Name.ToString(), "RightToLeft", "Control")); } else if (MsiInterop.MsidbControlAttributesRightAligned == (attribs & MsiInterop.MsidbControlAttributesRightAligned)) { throw new WixException(WixErrors.IllegalAttributeWithoutOtherAttributes(sourceLineNumbers, node.Name.ToString(), "RightAligned", "Control")); } else if (MsiInterop.MsidbControlAttributesLeftScroll == (attribs & MsiInterop.MsidbControlAttributesLeftScroll)) { throw new WixException(WixErrors.IllegalAttributeWithoutOtherAttributes(sourceLineNumbers, node.Name.ToString(), "LeftScroll", "Control")); } } if (String.IsNullOrEmpty(control) && String.IsNullOrEmpty(dialog)) { throw new WixException(WixErrors.ExpectedAttributesWithOtherAttribute(sourceLineNumbers, node.Name.ToString(), "Dialog", "Control")); } string key = LocalizedControl.GetKey(dialog, control); if (this.localizedControls.ContainsKey(key)) { if (String.IsNullOrEmpty(control)) { throw new WixException(WixErrors.DuplicatedUiLocalization(sourceLineNumbers, dialog)); } else { throw new WixException(WixErrors.DuplicatedUiLocalization(sourceLineNumbers, dialog, control)); } } this.localizedControls.Add(key, new LocalizedControl(x, y, width, height, attribs, text)); }
/// <summary> /// Persists a localization file into an XML format. /// </summary> /// <param name="writer">XmlWriter where the localization file should persist itself as XML.</param> public void Persist(XmlWriter writer) { writer.WriteStartElement(Localization.XmlElementName, WxlNamespace.NamespaceName); if (-1 != this.codepage) { writer.WriteAttributeString("Codepage", this.codepage.ToString(CultureInfo.InvariantCulture)); } if (!String.IsNullOrEmpty(this.culture)) { writer.WriteAttributeString("Culture", this.culture); } foreach (WixVariableRow wixVariableRow in this.variables.Values) { writer.WriteStartElement("String", WxlNamespace.NamespaceName); writer.WriteAttributeString("Id", wixVariableRow.Id); if (wixVariableRow.Overridable) { writer.WriteAttributeString("Overridable", "yes"); } writer.WriteCData(wixVariableRow.Value); writer.WriteEndElement(); } foreach (string controlKey in this.localizedControls.Keys) { writer.WriteStartElement("UI", WxlNamespace.NamespaceName); string[] controlKeys = controlKey.Split('/'); string dialog = controlKeys[0]; string control = controlKeys[1]; if (!String.IsNullOrEmpty(dialog)) { writer.WriteAttributeString("Dialog", dialog); } if (!String.IsNullOrEmpty(control)) { writer.WriteAttributeString("Control", control); } LocalizedControl localizedControl = this.localizedControls[controlKey]; if (CompilerConstants.IntegerNotSet != localizedControl.X) { writer.WriteAttributeString("X", localizedControl.X.ToString()); } if (CompilerConstants.IntegerNotSet != localizedControl.Y) { writer.WriteAttributeString("Y", localizedControl.Y.ToString()); } if (CompilerConstants.IntegerNotSet != localizedControl.Width) { writer.WriteAttributeString("Width", localizedControl.Width.ToString()); } if (CompilerConstants.IntegerNotSet != localizedControl.Height) { writer.WriteAttributeString("Height", localizedControl.Height.ToString()); } if (MsiInterop.MsidbControlAttributesRTLRO == (localizedControl.Attributes & MsiInterop.MsidbControlAttributesRTLRO)) { writer.WriteAttributeString("RightToLeft", "yes"); } if (MsiInterop.MsidbControlAttributesRightAligned == (localizedControl.Attributes & MsiInterop.MsidbControlAttributesRightAligned)) { writer.WriteAttributeString("RightAligned", "yes"); } if (MsiInterop.MsidbControlAttributesLeftScroll == (localizedControl.Attributes & MsiInterop.MsidbControlAttributesLeftScroll)) { writer.WriteAttributeString("LeftScroll", "yes"); } if (!String.IsNullOrEmpty(localizedControl.Text)) { writer.WriteCData(localizedControl.Text); } writer.WriteEndElement(); } writer.WriteEndElement(); }