internal static Localization Deserialize(JsonObject jsonObject) { var codepage = jsonObject.GetValueOrDefault("codepage", 0); var culture = jsonObject.GetValueOrDefault <string>("culture"); var variables = new Dictionary <string, BindVariable>(); var variablesJson = jsonObject.GetValueOrDefault("variables", new JsonArray()); foreach (JsonObject variableJson in variablesJson) { var bindPath = BindVariable.Deserialize(variableJson); variables.Add(bindPath.Id, bindPath); } var controls = new Dictionary <string, LocalizedControl>(); var controlsJson = jsonObject.GetValueOrDefault <JsonObject>("controls"); if (controlsJson != null) { foreach (var controlJsonWithKey in controlsJson) { var control = LocalizedControl.Deserialize((JsonObject)controlJsonWithKey.Value); controls.Add(controlJsonWithKey.Key, control); } } return(new Localization(codepage, culture, variables, controls)); }
/// <summary> /// Parse a localization string into a WixVariableRow. /// </summary> /// <param name="node">Element to parse.</param> private static void ParseString(IMessaging messaging, XElement node, IDictionary <string, BindVariable> variables) { string id = null; bool overridable = false; 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 "Id": id = Common.GetAttributeIdentifierValue(messaging, sourceLineNumbers, attrib); break; case "Overridable": overridable = YesNoType.Yes == Common.GetAttributeYesNoValue(messaging, sourceLineNumbers, attrib); break; case "Localizable": ; // do nothing break; default: messaging.Write(ErrorMessages.UnexpectedAttribute(sourceLineNumbers, attrib.Parent.Name.ToString(), attrib.Name.ToString())); break; } } else { messaging.Write(ErrorMessages.UnsupportedExtensionAttribute(sourceLineNumbers, attrib.Parent.Name.ToString(), attrib.Name.ToString())); } } string value = Common.GetInnerText(node); if (null == id) { messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, "String", "Id")); } else if (0 == id.Length) { messaging.Write(ErrorMessages.IllegalIdentifier(sourceLineNumbers, "String", "Id", 0)); } if (!messaging.EncounteredError) { var variable = new BindVariable { SourceLineNumbers = sourceLineNumbers, Id = id, Overridable = overridable, Value = value, }; Localizer.AddWixVariable(messaging, variables, variable); } }
public void AddVariable(SourceLineNumber sourceLineNumber, string name, string value, bool overridable) { var bindVariable = new BindVariable { Id = name, Value = value, Overridable = overridable, SourceLineNumbers = sourceLineNumber }; if (!TryAddWixVariable(this.wixVariables, bindVariable)) { this.Messaging.Write(ErrorMessages.WixVariableCollision(sourceLineNumber, name)); } }
/// <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(IMessaging messaging, IDictionary <string, BindVariable> variables, BindVariable wixVariableRow) { if (!variables.TryGetValue(wixVariableRow.Id, out var existingWixVariableRow) || (existingWixVariableRow.Overridable && !wixVariableRow.Overridable)) { variables[wixVariableRow.Id] = wixVariableRow; } else if (!wixVariableRow.Overridable) { messaging.Write(ErrorMessages.DuplicateLocalizationIdentifier(wixVariableRow.SourceLineNumbers, wixVariableRow.Id)); } }
private static bool TryAddWixVariable(IDictionary <string, BindVariable> variables, BindVariable variable) { if (!variables.TryGetValue(variable.Id, out var existingWixVariableRow) || (existingWixVariableRow.Overridable && !variable.Overridable)) { variables[variable.Id] = variable; return(true); } return(variable.Overridable); }
public static bool IsAppConstructor(this BindVariable bind) { var lambda = bind.Expression as Lambda; return(lambda != null && lambda.Signature.ReturnType == App); }