From 3ab9af06636f7d3986c77359231643ffcdda11ab Mon Sep 17 00:00:00 2001 From: Qstick Date: Wed, 18 Nov 2020 00:35:18 -0500 Subject: [PATCH] New: Portuguese (Brazil) Language Support --- .../Languages/LanguageFixture.cs | 14 +++++++++++-- .../LocalizationServiceFixture.cs | 12 ++++++++++- .../ParserTests/IsoLanguagesFixture.cs | 2 +- .../ParserTests/LanguageParserFixture.cs | 9 ++++++++ src/NzbDrone.Core/Languages/Language.cs | 2 ++ .../Localization/LocalizationService.cs | 21 ++++++++++++++++--- src/NzbDrone.Core/Parser/IsoLanguages.cs | 7 ++++--- src/NzbDrone.Core/Parser/LanguageParser.cs | 7 ++++++- 8 files changed, 63 insertions(+), 11 deletions(-) diff --git a/src/NzbDrone.Core.Test/Languages/LanguageFixture.cs b/src/NzbDrone.Core.Test/Languages/LanguageFixture.cs index 706c36541..654b3e908 100644 --- a/src/NzbDrone.Core.Test/Languages/LanguageFixture.cs +++ b/src/NzbDrone.Core.Test/Languages/LanguageFixture.cs @@ -34,7 +34,12 @@ public class LanguageFixture : CoreTest new object[] { 22, Language.Hungarian }, new object[] { 23, Language.Hebrew }, new object[] { 24, Language.Lithuanian }, - new object[] { 25, Language.Czech } + new object[] { 25, Language.Czech }, + new object[] { 26, Language.Hindi }, + new object[] { 27, Language.Romanian }, + new object[] { 28, Language.Thai }, + new object[] { 29, Language.Bulgarian }, + new object[] { 30, Language.PortugueseBR } }; public static object[] ToIntCases = @@ -63,7 +68,12 @@ public class LanguageFixture : CoreTest new object[] { Language.Hungarian, 22 }, new object[] { Language.Hebrew, 23 }, new object[] { Language.Lithuanian, 24 }, - new object[] { Language.Czech, 25 } + new object[] { Language.Czech, 25 }, + new object[] { Language.Hindi, 26 }, + new object[] { Language.Romanian, 27 }, + new object[] { Language.Thai, 28 }, + new object[] { Language.Bulgarian, 29 }, + new object[] { Language.PortugueseBR, 30 } }; [Test] diff --git a/src/NzbDrone.Core.Test/Localization/LocalizationServiceFixture.cs b/src/NzbDrone.Core.Test/Localization/LocalizationServiceFixture.cs index 9998bb8ee..3ea8d8056 100644 --- a/src/NzbDrone.Core.Test/Localization/LocalizationServiceFixture.cs +++ b/src/NzbDrone.Core.Test/Localization/LocalizationServiceFixture.cs @@ -29,6 +29,16 @@ public void should_get_string_in_dictionary_if_lang_exists_and_string_exists() localizedString.Should().Be("Backup Now"); } + [Test] + public void should_get_string_in_default_language_dictionary_if_no_lang_country_code_exists_and_string_exists() + { + var localizedString = Subject.GetLocalizedString("BackupNow", "de_de"); + + localizedString.Should().Be("Jetzt sichern"); + + ExceptionVerification.ExpectedErrors(1); + } + [Test] public void should_get_string_in_default_dictionary_if_no_lang_exists_and_string_exists() { @@ -36,7 +46,7 @@ public void should_get_string_in_default_dictionary_if_no_lang_exists_and_string localizedString.Should().Be("Backup Now"); - ExceptionVerification.ExpectedErrors(1); + ExceptionVerification.ExpectedErrors(2); } [Test] diff --git a/src/NzbDrone.Core.Test/ParserTests/IsoLanguagesFixture.cs b/src/NzbDrone.Core.Test/ParserTests/IsoLanguagesFixture.cs index 41b8bff4f..6d50e65b4 100644 --- a/src/NzbDrone.Core.Test/ParserTests/IsoLanguagesFixture.cs +++ b/src/NzbDrone.Core.Test/ParserTests/IsoLanguagesFixture.cs @@ -39,7 +39,7 @@ public void should_return_portuguese(string isoCode) result.Language.Should().Be(Language.Portuguese); } - [TestCase("pt-BR")] + [TestCase("de-AU")] public void should_not_return_portuguese(string isoCode) { var result = IsoLanguages.Find(isoCode); diff --git a/src/NzbDrone.Core.Test/ParserTests/LanguageParserFixture.cs b/src/NzbDrone.Core.Test/ParserTests/LanguageParserFixture.cs index f7a8dfe3d..eb744e341 100644 --- a/src/NzbDrone.Core.Test/ParserTests/LanguageParserFixture.cs +++ b/src/NzbDrone.Core.Test/ParserTests/LanguageParserFixture.cs @@ -148,6 +148,15 @@ public void should_parse_language_bulgarian(string postTitle) result.Languages.Should().BeEquivalentTo(Language.Bulgarian); } + [TestCase("Pulp.Fiction.1994.Dublado.1080p.XviD-LOL")] + [TestCase("Uma.Aventura.Lego.2.2019.1080p.Bluray.Dublado.WWW.TPF.GRATIS")] + public void should_parse_language_brazilian_portuguese(string postTitle) + { + var result = Parser.Parser.ParseMovieTitle(postTitle, true); + + result.Languages.Should().BeEquivalentTo(Language.PortugueseBR); + } + [TestCase("Pulp.Fiction.1994.Polish.1080p.XviD-LOL")] public void should_parse_language_polish(string postTitle) { diff --git a/src/NzbDrone.Core/Languages/Language.cs b/src/NzbDrone.Core/Languages/Language.cs index 87de7e019..735d5c62c 100644 --- a/src/NzbDrone.Core/Languages/Language.cs +++ b/src/NzbDrone.Core/Languages/Language.cs @@ -100,6 +100,7 @@ public override bool Equals(object obj) public static Language Romanian => new Language(27, "Romanian"); public static Language Thai => new Language(28, "Thai"); public static Language Bulgarian => new Language(29, "Bulgarian"); + public static Language PortugueseBR => new Language(30, "Portuguese (Brazil)"); public static Language Any => new Language(-1, "Any"); public static Language Original => new Language(-2, "Original"); @@ -139,6 +140,7 @@ public static List All Hindi, Thai, Bulgarian, + PortugueseBR, Any, Original }; diff --git a/src/NzbDrone.Core/Localization/LocalizationService.cs b/src/NzbDrone.Core/Localization/LocalizationService.cs index beba6aff9..712d98f65 100644 --- a/src/NzbDrone.Core/Localization/LocalizationService.cs +++ b/src/NzbDrone.Core/Localization/LocalizationService.cs @@ -45,14 +45,14 @@ public LocalizationService(IConfigService configService, public Dictionary GetLocalizationDictionary() { - var language = IsoLanguages.Get((Language)_configService.UILanguage).TwoLetterCode; + var language = GetSetLanguageFileName(); return GetLocalizationDictionary(language); } public string GetLocalizedString(string phrase) { - var language = IsoLanguages.Get((Language)_configService.UILanguage).TwoLetterCode; + var language = GetSetLanguageFileName(); return GetLocalizedString(phrase, language); } @@ -66,7 +66,7 @@ public string GetLocalizedString(string phrase, string language) if (language.IsNullOrWhiteSpace()) { - language = IsoLanguages.Get((Language)_configService.UILanguage).TwoLetterCode; + language = GetSetLanguageFileName(); } if (language == null) @@ -84,6 +84,19 @@ public string GetLocalizedString(string phrase, string language) return phrase; } + private string GetSetLanguageFileName() + { + var isoLanguage = IsoLanguages.Get((Language)_configService.UILanguage); + var language = isoLanguage.TwoLetterCode; + + if (isoLanguage.CountryCode.IsNotNullOrWhiteSpace()) + { + language = string.Format("{0}_{1}", language, isoLanguage.CountryCode); + } + + return language; + } + private Dictionary GetLocalizationDictionary(string language) { if (string.IsNullOrEmpty(language)) @@ -109,9 +122,11 @@ private async Task> GetDictionary(string prefix, stri var dictionary = new Dictionary(StringComparer.OrdinalIgnoreCase); var baseFilenamePath = Path.Combine(prefix, baseFilename); + var languageBaseFilenamePath = Path.Combine(prefix, GetResourceFilename(culture.Split('_')[0])); var alternativeFilenamePath = Path.Combine(prefix, GetResourceFilename(culture)); await CopyInto(dictionary, baseFilenamePath).ConfigureAwait(false); + await CopyInto(dictionary, languageBaseFilenamePath).ConfigureAwait(false); await CopyInto(dictionary, alternativeFilenamePath).ConfigureAwait(false); return dictionary; diff --git a/src/NzbDrone.Core/Parser/IsoLanguages.cs b/src/NzbDrone.Core/Parser/IsoLanguages.cs index ecd0d92b5..da55d2b4e 100644 --- a/src/NzbDrone.Core/Parser/IsoLanguages.cs +++ b/src/NzbDrone.Core/Parser/IsoLanguages.cs @@ -11,13 +11,13 @@ public static class IsoLanguages new IsoLanguage("en", "", "eng", "English", Language.English), new IsoLanguage("fr", "fr", "fra", "French", Language.French), new IsoLanguage("es", "", "spa", "Spanish", Language.Spanish), - new IsoLanguage("de", "", "deu", "German", Language.German), + new IsoLanguage("de", "de", "deu", "German", Language.German), new IsoLanguage("it", "", "ita", "Italian", Language.Italian), new IsoLanguage("da", "", "dan", "Danish", Language.Danish), new IsoLanguage("nl", "", "nld", "Dutch", Language.Dutch), new IsoLanguage("ja", "", "jpn", "Japanese", Language.Japanese), new IsoLanguage("is", "", "isl", "Icelandic", Language.Icelandic), - new IsoLanguage("zh", "", "zho", "Chinese", Language.Chinese), + new IsoLanguage("zh", "cn", "zho", "Chinese", Language.Chinese), new IsoLanguage("ru", "", "rus", "Russian", Language.Russian), new IsoLanguage("pl", "", "pol", "Polish", Language.Polish), new IsoLanguage("vi", "", "vie", "Vietnamese", Language.Vietnamese), @@ -35,7 +35,8 @@ public static class IsoLanguages new IsoLanguage("hi", "", "hin", "Hindi", Language.Hindi), new IsoLanguage("th", "", "tha", "Thai", Language.Thai), new IsoLanguage("bg", "", "bul", "Bulgarian", Language.Bulgarian), - new IsoLanguage("ro", "", "ron", "Romanian", Language.Romanian) + new IsoLanguage("ro", "", "ron", "Romanian", Language.Romanian), + new IsoLanguage("pt", "br", "", "Portuguese (Brazil)", Language.PortugueseBR) }; public static IsoLanguage Find(string isoCode) diff --git a/src/NzbDrone.Core/Parser/LanguageParser.cs b/src/NzbDrone.Core/Parser/LanguageParser.cs index 5620aba31..792ce8cf6 100644 --- a/src/NzbDrone.Core/Parser/LanguageParser.cs +++ b/src/NzbDrone.Core/Parser/LanguageParser.cs @@ -14,7 +14,7 @@ public static class LanguageParser { private static readonly Logger Logger = NzbDroneLogger.GetLogger(typeof(LanguageParser)); - private static readonly Regex LanguageRegex = new Regex(@"(?:\W|_|^)(?\b(?:ita|italian)\b)|(?\b(?:german|videomann|ger)\b)|(?flemish)|(?bgaudio)|(?greek)|(?(?:\W|_)(?:FR|VO|VFF|VFQ|VFI|VF2|TRUEFRENCH)(?:\W|_))|(?\brus\b)|(?\beng\b)|(?\b(?:HUNDUB|HUN)\b)|(?\bHebDub\b)|(?\[(?:CH[ST]|BIG5|GB)\]|简|繁|字幕)", + private static readonly Regex LanguageRegex = new Regex(@"(?:\W|_|^)(?\b(?:ita|italian)\b)|(?\b(?:german|videomann|ger)\b)|(?flemish)|(?bgaudio)|(?dublado)|(?greek)|(?(?:\W|_)(?:FR|VO|VFF|VFQ|VFI|VF2|TRUEFRENCH)(?:\W|_))|(?\brus\b)|(?\beng\b)|(?\b(?:HUNDUB|HUN)\b)|(?\bHebDub\b)|(?\[(?:CH[ST]|BIG5|GB)\]|简|繁|字幕)", RegexOptions.IgnoreCase | RegexOptions.Compiled); private static readonly Regex CaseSensitiveLanguageRegex = new Regex(@"(?\bLT\b)|(?\bCZ\b)", @@ -199,6 +199,11 @@ public static List ParseLanguages(string title) languages.Add(Language.Bulgarian); } + if (match.Groups["brazilian"].Success) + { + languages.Add(Language.PortugueseBR); + } + if (match.Groups["dutch"].Success) { languages.Add(Language.Dutch);