diff --git a/src/Orchard/Localization/Services/DefaultLocalizedStringManager.cs b/src/Orchard/Localization/Services/DefaultLocalizedStringManager.cs index 85793d536..4312c64f0 100644 --- a/src/Orchard/Localization/Services/DefaultLocalizedStringManager.cs +++ b/src/Orchard/Localization/Services/DefaultLocalizedStringManager.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Globalization; using System.IO; +using System.Text; using Orchard.Caching; using Orchard.Environment.Configuration; using Orchard.Environment.Extensions; @@ -166,6 +167,46 @@ namespace Orchard.Localization.Services { return translations; } + private static readonly Dictionary _escapeTranslations = new Dictionary { + { 'n', '\n' }, + { 'r', '\r' }, + { 't', '\t' } + }; + + private static string Unescape(string str) { + StringBuilder sb = null; + bool escaped = false; + for (var i = 0; i < str.Length; i++) { + var c = str[i]; + if (escaped) { + if (sb == null) { + sb = new StringBuilder(str.Length); + if (i > 1) { + sb.Append(str.Substring(0, i - 1)); + } + } + char unescaped; + if (_escapeTranslations.TryGetValue(c, out unescaped)) { + sb.Append(unescaped); + } + else { + // General rule: \x ==> x + sb.Append(c); + } + escaped = false; + } + else { + if (c == '\\') { + escaped = true; + } + else if (sb != null) { + sb.Append(c); + } + } + } + return sb == null ? str : sb.ToString(); + } + private static void ParseLocalizationStream(string text, IDictionary translations, bool merge) { StringReader reader = new StringReader(text); string poLine, id, scope; @@ -202,15 +243,15 @@ namespace Orchard.Localization.Services { } private static string ParseTranslation(string poLine) { - return poLine.Substring(6).Trim().Trim('"'); + return Unescape(poLine.Substring(6).Trim().Trim('"')); } private static string ParseId(string poLine) { - return poLine.Substring(5).Trim().Trim('"'); + return Unescape(poLine.Substring(5).Trim().Trim('"')); } private static string ParseScope(string poLine) { - return poLine.Substring(2).Trim().Trim('"'); + return Unescape(poLine.Substring(2).Trim().Trim('"')); } class CultureDictionary {