示例#1
0
        public void NuggetParser_CanParseEntity_MultiLineNugget01()
        {
            // Arrange.
            NuggetTokens nuggetTokens = new NuggetTokens("[[[", "]]]", "|||", "///", "(((", ")))");
            NuggetParser nuggetParser = new NuggetParser(nuggetTokens, NuggetParser.Context.SourceProcessing);
            string       entity       = "<p>[[[hello\r\n%0|||{0}]]]</p><p>[[[there]]]</p>";
            // Act.
            int i = 0;

            nuggetParser.ParseString(entity, delegate(string nuggetString, int pos, Nugget nugget1, string entity1)
            {
                switch (i++)
                {
                case 0: {
                    Assert.AreEqual(nugget1, new Nugget {
                            MsgId = "hello\r\n%0", FormatItems = new string[] { "{0}" }
                        });
                    break;
                }

                case 1: {
                    Assert.AreEqual(nugget1, new Nugget {
                            MsgId = "there"
                        });
                    break;
                }

                default:
                    Assert.Fail();
                    break;
                }
                return(null);
            });
        }
示例#2
0
        private void CanParseEntity_CustomNuggetTokens_Act(string entity, NuggetParser nuggetParser)
        {
            // Act.
            int i = 0;

            nuggetParser.ParseString(entity, delegate(string nuggetString, int pos, Nugget nugget1, string entity1)
            {
                switch (i++)
                {
                case 0: {
                    Assert.AreEqual(nugget1, new Nugget {
                            MsgId = "hello", FormatItems = new string[] { "{0}" }
                        });
                    break;
                }

                case 1: {
                    Assert.AreEqual(nugget1, new Nugget {
                            MsgId = "there", FormatItems = new string[] { "{0}", "{1}" }, Comment = "comment comment comment"
                        });
                    break;
                }

                default:
                    Assert.Fail();
                    break;
                }
                return(null);
            });
        }
示例#3
0
        public void NuggetParser_CanParseEntity03()
        {
            // Arrange.
            NuggetTokens nuggetTokens = new NuggetTokens("[[[", "]]]", "|||", "///", "(((", ")))");
            NuggetParser nuggetParser = new NuggetParser(nuggetTokens, NuggetParser.Context.SourceProcessing);
            string       entity       = "<p>[[[hello|||{0}]]]</p><p>[[[there|||{0}|||{1}///comment comment comment]]]</p>";

            // Act.
            nuggetParser.ParseString(entity, delegate(string nuggetString, int pos, Nugget nugget1, string entity1)
            {
                if (pos == 3)
                {
                    Assert.AreEqual(nugget1, new Nugget {
                        MsgId = "hello", FormatItems = new string[] { "{0}" }
                    });
                }
                else if (pos == 27)
                {
                    Assert.AreEqual(nugget1, new Nugget {
                        MsgId = "there", FormatItems = new string[] { "{0}", "{1}" }, Comment = "comment comment comment"
                    });
                }
                else
                {
                    Assert.Fail();
                }
                return(null);
            });
        }
示例#4
0
        public void NuggetParser_CanParseEntity01()
        {
            // Arrange.
            NuggetTokens nuggetTokens = new NuggetTokens("[[[", "]]]", "|||", "///", "(((", ")))");
            NuggetParser nuggetParser = new NuggetParser(nuggetTokens, NuggetParser.Context.SourceProcessing);
            string       entity       = "<p>[[[hello]]]</p><p>[[[there]]]</p>";

            // Act.
            nuggetParser.ParseString(entity, delegate(string nuggetString, int pos, Nugget nugget1, string entity1)
            {
                if (pos == 3)
                {
                    Assert.AreEqual(nugget1, new Nugget {
                        MsgId = "hello"
                    });
                }
                else if (pos == 21)
                {
                    Assert.AreEqual(nugget1, new Nugget {
                        MsgId = "there"
                    });
                }
                else
                {
                    Assert.Fail();
                }
                return(null);
            });
        }
示例#5
0
        void ParseFile(string projectDirectory, string filePath, ConcurrentDictionary <string, TemplateItem> templateItems)
        {
            var referencePath = PathNormalizer.MakeRelativePath(projectDirectory, filePath);

            DebugHelpers.WriteLine("FileNuggetFinder.ParseFile -- {0}", filePath);
            // Lookup any/all nuggets in the file and for each add a new template item.
            using var fs           = I18NUtility.Retry(() => File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read), 3);
            using var streamReader = new StreamReader(fs);

            _nuggetParser.ParseString(streamReader.ReadToEnd(), delegate(string nuggetString, int pos, Nugget nugget, string iEntity)
            {
                var referenceContext = _localizationOptions.DisableReferences
                    ? ReferenceContext.Create("Disabled references", iEntity, 0)
                    : ReferenceContext.Create(referencePath, iEntity, pos);
                var fileName = Path.GetFileNameWithoutExtension(filePath);
                // If we have a file like "myfile.aspx.vb" then the fileName will be "myfile.aspx" resulting in split
                // .pot files. So remove all extensions, so that we just have the actual name to deal with.
                fileName = fileName.IndexOf('.') > -1 ? fileName.Split('.')[0] : fileName;

                AddNewTemplateItem(
                    fileName,
                    referenceContext,
                    nugget,
                    templateItems);
                // Done.
                return(null); // null means we are not modifying the entity.
            });
        }
示例#6
0
        public void NuggetParser_ResponseMode_CanParseEntity_TwoParams_FirstNonEmpty_SecondEmpty()
        {
            var          nuggetTokens = new NuggetTokens("[[[", "]]]", "|||", "///", "(((", ")))");
            NuggetParser nuggetParser = new NuggetParser(nuggetTokens, NuggetParser.Context.ResponseProcessing);
            var          input        = "[[[Title: %0, %1|||X|||]]]";
            var          result       = nuggetParser.ParseString(input, (nuggetString, pos, nugget, i_entity) => {
                Assert.IsTrue(nugget.IsFormatted);
                return(nugget.MsgId);
            });

            Assert.AreEqual("Title: %0, %1", result);
        }
示例#7
0
        public void NuggetParser_SourceMode_CanParseEntity_EmptyParam()
        {
            var          nuggetTokens = new NuggetTokens("[[[", "]]]", "|||", "///", "(((", ")))");
            NuggetParser nuggetParser = new NuggetParser(nuggetTokens, NuggetParser.Context.SourceProcessing);
            var          input        = "[[[Title: %0|||]]]";
            var          result       = nuggetParser.ParseString(input, (nuggetString, pos, nugget, i_entity) => {
                Assert.IsFalse(nugget.IsFormatted);
                return(nugget.MsgId);
            });

            Assert.AreEqual("Title: %0|||", result);
        }
示例#8
0
        public void NuggetParser_ResponseMode_CanParseEntity_EmptyParam()
        {
            var          nuggetTokens = new NuggetTokens("[[[", "]]]", "|||", "///", "(((", ")))");
            NuggetParser nuggetParser = new NuggetParser(nuggetTokens, NuggetParser.Context.ResponseProcessing);
            var          input        = "[[[Title: %0|||]]]";
            var          result       = nuggetParser.ParseString(input, (nuggetString, pos, nugget, i_entity) => {
                Assert.IsTrue(nugget.IsFormatted);
                var message = NuggetLocalizer.ConvertIdentifiersInMsgId(nugget.MsgId);
                message     = String.Format(message, nugget.FormatItems);
                return(message);
            });

            Assert.AreEqual("Title: ", result);
        }
        private void ParseString(string projectDirectory, string content, string context, ConcurrentDictionary <string, TemplateItem> templateItems)
        {
            // Lookup any/all nuggets in the file and for each add a new template item.
            _nuggetParser.ParseString(content, delegate(string nuggetString, int pos, Nugget nugget, string i_entity)
            {
                var referenceContext = ReferenceContext.Create(context, i_entity, pos);

                AddNewTemplateItem(
                    referenceContext,
                    nugget,
                    templateItems);
                // Done.
                return(null); // null means we are not modifying the entity.
            });
        }
示例#10
0
        private void ParseFile(string projectDirectory, string filePath, ConcurrentDictionary <string, TemplateItem> templateItems)
        {
            var referencePath = PathNormalizer.MakeRelativePath(projectDirectory, filePath);

            DebugHelpers.WriteLine("FileNuggetFinder.ParseFile -- {0}", filePath);
            // Lookup any/all nuggets in the file and for each add a new template item.
            using (var fs = File.OpenText(filePath))
            {
                _nuggetParser.ParseString(fs.ReadToEnd(), delegate(string nuggetString, int pos, Nugget nugget, string i_entity)
                {
                    var referenceContext = ReferenceContext.Create(referencePath, i_entity, pos);

                    AddNewTemplateItem(
                        referenceContext,
                        nugget,
                        templateItems);
                    // Done.
                    return(null); // null means we are not modifying the entity.
                });
            }
        }
示例#11
0
        private void ParseFile(string projectDirectory, string filePath, ConcurrentDictionary <string, TemplateItem> templateItems)
        {
            var referencePath = (projectDirectory != null) && filePath.StartsWith(projectDirectory, StringComparison.OrdinalIgnoreCase)
                ? filePath.Substring(projectDirectory.Length + 1)
                : filePath;

            DebugHelpers.WriteLine("FileNuggetFinder.ParseFile -- {0}", filePath);
            // Lookup any/all nuggets in the file and for each add a new template item.
            using (var fs = File.OpenText(filePath))
            {
                _nuggetParser.ParseString(fs.ReadToEnd(), delegate(string nuggetString, int pos, Nugget nugget, string i_entity)
                {
                    AddNewTemplateItem(
                        referencePath,
                        i_entity.LineFromPos(pos),
                        nugget,
                        templateItems);
                    // Done.
                    return(null); // null means we are not modifying the entity.
                });
            }
        }
示例#12
0
        public string ProcessNuggets(string entity, LanguageItem[] languages)
        {
            // Lookup any/all msgid nuggets in the entity and replace with any translated message.
            string entityOut = _nuggetParser.ParseString(entity, delegate(string nuggetString, int pos, Nugget nugget, string i_entity)
            {
                // Formatted nuggets:
                //
                // A formatted nugget will be encountered here like this, say:
                //
                //    [[[Enter between %0 and %1 characters|||100|||6]]]
                //
                // while the original string in the code for this may have been:
                //
                //    [[[Enter between %0 and %1 characters|||{1}|||{2}]]]
                //
                // The canonical msgid part is that between the opening [[[ and the first |||:
                //
                //    Enter between %0 and %1 characters
                //
                // We use that for the lookup.
                //
                LanguageTag lt;
                string message;
                // Check for unit-test caller.
                if (_textLocalizer == null)
                {
                    return("test.message");
                }
                // Lookup resource using canonical msgid.
                message = _textLocalizer.GetText(
                    true, // true = try lookup with HtmlDecoded-msgid if lookup with raw msgid fails.
                    nugget.MsgId,
                    nugget.Comment,
                    languages,
                    out lt);
                //
                if (nugget.IsFormatted)
                {
                    // Convert any identifies in a formatted nugget: %0 -> {0}
                    message = ConvertIdentifiersInMsgId(message);
                    // Format the message.
                    var formatItems = new List <string>(nugget.FormatItems);
                    try {
                        // translate nuggets in parameters
                        for (int i = 0; i < formatItems.Count; i++)
                        {
                            // if formatItem (parameter) is null or does not contain NuggetParameterBegintoken then continue
                            if (formatItems[i] == null || !formatItems[i].Contains(_settings.NuggetParameterBeginToken))
                            {
                                continue;
                            }

                            // replace parameter tokens with nugget tokens
                            var fItem = formatItems[i].Replace(_settings.NuggetParameterBeginToken, _settings.NuggetBeginToken).Replace(_settings.NuggetParameterEndToken, _settings.NuggetEndToken);
                            // and process nugget
                            formatItems[i] = ProcessNuggets(fItem, languages);
                        }

                        message = string.Format(message, formatItems.ToArray());
                    }
                    catch (FormatException /*e*/) {
                        //message += string.Format(" [FORMAT EXCEPTION: {0}]", e.Message);
                        message += "[FORMAT EXCEPTION]";
                    }
                }
                // Optional late custom message translation modification.
                if (LocalizedApplication.Current.TweakMessageTranslation != null)
                {
                    message = LocalizedApplication.Current.TweakMessageTranslation(
                        System.Web.HttpContext.Current.GetHttpContextBase(),
                        nugget,
                        lt,
                        message);
                }
                // Output modified message (to be subsituted for original in the source entity).
                DebugHelpers.WriteLine("I18N.NuggetLocalizer.ProcessNuggets -- msgid: {0,35}, message: {1}", nugget.MsgId, message);
                //
                if (_settings.VisualizeMessages)
                {
                    string languageToken = string.Empty;
                    if (!string.IsNullOrWhiteSpace(_settings.VisualizeLanguageSeparator))
                    {
                        languageToken = lt.ToString() + _settings.VisualizeLanguageSeparator;
                    }
                    string endToken = _settings.NuggetVisualizeToken;
                    if (!string.IsNullOrWhiteSpace(_settings.NuggetVisualizeEndToken))
                    {
                        endToken = _settings.NuggetVisualizeEndToken;
                    }
                    message = string.Format("{0}{1}{2}{3}", _settings.NuggetVisualizeToken, languageToken, message, endToken);
                }
                return(message);
                // NB: this was originally returning HttpUtility.HtmlEncode(message).
                // Ref #105 and #202 as to why changed back to returning message as is.
            });

            // Return modified entity.
            return(entityOut);
        }