mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-08-05 21:57:04 +02:00
Merge pull request #14410 from dyphire/language
Further refinement of BCP 47 language labeling support
This commit is contained in:
commit
1262ac31dc
@ -97,14 +97,18 @@ namespace Emby.Naming.ExternalFiles
|
|||||||
|
|
||||||
if (culture is not null && pathInfo.Language is null)
|
if (culture is not null && pathInfo.Language is null)
|
||||||
{
|
{
|
||||||
pathInfo.Language = culture.ThreeLetterISOLanguageName;
|
pathInfo.Language = culture.Name.Contains('-', StringComparison.OrdinalIgnoreCase)
|
||||||
|
? culture.Name
|
||||||
|
: culture.ThreeLetterISOLanguageName;
|
||||||
extraString = extraString.Replace(currentSlice, string.Empty, StringComparison.OrdinalIgnoreCase);
|
extraString = extraString.Replace(currentSlice, string.Empty, StringComparison.OrdinalIgnoreCase);
|
||||||
}
|
}
|
||||||
else if (culture is not null && pathInfo.Language == "hin")
|
else if (culture is not null && pathInfo.Language == "hin")
|
||||||
{
|
{
|
||||||
// Hindi language code "hi" collides with a hearing impaired flag - use as Hindi only if no other language is set
|
// Hindi language code "hi" collides with a hearing impaired flag - use as Hindi only if no other language is set
|
||||||
pathInfo.IsHearingImpaired = true;
|
pathInfo.IsHearingImpaired = true;
|
||||||
pathInfo.Language = culture.ThreeLetterISOLanguageName;
|
pathInfo.Language = culture.Name.Contains('-', StringComparison.OrdinalIgnoreCase)
|
||||||
|
? culture.Name
|
||||||
|
: culture.ThreeLetterISOLanguageName;
|
||||||
extraString = extraString.Replace(currentSlice, string.Empty, StringComparison.OrdinalIgnoreCase);
|
extraString = extraString.Replace(currentSlice, string.Empty, StringComparison.OrdinalIgnoreCase);
|
||||||
}
|
}
|
||||||
else if (_namingOptions.MediaHearingImpairedFlags.Any(s => currentSliceWithoutSeparator.Equals(s, StringComparison.OrdinalIgnoreCase)))
|
else if (_namingOptions.MediaHearingImpairedFlags.Any(s => currentSliceWithoutSeparator.Equals(s, StringComparison.OrdinalIgnoreCase)))
|
||||||
|
@ -379,7 +379,7 @@ namespace Emby.Server.Implementations.Library
|
|||||||
var culture = _localizationManager.FindLanguageInfo(language);
|
var culture = _localizationManager.FindLanguageInfo(language);
|
||||||
if (culture is not null)
|
if (culture is not null)
|
||||||
{
|
{
|
||||||
return culture.ThreeLetterISOLanguageNames;
|
return culture.Name.Contains('-', StringComparison.OrdinalIgnoreCase) ? [culture.Name] : culture.ThreeLetterISOLanguageNames;
|
||||||
}
|
}
|
||||||
|
|
||||||
return [language];
|
return [language];
|
||||||
|
@ -128,7 +128,8 @@ namespace Emby.Server.Implementations.Localization
|
|||||||
}
|
}
|
||||||
|
|
||||||
string name = parts[3];
|
string name = parts[3];
|
||||||
if (string.IsNullOrWhiteSpace(name))
|
string displayname = parts[3];
|
||||||
|
if (string.IsNullOrWhiteSpace(displayname))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -138,6 +139,10 @@ namespace Emby.Server.Implementations.Localization
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
else if (twoCharName.Contains('-', StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
name = twoCharName;
|
||||||
|
}
|
||||||
|
|
||||||
string[] threeLetterNames;
|
string[] threeLetterNames;
|
||||||
if (string.IsNullOrWhiteSpace(parts[1]))
|
if (string.IsNullOrWhiteSpace(parts[1]))
|
||||||
@ -153,7 +158,7 @@ namespace Emby.Server.Implementations.Localization
|
|||||||
iso6392BtoTdict.TryAdd(parts[1], parts[0]);
|
iso6392BtoTdict.TryAdd(parts[1], parts[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
list.Add(new CultureDto(name, name, twoCharName, threeLetterNames));
|
list.Add(new CultureDto(name, displayname, twoCharName, threeLetterNames));
|
||||||
}
|
}
|
||||||
|
|
||||||
_cultures = list;
|
_cultures = list;
|
||||||
|
@ -311,8 +311,8 @@ nia|||Nias|nias
|
|||||||
nic|||Niger-Kordofanian languages|nigéro-kordofaniennes, langues
|
nic|||Niger-Kordofanian languages|nigéro-kordofaniennes, langues
|
||||||
niu|||Niuean|niué
|
niu|||Niuean|niué
|
||||||
nld|dut|nl|Dutch; Flemish|néerlandais; flamand
|
nld|dut|nl|Dutch; Flemish|néerlandais; flamand
|
||||||
nno||nn|Norwegian Nynorsk; Nynorsk, Norwegian|norvégien nynorsk; nynorsk, norvégien
|
nno||nn|Norwegian (Nynorsk)|norvégien (nynorsk)
|
||||||
nob||nb|Bokmål, Norwegian; Norwegian Bokmål|norvégien bokmål
|
nob||nb|Norwegian (Bokmal)|norvégien (bokmål)
|
||||||
nog|||Nogai|nogaï; nogay
|
nog|||Nogai|nogaï; nogay
|
||||||
non|||Norse, Old|norrois, vieux
|
non|||Norse, Old|norrois, vieux
|
||||||
nor||no|Norwegian|norvégien
|
nor||no|Norwegian|norvégien
|
||||||
@ -391,10 +391,10 @@ slv||sl|Slovenian|slovène
|
|||||||
sma|||Southern Sami|sami du Sud
|
sma|||Southern Sami|sami du Sud
|
||||||
sme||se|Northern Sami|sami du Nord
|
sme||se|Northern Sami|sami du Nord
|
||||||
smi|||Sami languages|sames, langues
|
smi|||Sami languages|sames, langues
|
||||||
smj|||Lule Sami|sami de Lule
|
smj|||Sami (Lule)|sami de Lule
|
||||||
smn|||Inari Sami|sami d'Inari
|
smn|||Sami (Inari)|sami d'Inari
|
||||||
smo||sm|Samoan|samoan
|
smo||sm|Samoan|samoan
|
||||||
sms|||Skolt Sami|sami skolt
|
sms|||Sami (Skolt)|sami skolt
|
||||||
sna||sn|Shona|shona
|
sna||sn|Shona|shona
|
||||||
snd||sd|Sindhi|sindhi
|
snd||sd|Sindhi|sindhi
|
||||||
snk|||Soninke|soninké
|
snk|||Soninke|soninké
|
||||||
@ -483,9 +483,12 @@ zen|||Zenaga|zenaga
|
|||||||
zgh|||Standard Moroccan Tamazight|amazighe standard marocain
|
zgh|||Standard Moroccan Tamazight|amazighe standard marocain
|
||||||
zha||za|Zhuang; Chuang|zhuang; chuang
|
zha||za|Zhuang; Chuang|zhuang; chuang
|
||||||
zho|chi|zh|Chinese|chinois
|
zho|chi|zh|Chinese|chinois
|
||||||
zho|chi|ze|Chinese; Bilingual|chinois
|
zho|chi|ze|Chinese (Bilingual)|chinois
|
||||||
zho|chi|zh-tw|Chinese; Traditional|chinois
|
zho|chi|zh-cn|Chinese (Simplified)|chinois
|
||||||
zho|chi|zh-hk|Chinese; Hong Kong|chinois
|
zho|chi|zh-hans|Chinese (Simplified)|chinois
|
||||||
|
zho|chi|zh-tw|Chinese (Traditional)|chinois
|
||||||
|
zho|chi|zh-hant|Chinese (Traditional)|chinois
|
||||||
|
zho|chi|zh-hk|Chinese (Hong Kong)|chinois
|
||||||
znd|||Zande languages|zandé, langues
|
znd|||Zande languages|zandé, langues
|
||||||
zul||zu|Zulu|zoulou
|
zul||zu|Zulu|zoulou
|
||||||
zun|||Zuni|zuni
|
zun|||Zuni|zuni
|
||||||
|
@ -158,7 +158,10 @@ public class ItemUpdateController : BaseJellyfinApiController
|
|||||||
ParentalRatingOptions = _localizationManager.GetParentalRatings().ToList(),
|
ParentalRatingOptions = _localizationManager.GetParentalRatings().ToList(),
|
||||||
ExternalIdInfos = _providerManager.GetExternalIdInfos(item).ToArray(),
|
ExternalIdInfos = _providerManager.GetExternalIdInfos(item).ToArray(),
|
||||||
Countries = _localizationManager.GetCountries().ToArray(),
|
Countries = _localizationManager.GetCountries().ToArray(),
|
||||||
Cultures = _localizationManager.GetCultures().ToArray()
|
Cultures = _localizationManager.GetCultures()
|
||||||
|
.DistinctBy(c => c.DisplayName, StringComparer.OrdinalIgnoreCase)
|
||||||
|
.OrderBy(c => c.DisplayName)
|
||||||
|
.ToArray()
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!item.IsVirtualItem
|
if (!item.IsVirtualItem
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using MediaBrowser.Common.Api;
|
using MediaBrowser.Common.Api;
|
||||||
using MediaBrowser.Model.Entities;
|
using MediaBrowser.Model.Entities;
|
||||||
using MediaBrowser.Model.Globalization;
|
using MediaBrowser.Model.Globalization;
|
||||||
@ -34,7 +36,14 @@ public class LocalizationController : BaseJellyfinApiController
|
|||||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||||
public ActionResult<IEnumerable<CultureDto>> GetCultures()
|
public ActionResult<IEnumerable<CultureDto>> GetCultures()
|
||||||
{
|
{
|
||||||
return Ok(_localization.GetCultures());
|
var allCultures = _localization.GetCultures();
|
||||||
|
|
||||||
|
var distinctCultures = allCultures
|
||||||
|
.DistinctBy(c => c.DisplayName, StringComparer.OrdinalIgnoreCase)
|
||||||
|
.OrderBy(c => c.DisplayName)
|
||||||
|
.AsEnumerable();
|
||||||
|
|
||||||
|
return Ok(distinctCultures);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -273,11 +273,28 @@ namespace MediaBrowser.Model.Entities
|
|||||||
// Do not display the language code in display titles if unset or set to a special code. Show it in all other cases (possibly expanded).
|
// Do not display the language code in display titles if unset or set to a special code. Show it in all other cases (possibly expanded).
|
||||||
if (!string.IsNullOrEmpty(Language) && !_specialCodes.Contains(Language, StringComparison.OrdinalIgnoreCase))
|
if (!string.IsNullOrEmpty(Language) && !_specialCodes.Contains(Language, StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
// Get full language string i.e. eng -> English.
|
// Get full language string i.e. eng -> English, zh-Hans -> Chinese (Simplified).
|
||||||
string fullLanguage = CultureInfo
|
var cultures = CultureInfo.GetCultures(CultureTypes.NeutralCultures);
|
||||||
.GetCultures(CultureTypes.NeutralCultures)
|
CultureInfo match = null;
|
||||||
.FirstOrDefault(r => r.ThreeLetterISOLanguageName.Equals(Language, StringComparison.OrdinalIgnoreCase))
|
if (Language.Contains('-', StringComparison.OrdinalIgnoreCase))
|
||||||
?.DisplayName;
|
{
|
||||||
|
match = cultures.FirstOrDefault(r =>
|
||||||
|
r.Name.Equals(Language, StringComparison.OrdinalIgnoreCase));
|
||||||
|
|
||||||
|
if (match is null)
|
||||||
|
{
|
||||||
|
string baseLang = Language.AsSpan().LeftPart('-').ToString();
|
||||||
|
match = cultures.FirstOrDefault(r =>
|
||||||
|
r.TwoLetterISOLanguageName.Equals(baseLang, StringComparison.OrdinalIgnoreCase));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
match = cultures.FirstOrDefault(r =>
|
||||||
|
r.ThreeLetterISOLanguageName.Equals(Language, StringComparison.OrdinalIgnoreCase));
|
||||||
|
}
|
||||||
|
|
||||||
|
string fullLanguage = match?.DisplayName;
|
||||||
attributes.Add(StringHelper.FirstToUpper(fullLanguage ?? Language));
|
attributes.Add(StringHelper.FirstToUpper(fullLanguage ?? Language));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -376,11 +393,28 @@ namespace MediaBrowser.Model.Entities
|
|||||||
|
|
||||||
if (!string.IsNullOrEmpty(Language))
|
if (!string.IsNullOrEmpty(Language))
|
||||||
{
|
{
|
||||||
// Get full language string i.e. eng -> English.
|
// Get full language string i.e. eng -> English, zh-Hans -> Chinese (Simplified).
|
||||||
string fullLanguage = CultureInfo
|
var cultures = CultureInfo.GetCultures(CultureTypes.NeutralCultures);
|
||||||
.GetCultures(CultureTypes.NeutralCultures)
|
CultureInfo match = null;
|
||||||
.FirstOrDefault(r => r.ThreeLetterISOLanguageName.Equals(Language, StringComparison.OrdinalIgnoreCase))
|
if (Language.Contains('-', StringComparison.OrdinalIgnoreCase))
|
||||||
?.DisplayName;
|
{
|
||||||
|
match = cultures.FirstOrDefault(r =>
|
||||||
|
r.Name.Equals(Language, StringComparison.OrdinalIgnoreCase));
|
||||||
|
|
||||||
|
if (match is null)
|
||||||
|
{
|
||||||
|
string baseLang = Language.AsSpan().LeftPart('-').ToString();
|
||||||
|
match = cultures.FirstOrDefault(r =>
|
||||||
|
r.TwoLetterISOLanguageName.Equals(baseLang, StringComparison.OrdinalIgnoreCase));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
match = cultures.FirstOrDefault(r =>
|
||||||
|
r.ThreeLetterISOLanguageName.Equals(Language, StringComparison.OrdinalIgnoreCase));
|
||||||
|
}
|
||||||
|
|
||||||
|
string fullLanguage = match?.DisplayName;
|
||||||
attributes.Add(StringHelper.FirstToUpper(fullLanguage ?? Language));
|
attributes.Add(StringHelper.FirstToUpper(fullLanguage ?? Language));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -41,7 +41,7 @@ namespace Jellyfin.Server.Implementations.Tests.Localization
|
|||||||
await localizationManager.LoadAll();
|
await localizationManager.LoadAll();
|
||||||
var cultures = localizationManager.GetCultures().ToList();
|
var cultures = localizationManager.GetCultures().ToList();
|
||||||
|
|
||||||
Assert.Equal(191, cultures.Count);
|
Assert.Equal(194, cultures.Count);
|
||||||
|
|
||||||
var germany = cultures.FirstOrDefault(x => x.TwoLetterISOLanguageName.Equals("de", StringComparison.Ordinal));
|
var germany = cultures.FirstOrDefault(x => x.TwoLetterISOLanguageName.Equals("de", StringComparison.Ordinal));
|
||||||
Assert.NotNull(germany);
|
Assert.NotNull(germany);
|
||||||
|
Loading…
Reference in New Issue
Block a user