diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4ae427e70..b3fddbc80 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -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
diff --git a/ErsatzTV/ErsatzTV.csproj b/ErsatzTV/ErsatzTV.csproj
index ff2f914b4..d13c75219 100644
--- a/ErsatzTV/ErsatzTV.csproj
+++ b/ErsatzTV/ErsatzTV.csproj
@@ -111,6 +111,14 @@
ResXFileCodeGenerator
MainLayout.Designer.cs
+
+ ResXFileCodeGenerator
+ Channels.Designer.cs
+
+
+ ResXFileCodeGenerator
+ Common.Designer.cs
+
@@ -138,6 +146,16 @@
True
MainLayout.resx
+
+ True
+ True
+ Channels.resx
+
+
+ True
+ True
+ Common.resx
+
diff --git a/ErsatzTV/Locals/Pages/Channels.Designer.cs b/ErsatzTV/Locals/Pages/Channels.Designer.cs
new file mode 100644
index 000000000..1df1041e5
--- /dev/null
+++ b/ErsatzTV/Locals/Pages/Channels.Designer.cs
@@ -0,0 +1,186 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+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 LabelRowsPerPage {
+ get {
+ return ResourceManager.GetString("LabelRowsPerPage", 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);
+ }
+ }
+ }
+}
diff --git a/ErsatzTV/Locals/Pages/Channels.pl.resx b/ErsatzTV/Locals/Pages/Channels.pl.resx
new file mode 100644
index 000000000..0db197394
--- /dev/null
+++ b/ErsatzTV/Locals/Pages/Channels.pl.resx
@@ -0,0 +1,14 @@
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ErsatzTV/Locals/Pages/Channels.pt-br.resx b/ErsatzTV/Locals/Pages/Channels.pt-br.resx
new file mode 100644
index 000000000..0db197394
--- /dev/null
+++ b/ErsatzTV/Locals/Pages/Channels.pt-br.resx
@@ -0,0 +1,14 @@
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ErsatzTV/Locals/Pages/Channels.resx b/ErsatzTV/Locals/Pages/Channels.resx
new file mode 100644
index 000000000..41e662996
--- /dev/null
+++ b/ErsatzTV/Locals/Pages/Channels.resx
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Add Channel
+
+
+ Edit Channel Numbers
+
+
+ Channels
+
+
+ Show Disabled
+
+
+ Number
+
+
+ Logo
+
+
+ Name
+
+
+ Language
+
+
+ Mode
+
+
+ FFmpeg Profile
+
+
+ Rows per page
+
+
+ Channel is disabled
+
+
+ Channel is hidden from EPG
+
+
+ H
+
+
+ D
+
+
+ Preview Channel
+
+
+ Preview Channel; audio and/or video may not work without normalization
+
+
+ Channel preview requires FFmpeg Profile compatible with this browser
+
+
+ Channel preview requires playout, MPEG-TS/HLS Segmenter, and compatible FFmpeg Profile
+
+
+ Stop Transcode Session
+
+
+ Edit Channel
+
+
+ Troubleshoot Channel
+
+
+ Delete Channel
+
+
diff --git a/ErsatzTV/Locals/Shared/Common.Designer.cs b/ErsatzTV/Locals/Shared/Common.Designer.cs
new file mode 100644
index 000000000..56b96c658
--- /dev/null
+++ b/ErsatzTV/Locals/Shared/Common.Designer.cs
@@ -0,0 +1,54 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+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);
+ }
+ }
+ }
+}
diff --git a/ErsatzTV/Locals/Shared/Common.pl.resx b/ErsatzTV/Locals/Shared/Common.pl.resx
new file mode 100644
index 000000000..0db197394
--- /dev/null
+++ b/ErsatzTV/Locals/Shared/Common.pl.resx
@@ -0,0 +1,14 @@
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ErsatzTV/Locals/Shared/Common.pt-br.resx b/ErsatzTV/Locals/Shared/Common.pt-br.resx
new file mode 100644
index 000000000..0db197394
--- /dev/null
+++ b/ErsatzTV/Locals/Shared/Common.pt-br.resx
@@ -0,0 +1,14 @@
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ErsatzTV/Locals/Shared/Common.resx b/ErsatzTV/Locals/Shared/Common.resx
new file mode 100644
index 000000000..26b3d4ad5
--- /dev/null
+++ b/ErsatzTV/Locals/Shared/Common.resx
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Rows per page:
+
+
diff --git a/ErsatzTV/Pages/Channels.razor b/ErsatzTV/Pages/Channels.razor
index c19956229..e2acd4980 100644
--- a/ErsatzTV/Pages/Channels.razor
+++ b/ErsatzTV/Pages/Channels.razor
@@ -10,19 +10,22 @@
@inject IMediator Mediator
@inject NavigationManager NavigationManager
@inject IFFmpegSegmenterService SegmenterService
+@inject IStringLocalizer Loc;
+@inject IStringLocalizer CommonLoc;
+@inject IStringLocalizer MainLayoutLoc;
- Add Channel
+ @Loc["ButtonAddChannel"]
- Edit Channel Numbers
+ @Loc["ButtonEditChannelNumbers"]
- Channels
+ @MainLayoutLoc["ButtonChannels"]
-
+
@@ -45,29 +48,29 @@
- Number
+ @Loc["LabelNumber"]
- Logo
+ @Loc["LabelLogo"]
- Name
+ @Loc["LabelName"]
- Language
- Mode
- FFmpeg Profile
+ @Loc["LabelLanguage"]
+ @Loc["LabelStreamingMode"]
+ @Loc["LabelFFmpegProfile"]
-
+
@if (!context.IsEnabled)
{
-
- @($"(D) {context.Number}")
+
+ @($"({Loc["LabelChannelDisabledAbbreviation"]}) {context.Number}")
}
else if (!context.ShowInEpg)
{
-
- @($"(H) {context.Number}")
+
+ @($"({Loc["LabelChannelHiddenAbbreviation"]}) {context.Number}")
}
else
@@ -75,7 +78,7 @@
@context.Number
}
-
+
@if (!string.IsNullOrWhiteSpace(context.Logo?.Path))
{
@@ -85,10 +88,10 @@
}
- @context.Name
- @context.PreferredAudioLanguageCode
- @GetStreamingMode(context.StreamingMode)
-
+ @context.Name
+ @context.PreferredAudioLanguageCode
+ @GetStreamingMode(context.StreamingMode)
+
@if (context.StreamingMode != StreamingMode.HttpLiveStreamingDirect)
{
@_ffmpegProfiles.Find(p => p.Id == context.FFmpegProfileId)?.Name
@@ -102,7 +105,7 @@
bool notNormalizing = maybeProfile.Any(p => !p.NormalizeVideo || !p.NormalizeAudio);
if (notNormalizing)
{
-
+
@@ -111,7 +114,7 @@
}
else
{
-
+
@@ -120,7 +123,7 @@
}
else if (CanPreviewChannel(context) && _ffmpegProfilesThatCanPreview.ContainsKey(context.FFmpegProfileId) && !_ffmpegProfilesThatCanPreview[context.FFmpegProfileId])
{
-
+
@@ -130,14 +133,14 @@
}
else
{
-
+
}
@if (SegmenterService.IsActive(context.Number))
{
-
+
@@ -147,14 +150,14 @@
{
}
-
+
@if (context.PlayoutCount > 0 && context.IsEnabled)
{
-
+
@@ -164,7 +167,7 @@
{
}
-
+
@@ -173,7 +176,7 @@
-
+
diff --git a/ErsatzTV/Shared/MainLayout.razor b/ErsatzTV/Shared/MainLayout.razor
index 81a3e175b..49c9b360d 100644
--- a/ErsatzTV/Shared/MainLayout.razor
+++ b/ErsatzTV/Shared/MainLayout.razor
@@ -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
diff --git a/ErsatzTV/_Imports.razor b/ErsatzTV/_Imports.razor
index 8b536efdf..bbe1c8cab 100644
--- a/ErsatzTV/_Imports.razor
+++ b/ErsatzTV/_Imports.razor
@@ -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