1
0
mirror of https://github.com/Radarr/Radarr.git synced 2024-10-27 06:02:33 +01:00

New: Portuguese (Brazil) Language Support

This commit is contained in:
Qstick 2020-11-18 00:35:18 -05:00
parent a71874db8d
commit 3ab9af0663
8 changed files with 63 additions and 11 deletions

View File

@ -34,7 +34,12 @@ public class LanguageFixture : CoreTest
new object[] { 22, Language.Hungarian }, new object[] { 22, Language.Hungarian },
new object[] { 23, Language.Hebrew }, new object[] { 23, Language.Hebrew },
new object[] { 24, Language.Lithuanian }, 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 = public static object[] ToIntCases =
@ -63,7 +68,12 @@ public class LanguageFixture : CoreTest
new object[] { Language.Hungarian, 22 }, new object[] { Language.Hungarian, 22 },
new object[] { Language.Hebrew, 23 }, new object[] { Language.Hebrew, 23 },
new object[] { Language.Lithuanian, 24 }, 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] [Test]

View File

@ -29,6 +29,16 @@ public void should_get_string_in_dictionary_if_lang_exists_and_string_exists()
localizedString.Should().Be("Backup Now"); 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] [Test]
public void should_get_string_in_default_dictionary_if_no_lang_exists_and_string_exists() 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"); localizedString.Should().Be("Backup Now");
ExceptionVerification.ExpectedErrors(1); ExceptionVerification.ExpectedErrors(2);
} }
[Test] [Test]

View File

@ -39,7 +39,7 @@ public void should_return_portuguese(string isoCode)
result.Language.Should().Be(Language.Portuguese); result.Language.Should().Be(Language.Portuguese);
} }
[TestCase("pt-BR")] [TestCase("de-AU")]
public void should_not_return_portuguese(string isoCode) public void should_not_return_portuguese(string isoCode)
{ {
var result = IsoLanguages.Find(isoCode); var result = IsoLanguages.Find(isoCode);

View File

@ -148,6 +148,15 @@ public void should_parse_language_bulgarian(string postTitle)
result.Languages.Should().BeEquivalentTo(Language.Bulgarian); 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")] [TestCase("Pulp.Fiction.1994.Polish.1080p.XviD-LOL")]
public void should_parse_language_polish(string postTitle) public void should_parse_language_polish(string postTitle)
{ {

View File

@ -100,6 +100,7 @@ public override bool Equals(object obj)
public static Language Romanian => new Language(27, "Romanian"); public static Language Romanian => new Language(27, "Romanian");
public static Language Thai => new Language(28, "Thai"); public static Language Thai => new Language(28, "Thai");
public static Language Bulgarian => new Language(29, "Bulgarian"); 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 Any => new Language(-1, "Any");
public static Language Original => new Language(-2, "Original"); public static Language Original => new Language(-2, "Original");
@ -139,6 +140,7 @@ public static List<Language> All
Hindi, Hindi,
Thai, Thai,
Bulgarian, Bulgarian,
PortugueseBR,
Any, Any,
Original Original
}; };

View File

@ -45,14 +45,14 @@ public LocalizationService(IConfigService configService,
public Dictionary<string, string> GetLocalizationDictionary() public Dictionary<string, string> GetLocalizationDictionary()
{ {
var language = IsoLanguages.Get((Language)_configService.UILanguage).TwoLetterCode; var language = GetSetLanguageFileName();
return GetLocalizationDictionary(language); return GetLocalizationDictionary(language);
} }
public string GetLocalizedString(string phrase) public string GetLocalizedString(string phrase)
{ {
var language = IsoLanguages.Get((Language)_configService.UILanguage).TwoLetterCode; var language = GetSetLanguageFileName();
return GetLocalizedString(phrase, language); return GetLocalizedString(phrase, language);
} }
@ -66,7 +66,7 @@ public string GetLocalizedString(string phrase, string language)
if (language.IsNullOrWhiteSpace()) if (language.IsNullOrWhiteSpace())
{ {
language = IsoLanguages.Get((Language)_configService.UILanguage).TwoLetterCode; language = GetSetLanguageFileName();
} }
if (language == null) if (language == null)
@ -84,6 +84,19 @@ public string GetLocalizedString(string phrase, string language)
return phrase; 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<string, string> GetLocalizationDictionary(string language) private Dictionary<string, string> GetLocalizationDictionary(string language)
{ {
if (string.IsNullOrEmpty(language)) if (string.IsNullOrEmpty(language))
@ -109,9 +122,11 @@ private async Task<Dictionary<string, string>> GetDictionary(string prefix, stri
var dictionary = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); var dictionary = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
var baseFilenamePath = Path.Combine(prefix, baseFilename); var baseFilenamePath = Path.Combine(prefix, baseFilename);
var languageBaseFilenamePath = Path.Combine(prefix, GetResourceFilename(culture.Split('_')[0]));
var alternativeFilenamePath = Path.Combine(prefix, GetResourceFilename(culture)); var alternativeFilenamePath = Path.Combine(prefix, GetResourceFilename(culture));
await CopyInto(dictionary, baseFilenamePath).ConfigureAwait(false); await CopyInto(dictionary, baseFilenamePath).ConfigureAwait(false);
await CopyInto(dictionary, languageBaseFilenamePath).ConfigureAwait(false);
await CopyInto(dictionary, alternativeFilenamePath).ConfigureAwait(false); await CopyInto(dictionary, alternativeFilenamePath).ConfigureAwait(false);
return dictionary; return dictionary;

View File

@ -11,13 +11,13 @@ public static class IsoLanguages
new IsoLanguage("en", "", "eng", "English", Language.English), new IsoLanguage("en", "", "eng", "English", Language.English),
new IsoLanguage("fr", "fr", "fra", "French", Language.French), new IsoLanguage("fr", "fr", "fra", "French", Language.French),
new IsoLanguage("es", "", "spa", "Spanish", Language.Spanish), 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("it", "", "ita", "Italian", Language.Italian),
new IsoLanguage("da", "", "dan", "Danish", Language.Danish), new IsoLanguage("da", "", "dan", "Danish", Language.Danish),
new IsoLanguage("nl", "", "nld", "Dutch", Language.Dutch), new IsoLanguage("nl", "", "nld", "Dutch", Language.Dutch),
new IsoLanguage("ja", "", "jpn", "Japanese", Language.Japanese), new IsoLanguage("ja", "", "jpn", "Japanese", Language.Japanese),
new IsoLanguage("is", "", "isl", "Icelandic", Language.Icelandic), 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("ru", "", "rus", "Russian", Language.Russian),
new IsoLanguage("pl", "", "pol", "Polish", Language.Polish), new IsoLanguage("pl", "", "pol", "Polish", Language.Polish),
new IsoLanguage("vi", "", "vie", "Vietnamese", Language.Vietnamese), new IsoLanguage("vi", "", "vie", "Vietnamese", Language.Vietnamese),
@ -35,7 +35,8 @@ public static class IsoLanguages
new IsoLanguage("hi", "", "hin", "Hindi", Language.Hindi), new IsoLanguage("hi", "", "hin", "Hindi", Language.Hindi),
new IsoLanguage("th", "", "tha", "Thai", Language.Thai), new IsoLanguage("th", "", "tha", "Thai", Language.Thai),
new IsoLanguage("bg", "", "bul", "Bulgarian", Language.Bulgarian), 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) public static IsoLanguage Find(string isoCode)

View File

@ -14,7 +14,7 @@ public static class LanguageParser
{ {
private static readonly Logger Logger = NzbDroneLogger.GetLogger(typeof(LanguageParser)); private static readonly Logger Logger = NzbDroneLogger.GetLogger(typeof(LanguageParser));
private static readonly Regex LanguageRegex = new Regex(@"(?:\W|_|^)(?<italian>\b(?:ita|italian)\b)|(?<german>\b(?:german|videomann|ger)\b)|(?<flemish>flemish)|(?<bulgarian>bgaudio)|(?<greek>greek)|(?<french>(?:\W|_)(?:FR|VO|VFF|VFQ|VFI|VF2|TRUEFRENCH)(?:\W|_))|(?<russian>\brus\b)|(?<english>\beng\b)|(?<hungarian>\b(?:HUNDUB|HUN)\b)|(?<hebrew>\bHebDub\b)|(?<chinese>\[(?:CH[ST]|BIG5|GB)\]|简|繁|字幕)", private static readonly Regex LanguageRegex = new Regex(@"(?:\W|_|^)(?<italian>\b(?:ita|italian)\b)|(?<german>\b(?:german|videomann|ger)\b)|(?<flemish>flemish)|(?<bulgarian>bgaudio)|(?<brazilian>dublado)|(?<greek>greek)|(?<french>(?:\W|_)(?:FR|VO|VFF|VFQ|VFI|VF2|TRUEFRENCH)(?:\W|_))|(?<russian>\brus\b)|(?<english>\beng\b)|(?<hungarian>\b(?:HUNDUB|HUN)\b)|(?<hebrew>\bHebDub\b)|(?<chinese>\[(?:CH[ST]|BIG5|GB)\]|简|繁|字幕)",
RegexOptions.IgnoreCase | RegexOptions.Compiled); RegexOptions.IgnoreCase | RegexOptions.Compiled);
private static readonly Regex CaseSensitiveLanguageRegex = new Regex(@"(?<lithuanian>\bLT\b)|(?<czech>\bCZ\b)", private static readonly Regex CaseSensitiveLanguageRegex = new Regex(@"(?<lithuanian>\bLT\b)|(?<czech>\bCZ\b)",
@ -199,6 +199,11 @@ public static List<Language> ParseLanguages(string title)
languages.Add(Language.Bulgarian); languages.Add(Language.Bulgarian);
} }
if (match.Groups["brazilian"].Success)
{
languages.Add(Language.PortugueseBR);
}
if (match.Groups["dutch"].Success) if (match.Groups["dutch"].Success)
{ {
languages.Add(Language.Dutch); languages.Add(Language.Dutch);