mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2026-02-09 09:16:41 +08:00
LocalizationStreamParser should not fail on faulty PO files
Closes #7387
This commit is contained in:
committed by
Sébastien Ros
parent
c48635540b
commit
fab73d7157
@@ -39,5 +39,21 @@ namespace Orchard.Tests.Localization {
|
|||||||
|
|
||||||
Assert.AreEqual("Foo \"{0}\"", translations["~/themes/mytheme/views/myview.cshtml|foo \"{0}\""]);
|
Assert.AreEqual("Foo \"{0}\"", translations["~/themes/mytheme/views/myview.cshtml|foo \"{0}\""]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void ShouldHandleUnclosedQuote() {
|
||||||
|
var parser = new LocalizationStreamParser();
|
||||||
|
|
||||||
|
var text = new StringBuilder();
|
||||||
|
text.AppendLine("#: ~/Themes/MyTheme/Views/MyView.cshtml");
|
||||||
|
text.AppendLine("msgctxt \"");
|
||||||
|
text.AppendLine("msgid \"Foo \\\"{0}\\\"\"");
|
||||||
|
text.AppendLine("msgstr \"Foo \\\"{0}\\\"\"");
|
||||||
|
|
||||||
|
var translations = new Dictionary<string, string>();
|
||||||
|
parser.ParseLocalizationStream(text.ToString(), translations, false);
|
||||||
|
|
||||||
|
Assert.AreEqual("Foo \"{0}\"", translations["|foo \"{0}\""]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using Orchard.Logging;
|
||||||
|
|
||||||
namespace Orchard.Localization.Services {
|
namespace Orchard.Localization.Services {
|
||||||
|
|
||||||
@@ -13,6 +14,12 @@ namespace Orchard.Localization.Services {
|
|||||||
{ 't', '\t' }
|
{ 't', '\t' }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public LocalizationStreamParser() {
|
||||||
|
Logger = NullLogger.Instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ILogger Logger { get; }
|
||||||
|
|
||||||
public void ParseLocalizationStream(string text, IDictionary<string, string> translations, bool merge) {
|
public void ParseLocalizationStream(string text, IDictionary<string, string> translations, bool merge) {
|
||||||
var reader = new StringReader(text);
|
var reader = new StringReader(text);
|
||||||
string poLine;
|
string poLine;
|
||||||
@@ -96,27 +103,33 @@ namespace Orchard.Localization.Services {
|
|||||||
return sb == null ? str : sb.ToString();
|
return sb == null ? str : sb.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string TrimQuote(string str) {
|
private string TrimQuote(string str) {
|
||||||
if (str.StartsWith("\"") && str.EndsWith("\"")) {
|
if (str.StartsWith("\"") && str.EndsWith("\"")) {
|
||||||
|
if (str.Length == 1) {
|
||||||
|
// Handle corner case - string containing single quote
|
||||||
|
Logger.Warning("Invalid localization string detected: " + str);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
return str.Substring(1, str.Length - 2);
|
return str.Substring(1, str.Length - 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string ParseTranslation(string poLine) {
|
private string ParseTranslation(string poLine) {
|
||||||
return Unescape(TrimQuote(poLine.Substring(6).Trim()));
|
return Unescape(TrimQuote(poLine.Substring(6).Trim()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string ParseId(string poLine) {
|
private string ParseId(string poLine) {
|
||||||
return Unescape(TrimQuote(poLine.Substring(5).Trim()));
|
return Unescape(TrimQuote(poLine.Substring(5).Trim()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string ParseScope(string poLine) {
|
private string ParseScope(string poLine) {
|
||||||
return Unescape(TrimQuote(poLine.Substring(2).Trim()));
|
return Unescape(TrimQuote(poLine.Substring(2).Trim()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string ParseContext(string poLine) {
|
private string ParseContext(string poLine) {
|
||||||
return Unescape(TrimQuote(poLine.Substring(7).Trim()));
|
return Unescape(TrimQuote(poLine.Substring(7).Trim()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user