SubtitleEdit/libse/DvdSubtitleLanguage.cs

183 lines
8.2 KiB
C#
Raw Normal View History

2016-04-07 19:58:16 +02:00
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Globalization;
using System.Linq;
namespace Nikse.SubtitleEdit.Core
{
public class DvdSubtitleLanguage
{
private class LanguagesByCode : KeyedCollection<string, DvdSubtitleLanguage>
{
public LanguagesByCode(IEnumerable<DvdSubtitleLanguage> languages)
{
foreach (var language in languages)
{
Add(language);
}
}
public DvdSubtitleLanguage GetValueOrNull(string code)
{
2019-01-19 12:29:38 +01:00
Dictionary.TryGetValue(code, out var language);
2016-04-07 19:58:16 +02:00
return language;
}
protected override string GetKeyForItem(DvdSubtitleLanguage dsl)
{
return dsl.Code;
}
}
2019-01-19 12:29:38 +01:00
private static readonly Dictionary<string, string> IsoToDvd = new Dictionary<string, string>
2016-04-07 19:58:16 +02:00
{
{ "yi", "ji" }, { "jv", "jw" }, { "id", "in" }, { "he", "iw" } // { "bs", "sh" }, { "nb", "no" }, { "nn", "no" } ???
};
2019-01-19 12:29:38 +01:00
private static readonly Dictionary<string, string> DvdToIso = new Dictionary<string, string>
2016-04-07 19:58:16 +02:00
{
{ "ji", "yi" }, { "jw", "jv" }, { "in", "id" }, { "iw", "he" }
};
2019-01-19 12:29:38 +01:00
private static readonly string[] CompliantDescriptions = { // DVD code + native name
2016-04-07 19:58:16 +02:00
"aa:Qafár af", "ab:аҧсуа бызшәа", "af:Afrikaans", "am:አማርኛ", "ar:العربية", "as:অসমীয়া", "ay:Aymar aru", "az:azərbaycan dili", "ba:башҡорт теле", "be:беларуская",
"bg:български", "bh:भोजपुरी", "bi:Bislama", "bn:বাংলা", "bo:བོད་སྐད་", "br:brezhoneg", "ca:català", "co:corsu", "cs:čeština", "cy:Cymraeg", "da:dansk", "de:Deutsch", "dz:རྫོང་ཁ",
"el:Ελληνικά", "en:English", "eo:esperanto", "es:español", "et:eesti", "eu:euskara", "fa:فارسی", "fi:suomi", "fj:Vosa Vakaviti", "fo:føroyskt", "fr:français",
"fy:West-Frysk", "ga:Gaeilge", "gd:Gàidhlig", "gl:galego", "gn:Avañe'ẽ", "gu:ગુજરાતી", "ha:Hausa", "hi:हिन्दी", "hr:hrvatski", "hu:magyar", "hy:հայերեն", "ia:Interlingua",
"ie:Interlingue", "ik:iñupiaq", "in:Indonesia", "is:íslenska", "it:italiano", "iu:ᐃᓄᒃᑎᑐᑦ", "iw:עברית", "ja:日本語", "ji:ייִדיש", "jw:Basa Jawa", "ka:ქართული", "kk:қазақ тілі",
"kl:kalaallisut", "km:ខ្មែរ", "kn:ಕನ್ನಡ", "ko:한국어", "ks:کٲشُر", "ku:Kurdî", "ky:кыргызча", "la:lingua latina", "lb:Lëtzebuergesch", "ln:lingála", "lo:ລາວ", "lt:lietuvių",
"lv:latviešu", "mg:Malagasy", "mi:Te reo Māori", "mk:македонски", "ml:മലയാളം", "mn:монгол", "mo:moldovenească", "mr:मराठी", "ms:Bahasa Melayu", "mt:Malti", "my:ဗမာ (myanma)",
"na:Dorerin Naoero", "ne:नेपाली", "nl:Nederlands", "no:norsk", "oc:occitan", "om:Oromoo", "or:ଓଡ଼ିଆ", "pa:ਪੰਜਾਬੀ", "pl:polski", "ps:پښتو", "pt:português", "qu:Runasimi", "rm:rumantsch",
"rn:Ikirundi", "ro:română", "ru:русский", "rw:Kinyarwanda", "sa:ंस्कृतम्", "sd:सिन्धी‎", "sg:Sängö", "sh:Srpskohrvatski", "si:සිංහල", "sk:slovenčina", "sl:slovenščina", "sm:Gagana fa'a Samoa",
"sn:chiShona", "so:Soomaali", "sq:shqip", "sr:српски", "ss:SiSwati", "st:Sesotho", "su:Basa Sunda", "sv:svenska", "sw:Kiswahili", "ta:தமிழ்", "te:తెలుగు", "tg:тоҷикӣ", "th:ไทย", "ti:ትግርኛ",
"tk:türkmençe", "tl:Wikang Tagalog", "tn:Setswana", "to:lea fakatonga", "tr:Türkçe", "ts:Xitsonga", "tt:татар теле", "tw:Twi", "ug:ئۇيغۇرچە", "uk:українська", "ur:اردو", "uz:ozbek",
"vi:Tiếng Việt", "vo:Volapük", "wo:Wollof", "xh:IsiXhosa", "yo:Èdè Yorùbá", "za:Vahcuengh (話僮)", "zh:中文", "zu:isiZulu"
};
private static LanguagesByCode _compliantLanguagesByCode;
2019-01-19 12:29:38 +01:00
public string Code { get; }
public string LocalName { get; }
public string NativeName { get; }
2016-04-07 19:58:16 +02:00
2019-01-19 12:29:38 +01:00
public DvdSubtitleLanguage(string code, string localName, string nativeName)
2016-04-07 19:58:16 +02:00
{
Code = code;
LocalName = localName;
NativeName = nativeName;
}
private DvdSubtitleLanguage(string description)
{
NativeName = description.Substring(3);
var code = description.Remove(2);
Code = code;
var names = Configuration.Settings.Language.LanguageNames;
2019-01-19 12:29:38 +01:00
LocalName = (string)names.GetType().GetProperty(ConvertDvdToIso(code) + "Name")?.GetValue(names, null);
2016-04-07 19:58:16 +02:00
}
public override string ToString()
{
return LocalName;
}
2019-01-19 12:29:38 +01:00
public static DvdSubtitleLanguage English => CompliantLanguagesByCode["en"];
2016-04-07 19:58:16 +02:00
2019-01-19 12:29:38 +01:00
public static IEnumerable<DvdSubtitleLanguage> CompliantLanguages => CompliantLanguagesByCode;
2016-04-07 19:58:16 +02:00
private static LanguagesByCode CompliantLanguagesByCode
{
get
{
if (_compliantLanguagesByCode == null)
{
2019-01-19 12:29:38 +01:00
var cl = CompliantDescriptions.Select(s => new DvdSubtitleLanguage(s)).OrderBy(dsl => dsl.LocalName, StringComparer.CurrentCultureIgnoreCase).ThenBy(dsl => dsl.LocalName, StringComparer.Ordinal);
var ns = new[] { new DvdSubtitleLanguage(" ", Configuration.Settings.Language.LanguageNames.NotSpecified, "Not Specified") };
2016-04-07 19:58:16 +02:00
_compliantLanguagesByCode = new LanguagesByCode(ns.Concat(cl));
}
return _compliantLanguagesByCode;
}
}
public static void Initialize()
{
_compliantLanguagesByCode = null;
}
public static string GetLocalLanguageName(string code)
{
var language = GetLanguageOrNull(code);
return language == null ? GetNonCompliantLocalLanguageName(code) : language.LocalName;
}
public static string GetNativeLanguageName(string code)
{
var language = GetLanguageOrNull(code);
return language == null ? GetNonCompliantNativeLanguageName(code) : language.NativeName;
}
public static DvdSubtitleLanguage GetLanguageOrNull(string code)
{
2019-01-19 12:29:38 +01:00
code = ConvertIsoToDvd(code.ToLowerInvariant());
2016-04-07 19:58:16 +02:00
return CompliantLanguagesByCode.GetValueOrNull(code);
}
private static string GetNonCompliantLocalLanguageName(string code)
{
try
{
var codeCulture = CultureInfo.GetCultureInfo(code);
try
{
var seCulture = CultureInfo.GetCultureInfo(Configuration.Settings.Language.General.CultureName);
if (seCulture.Name == CultureInfo.CurrentUICulture.Name)
{
return codeCulture.DisplayName; // SE culture == UI culture
}
}
catch
{
2019-01-19 12:29:38 +01:00
// ignored
2016-04-07 19:58:16 +02:00
}
2019-01-19 12:29:38 +01:00
2016-04-07 19:58:16 +02:00
return codeCulture.EnglishName; // SE culture != UI culture
}
catch
{
return string.Format(Configuration.Settings.Language.LanguageNames.UnknownCodeX, code);
}
}
private static string GetNonCompliantNativeLanguageName(string code)
{
try
{
return CultureInfo.GetCultureInfo(code).NativeName;
}
catch
{
return "Unknown (" + code + ")";
}
}
2019-01-19 12:29:38 +01:00
private static string ConvertDvdToIso(string dvdCode)
2016-04-07 19:58:16 +02:00
{
2019-01-19 12:29:38 +01:00
if (!DvdToIso.TryGetValue(dvdCode, out var isoCode))
2019-01-19 14:40:37 +01:00
{
2016-04-07 19:58:16 +02:00
isoCode = dvdCode;
2019-01-19 14:40:37 +01:00
}
2016-04-07 19:58:16 +02:00
return isoCode;
}
2019-01-19 12:29:38 +01:00
private static string ConvertIsoToDvd(string isoCode)
2016-04-07 19:58:16 +02:00
{
2019-01-19 12:29:38 +01:00
if (!IsoToDvd.TryGetValue(isoCode, out var dvdCode))
2019-01-19 14:40:37 +01:00
{
2016-04-07 19:58:16 +02:00
dvdCode = isoCode;
2019-01-19 14:40:37 +01:00
}
2016-04-07 19:58:16 +02:00
return dvdCode;
}
}
}