Browse Source

prepare channels list for localization (#2814)

* prepare channels list for localization

* define supported ui cultures/languages in a single location

* fixes
pull/2816/head
Jason Dove 6 months ago committed by GitHub
parent
commit
a77a2d56ae
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      CHANGELOG.md
  2. 18
      ErsatzTV/ErsatzTV.csproj
  3. 17
      ErsatzTV/Localization.cs
  4. 180
      ErsatzTV/Locals/Pages/Channels.Designer.cs
  5. 14
      ErsatzTV/Locals/Pages/Channels.pl.resx
  6. 14
      ErsatzTV/Locals/Pages/Channels.pt-br.resx
  7. 87
      ErsatzTV/Locals/Pages/Channels.resx
  8. 54
      ErsatzTV/Locals/Shared/Common.Designer.cs
  9. 14
      ErsatzTV/Locals/Shared/Common.pl.resx
  10. 14
      ErsatzTV/Locals/Shared/Common.pt-br.resx
  11. 24
      ErsatzTV/Locals/Shared/Common.resx
  12. 61
      ErsatzTV/Pages/Channels.razor
  13. 7
      ErsatzTV/Pages/Settings/UISettings.razor
  14. 1
      ErsatzTV/Shared/MainLayout.razor
  15. 5
      ErsatzTV/Startup.cs
  16. 1
      ErsatzTV/_Imports.razor

2
CHANGELOG.md

@ -8,7 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). @@ -8,7 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Add log warnings when actual transcoding speed is potentially insufficient to support smooth playback
- Log messages will include media item id, channel number and transcoding speed
- Add UI language setting to **Settings** > **UI**
- A small number of menu translations have been added for `Português (Brasil)`
- A small number of translations have been added for `Português (Brasil)` and `Polski`
- Translation contributions are always welcome!
### Changed

18
ErsatzTV/ErsatzTV.csproj

@ -111,6 +111,14 @@ @@ -111,6 +111,14 @@
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>MainLayout.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Update="Locals\Pages\Channels.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Channels.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Update="Locals\Shared\Common.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Common.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
@ -138,6 +146,16 @@ @@ -138,6 +146,16 @@
<AutoGen>True</AutoGen>
<DependentUpon>MainLayout.resx</DependentUpon>
</Compile>
<Compile Update="Locals\Pages\Channels.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Channels.resx</DependentUpon>
</Compile>
<Compile Update="Locals\Shared\Common.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Common.resx</DependentUpon>
</Compile>
</ItemGroup>
<ProjectExtensions>

17
ErsatzTV/Localization.cs

@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
namespace ErsatzTV;
public static class Localization
{
public static readonly List<CultureLanguage> SupportedLanguages =
[
new("en-us", "English"),
new("pl", "Polski"),
new("pt-br", "Português (Brasil)")
];
public static string DefaultCulture => "en-us";
public static string[] UiCultures => SupportedLanguages.Map(cl => cl.Culture).ToArray();
public sealed record CultureLanguage(string Culture, string Language);
}

180
ErsatzTV/Locals/Pages/Channels.Designer.cs generated

@ -0,0 +1,180 @@ @@ -0,0 +1,180 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ErsatzTV.Locals.Pages {
using System;
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Channels {
private static System.Resources.ResourceManager resourceMan;
private static System.Globalization.CultureInfo resourceCulture;
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Channels() {
}
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
internal static System.Resources.ResourceManager ResourceManager {
get {
if (object.Equals(null, resourceMan)) {
System.Resources.ResourceManager temp = new System.Resources.ResourceManager("ErsatzTV.Locals.Pages.Channels", typeof(Channels).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
internal static System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
internal static string ButtonAddChannel {
get {
return ResourceManager.GetString("ButtonAddChannel", resourceCulture);
}
}
internal static string ButtonEditChannelNumbers {
get {
return ResourceManager.GetString("ButtonEditChannelNumbers", resourceCulture);
}
}
internal static string LabelChannels {
get {
return ResourceManager.GetString("LabelChannels", resourceCulture);
}
}
internal static string ButtonShowDisabled {
get {
return ResourceManager.GetString("ButtonShowDisabled", resourceCulture);
}
}
internal static string LabelNumber {
get {
return ResourceManager.GetString("LabelNumber", resourceCulture);
}
}
internal static string LabelLogo {
get {
return ResourceManager.GetString("LabelLogo", resourceCulture);
}
}
internal static string LabelName {
get {
return ResourceManager.GetString("LabelName", resourceCulture);
}
}
internal static string LabelLanguage {
get {
return ResourceManager.GetString("LabelLanguage", resourceCulture);
}
}
internal static string LabelStreamingMode {
get {
return ResourceManager.GetString("LabelStreamingMode", resourceCulture);
}
}
internal static string LabelFFmpegProfile {
get {
return ResourceManager.GetString("LabelFFmpegProfile", resourceCulture);
}
}
internal static string LabelChannelDisabledHelp {
get {
return ResourceManager.GetString("LabelChannelDisabledHelp", resourceCulture);
}
}
internal static string LabelChannelHiddenHelp {
get {
return ResourceManager.GetString("LabelChannelHiddenHelp", resourceCulture);
}
}
internal static string LabelChannelHiddenAbbreviation {
get {
return ResourceManager.GetString("LabelChannelHiddenAbbreviation", resourceCulture);
}
}
internal static string LabelChannelDisabledAbbreviation {
get {
return ResourceManager.GetString("LabelChannelDisabledAbbreviation", resourceCulture);
}
}
internal static string ButtonPreviewChannelHelp {
get {
return ResourceManager.GetString("ButtonPreviewChannelHelp", resourceCulture);
}
}
internal static string ButtonPreviewChannelHelpNormalize {
get {
return ResourceManager.GetString("ButtonPreviewChannelHelpNormalize", resourceCulture);
}
}
internal static string ButtonPreviewChannelHelpBrowser {
get {
return ResourceManager.GetString("ButtonPreviewChannelHelpBrowser", resourceCulture);
}
}
internal static string ButtonPreviewChannelHelpSettings {
get {
return ResourceManager.GetString("ButtonPreviewChannelHelpSettings", resourceCulture);
}
}
internal static string ButtonStopTranscodeHelp {
get {
return ResourceManager.GetString("ButtonStopTranscodeHelp", resourceCulture);
}
}
internal static string ButtonEditChannelHelp {
get {
return ResourceManager.GetString("ButtonEditChannelHelp", resourceCulture);
}
}
internal static string ButtonTroubleshootChannelHelp {
get {
return ResourceManager.GetString("ButtonTroubleshootChannelHelp", resourceCulture);
}
}
internal static string ButtonDeleteChannelHelp {
get {
return ResourceManager.GetString("ButtonDeleteChannelHelp", resourceCulture);
}
}
}
}

14
ErsatzTV/Locals/Pages/Channels.pl.resx

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
<root>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

14
ErsatzTV/Locals/Pages/Channels.pt-br.resx

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
<root>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

87
ErsatzTV/Locals/Pages/Channels.resx

@ -0,0 +1,87 @@ @@ -0,0 +1,87 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ButtonAddChannel" xml:space="preserve">
<value>Add Channel</value>
</data>
<data name="ButtonEditChannelNumbers" xml:space="preserve">
<value>Edit Channel Numbers</value>
</data>
<data name="LabelChannels" xml:space="preserve">
<value>Channels</value>
</data>
<data name="ButtonShowDisabled" xml:space="preserve">
<value>Show Disabled</value>
</data>
<data name="LabelNumber" xml:space="preserve">
<value>Number</value>
</data>
<data name="LabelLogo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="LabelName" xml:space="preserve">
<value>Name</value>
</data>
<data name="LabelLanguage" xml:space="preserve">
<value>Language</value>
</data>
<data name="LabelStreamingMode" xml:space="preserve">
<value>Mode</value>
</data>
<data name="LabelFFmpegProfile" xml:space="preserve">
<value>FFmpeg Profile</value>
</data>
<data name="LabelChannelDisabledHelp" xml:space="preserve">
<value>Channel is disabled</value>
</data>
<data name="LabelChannelHiddenHelp" xml:space="preserve">
<value>Channel is hidden from EPG</value>
</data>
<data name="LabelChannelHiddenAbbreviation" xml:space="preserve">
<value>H</value>
</data>
<data name="LabelChannelDisabledAbbreviation" xml:space="preserve">
<value>D</value>
</data>
<data name="ButtonPreviewChannelHelp" xml:space="preserve">
<value>Preview Channel</value>
</data>
<data name="ButtonPreviewChannelHelpNormalize" xml:space="preserve">
<value>Preview Channel; audio and/or video may not work without normalization</value>
</data>
<data name="ButtonPreviewChannelHelpBrowser" xml:space="preserve">
<value>Channel preview requires FFmpeg Profile compatible with this browser</value>
</data>
<data name="ButtonPreviewChannelHelpSettings" xml:space="preserve">
<value>Channel preview requires playout, MPEG-TS/HLS Segmenter, and compatible FFmpeg Profile</value>
</data>
<data name="ButtonStopTranscodeHelp" xml:space="preserve">
<value>Stop Transcode Session</value>
</data>
<data name="ButtonEditChannelHelp" xml:space="preserve">
<value>Edit Channel</value>
</data>
<data name="ButtonTroubleshootChannelHelp" xml:space="preserve">
<value>Troubleshoot Channel</value>
</data>
<data name="ButtonDeleteChannelHelp" xml:space="preserve">
<value>Delete Channel</value>
</data>
</root>

54
ErsatzTV/Locals/Shared/Common.Designer.cs generated

@ -0,0 +1,54 @@ @@ -0,0 +1,54 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ErsatzTV.Locals.Shared {
using System;
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Common {
private static System.Resources.ResourceManager resourceMan;
private static System.Globalization.CultureInfo resourceCulture;
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Common() {
}
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
internal static System.Resources.ResourceManager ResourceManager {
get {
if (object.Equals(null, resourceMan)) {
System.Resources.ResourceManager temp = new System.Resources.ResourceManager("ErsatzTV.Locals.Shared.Common", typeof(Common).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
internal static System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
internal static string LabelRowsPerPage {
get {
return ResourceManager.GetString("LabelRowsPerPage", resourceCulture);
}
}
}
}

14
ErsatzTV/Locals/Shared/Common.pl.resx

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
<root>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

14
ErsatzTV/Locals/Shared/Common.pt-br.resx

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
<root>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

24
ErsatzTV/Locals/Shared/Common.resx

@ -0,0 +1,24 @@ @@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="LabelRowsPerPage" xml:space="preserve">
<value>Rows per page:</value>
</data>
</root>

61
ErsatzTV/Pages/Channels.razor

@ -10,19 +10,22 @@ @@ -10,19 +10,22 @@
@inject IMediator Mediator
@inject NavigationManager NavigationManager
@inject IFFmpegSegmenterService SegmenterService
@inject IStringLocalizer<ErsatzTV.Locals.Pages.Channels> Loc;
@inject IStringLocalizer<ErsatzTV.Locals.Shared.Common> CommonLoc;
@inject IStringLocalizer<ErsatzTV.Locals.Shared.MainLayout> MainLayoutLoc;
<MudForm Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-6" StartIcon="@Icons.Material.Filled.Add" Href="channels/add">
Add Channel
@Loc["ButtonAddChannel"]
</MudButton>
<MudButton Variant="Variant.Filled" Color="Color.Secondary" Class="ml-3" StartIcon="@Icons.Material.Filled.Edit" Href="channels/numbers">
Edit Channel Numbers
@Loc["ButtonEditChannelNumbers"]
</MudButton>
</MudPaper>
<div class="d-flex flex-column" style="height: 100vh; overflow-x: auto">
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<MudText Typo="Typo.h5" Class="mb-2">Channels</MudText>
<MudText Typo="Typo.h5" Class="mb-2">@MainLayoutLoc["ButtonChannels"]</MudText>
<MudDivider Class="mb-6"/>
<MudTable Hover="true"
@bind-RowsPerPage="@_rowsPerPage"
@ -30,7 +33,7 @@ @@ -30,7 +33,7 @@
@ref="_table"
RowClassFunc="ChannelRowClassFunc">
<ToolBarContent>
<MudSwitch T="bool" Class="ml-6" @bind-Value="@ShowDisabled" Color="Color.Secondary" Label="Show Disabled"/>
<MudSwitch T="bool" Class="ml-6" @bind-Value="@ShowDisabled" Color="Color.Secondary" Label="@Loc["ButtonShowDisabled"]"/>
</ToolBarContent>
<ColGroup>
<MudHidden Breakpoint="Breakpoint.Xs">
@ -45,29 +48,29 @@ @@ -45,29 +48,29 @@
</ColGroup>
<HeaderContent>
<MudTh>
<MudTableSortLabel InitialDirection="SortDirection.Ascending" SortBy="new Func<ChannelViewModel, object>(x => decimal.Parse(x.Number, CultureInfo.InvariantCulture))">Number</MudTableSortLabel>
<MudTableSortLabel InitialDirection="SortDirection.Ascending" SortBy="new Func<ChannelViewModel, object>(x => decimal.Parse(x.Number, CultureInfo.InvariantCulture))">@Loc["LabelNumber"]</MudTableSortLabel>
</MudTh>
<MudTh>Logo</MudTh>
<MudTh>@Loc["LabelLogo"]</MudTh>
<MudTh>
<MudTableSortLabel SortBy="new Func<ChannelViewModel, object>(x => x.Name)">Name</MudTableSortLabel>
<MudTableSortLabel SortBy="new Func<ChannelViewModel, object>(x => x.Name)">@Loc["LabelName"]</MudTableSortLabel>
</MudTh>
<MudTh>Language</MudTh>
<MudTh>Mode</MudTh>
<MudTh>FFmpeg Profile</MudTh>
<MudTh>@Loc["LabelLanguage"]</MudTh>
<MudTh>@Loc["LabelStreamingMode"]</MudTh>
<MudTh>@Loc["LabelFFmpegProfile"]</MudTh>
<MudTh/>
</HeaderContent>
<RowTemplate>
<MudTd DataLabel="Number">
<MudTd DataLabel="@Loc["LabelNumber"]">
@if (!context.IsEnabled)
{
<MudTooltip Text="Channel is disabled">
@($"(D) {context.Number}")
<MudTooltip Text="@Loc["LabelChannelDisabledHelp"]">
@($"({Loc["LabelChannelDisabledAbbreviation"]}) {context.Number}")
</MudTooltip>
}
else if (!context.ShowInEpg)
{
<MudTooltip Text="Channel is hidden from EPG">
@($"(H) {context.Number}")
<MudTooltip Text="@Loc["LabelChannelHiddenHelp"]">
@($"({Loc["LabelChannelHiddenAbbreviation"]}) {context.Number}")
</MudTooltip>
}
else
@ -75,7 +78,7 @@ @@ -75,7 +78,7 @@
@context.Number
}
</MudTd>
<MudTd DataLabel="Logo">
<MudTd DataLabel="@Loc["LabelLogo"]">
@if (!string.IsNullOrWhiteSpace(context.Logo?.Path))
{
<MudElement HtmlTag="img" src="@context.Logo.UrlWithContentType" Style="max-height: 50px"/>
@ -85,10 +88,10 @@ @@ -85,10 +88,10 @@
<MudElement HtmlTag="img" src="@($"iptv/logos/gen?text={context.WebEncodedName}")" Style="max-height: 50px"/>
}
</MudTd>
<MudTd DataLabel="Name">@context.Name</MudTd>
<MudTd DataLabel="Language">@context.PreferredAudioLanguageCode</MudTd>
<MudTd DataLabel="Mode">@GetStreamingMode(context.StreamingMode)</MudTd>
<MudTd DataLabel="FFmpeg Profile">
<MudTd DataLabel="@Loc["LabelName"]">@context.Name</MudTd>
<MudTd DataLabel="@Loc["LabelLanguage"]">@context.PreferredAudioLanguageCode</MudTd>
<MudTd DataLabel="@Loc["LabelStreamingMode"]">@GetStreamingMode(context.StreamingMode)</MudTd>
<MudTd DataLabel="@Loc["LabelFFmpegProfile"]">
@if (context.StreamingMode != StreamingMode.HttpLiveStreamingDirect)
{
@_ffmpegProfiles.Find(p => p.Id == context.FFmpegProfileId)?.Name
@ -102,7 +105,7 @@ @@ -102,7 +105,7 @@
bool notNormalizing = maybeProfile.Any(p => !p.NormalizeVideo || !p.NormalizeAudio);
if (notNormalizing)
{
<MudTooltip Text="Preview Channel; audio and/or video may not work without normalization">
<MudTooltip Text="@Loc["ButtonPreviewChannelHelpNormalize"]">
<MudIconButton Icon="@Icons.Material.Filled.PlayCircle"
OnClick="@(_ => PreviewChannel(context))"
Style="color: var(--mud-palette-warning-lighten);">
@ -111,7 +114,7 @@ @@ -111,7 +114,7 @@
}
else
{
<MudTooltip Text="Preview Channel">
<MudTooltip Text="@Loc["ButtonPreviewChannelHelp"]">
<MudIconButton Icon="@Icons.Material.Filled.PlayCircle"
OnClick="@(_ => PreviewChannel(context))">
</MudIconButton>
@ -120,7 +123,7 @@ @@ -120,7 +123,7 @@
}
else if (CanPreviewChannel(context) && _ffmpegProfilesThatCanPreview.ContainsKey(context.FFmpegProfileId) && !_ffmpegProfilesThatCanPreview[context.FFmpegProfileId])
{
<MudTooltip Text="Channel preview requires FFmpeg Profile compatible with this browser">
<MudTooltip Text="@Loc["ButtonPreviewChannelHelpBrowser"]">
<div style="height: 48px; width: 48px; align-items: center; display: flex; justify-content: center">
<!--suppress CssUnresolvedCustomProperty -->
<MudIcon Icon="@Icons.Material.Filled.PlayCircle" Style="color: var(--mud-palette-error-lighten);">
@ -130,14 +133,14 @@ @@ -130,14 +133,14 @@
}
else
{
<MudTooltip Text="Channel preview requires playout, MPEG-TS/HLS Segmenter, and compatible FFmpeg Profile">
<MudTooltip Text="@Loc["ButtonPreviewChannelHelpSettings"]">
<MudIconButton Icon="@Icons.Material.Filled.PlayCircle" Disabled="true">
</MudIconButton>
</MudTooltip>
}
@if (SegmenterService.IsActive(context.Number))
{
<MudTooltip Text="Stop Transcode Session">
<MudTooltip Text="@Loc["ButtonStopTranscodeHelp"]">
<MudIconButton Icon="@Icons.Material.Filled.Stop"
OnClick="@(_ => StopChannel(context))">
</MudIconButton>
@ -147,14 +150,14 @@ @@ -147,14 +150,14 @@
{
<div style="width: 48px"></div>
}
<MudTooltip Text="Edit Channel">
<MudTooltip Text="@Loc["ButtonEditChannelHelp"]">
<MudIconButton Icon="@Icons.Material.Filled.Edit"
Href="@($"channels/{context.Id}")">
</MudIconButton>
</MudTooltip>
@if (context.PlayoutCount > 0 && context.IsEnabled)
{
<MudTooltip Text="Troubleshoot Channel">
<MudTooltip Text="@Loc["ButtonTroubleshootChannelHelp"]">
<MudIconButton Icon="@Icons.Material.Filled.Troubleshoot"
Href="@($"system/troubleshooting/playback?channel={context.Id}")">
</MudIconButton>
@ -164,7 +167,7 @@ @@ -164,7 +167,7 @@
{
<div style="width: 48px"></div>
}
<MudTooltip Text="Delete Channel">
<MudTooltip Text="@Loc["ButtonDeleteChannelHelp"]">
<MudIconButton Icon="@Icons.Material.Filled.Delete"
OnClick="@(_ => DeleteChannelAsync(context))">
</MudIconButton>
@ -173,7 +176,7 @@ @@ -173,7 +176,7 @@
</MudTd>
</RowTemplate>
<PagerContent>
<MudTablePager/>
<MudTablePager RowsPerPageString="@CommonLoc["LabelRowsPerPage"]" />
</PagerContent>
</MudTable>
</MudContainer>

7
ErsatzTV/Pages/Settings/UISettings.razor

@ -29,9 +29,10 @@ @@ -29,9 +29,10 @@
<MudText>Language</MudText>
</div>
<MudSelect @bind-Value="_uiSettings.Language">
<MudSelectItem Value="@("en-us")">English</MudSelectItem>
<MudSelectItem Value="@("pl")">Polski</MudSelectItem>
<MudSelectItem Value="@("pt-br")">Português (Brasil)</MudSelectItem>
@foreach (Localization.CultureLanguage cultureLanguage in Localization.SupportedLanguages)
{
<MudSelectItem Value="@cultureLanguage.Culture">@cultureLanguage.Language</MudSelectItem>
}
</MudSelect>
</MudStack>
</MudContainer>

1
ErsatzTV/Shared/MainLayout.razor

@ -8,7 +8,6 @@ @@ -8,7 +8,6 @@
@using ErsatzTV.Core.Notifications
@using ErsatzTV.Extensions
@using MediatR.Courier
@using Microsoft.Extensions.Localization
@implements IDisposable
@inject NavigationManager NavigationManager
@inject IMediator Mediator

5
ErsatzTV/Startup.cs

@ -605,10 +605,9 @@ public class Startup @@ -605,10 +605,9 @@ public class Startup
{
CultureInfo[] cinfo = CultureInfo.GetCultures(CultureTypes.AllCultures & ~CultureTypes.NeutralCultures);
string[] supportedCultures = cinfo.Select(t => t.Name).Distinct().ToArray();
string[] supportedUiCultures = ["en-us", "pl", "pt-br"];
options.AddSupportedCultures(supportedCultures)
.AddSupportedUICultures(supportedUiCultures)
.SetDefaultCulture("en-us");
.AddSupportedUICultures(Localization.UiCultures)
.SetDefaultCulture(Localization.DefaultCulture);
options.AddInitialRequestCultureProvider(
new DatabaseRequestCultureProvider(
new AcceptLanguageHeaderRequestCultureProvider()));

1
ErsatzTV/_Imports.razor

@ -11,6 +11,7 @@ @@ -11,6 +11,7 @@
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.Data.Sqlite
@using Microsoft.EntityFrameworkCore
@using Microsoft.Extensions.Localization
@using Microsoft.Extensions.Logging
@using Microsoft.JSInterop
@using Blazored.FluentValidation

Loading…
Cancel
Save