Skip to content

Commit

Permalink
Merge pull request gui-cs#3633 from BDisp/v2_3632_embedded-strings-re…
Browse files Browse the repository at this point in the history
…sources-for-self-contained

Fixes gui-cs#3632. Automate getting cultures from the embedded resources strings for self-contained app.
  • Loading branch information
tig authored Aug 1, 2024
2 parents 66ac07a + f3146a2 commit a0e639d
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 27 deletions.
3 changes: 2 additions & 1 deletion SelfContained/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,12 @@ private static void Main (string [] args)

if (Equals (Thread.CurrentThread.CurrentUICulture, CultureInfo.InvariantCulture) && Application.SupportedCultures.Count == 0)
{
// Only happens if the project has <InvariantGlobalization>true</InvariantGlobalization>
Debug.Assert (Application.SupportedCultures.Count == 0);
}
else
{
Debug.Assert (Application.SupportedCultures.Count == 4);
Debug.Assert (Application.SupportedCultures.Count > 0);
Debug.Assert (Equals (CultureInfo.CurrentCulture, Thread.CurrentThread.CurrentUICulture));
}

Expand Down
46 changes: 23 additions & 23 deletions Terminal.Gui/Application/Application.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Reflection;
using System.Resources;
using Terminal.Gui.Resources;

namespace Terminal.Gui;

Expand Down Expand Up @@ -63,31 +65,29 @@ internal static List<CultureInfo> GetSupportedCultures ()
{
// Return all culture for which satellite folder found with culture code.
return cultures.Where (
cultureInfo =>
Directory.Exists (Path.Combine (assemblyLocation, cultureInfo.Name))
&& File.Exists (Path.Combine (assemblyLocation, cultureInfo.Name, resourceFilename))
)
.ToList ();
cultureInfo =>
Directory.Exists (Path.Combine (assemblyLocation, cultureInfo.Name))
&& File.Exists (Path.Combine (assemblyLocation, cultureInfo.Name, resourceFilename))
)
.ToList ();
}

// It's called from a self-contained single.file.
try
{
// <InvariantGlobalization>false</InvariantGlobalization>
return
[
new ("fr-FR"),
new ("ja-JP"),
new ("pt-PT"),
new ("zh-Hans")
];
}
catch (CultureNotFoundException)
{
// <InvariantGlobalization>true</InvariantGlobalization>
// Only the invariant culture is supported in globalization-invariant mode.
return [];
}
// It's called from a self-contained single-file and get available cultures from the embedded resources strings.
return GetAvailableCulturesFromEmbeddedResources ();
}

internal static List<CultureInfo> GetAvailableCulturesFromEmbeddedResources ()
{
ResourceManager rm = new (typeof (Strings));

CultureInfo [] cultures = CultureInfo.GetCultures (CultureTypes.AllCultures);

return cultures.Where (
cultureInfo =>
!cultureInfo.Equals (CultureInfo.InvariantCulture)
&& rm.GetResourceSet (cultureInfo, true, false) is { }
)
.ToList ();
}

/// <summary>
Expand Down
5 changes: 2 additions & 3 deletions UnitTests/Application/ApplicationTests.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using Microsoft.VisualBasic;
using Xunit.Abstractions;
using Xunit.Abstractions;

// Alias Console to MockConsole so we don't accidentally use Console

Expand Down Expand Up @@ -193,7 +192,7 @@ void CheckReset ()
// Internal properties
Assert.False (Application._initialized);
Assert.Equal (Application.GetSupportedCultures (), Application.SupportedCultures);
Assert.Equal (4, Application.SupportedCultures.Count);
Assert.Equal (Application.GetAvailableCulturesFromEmbeddedResources(), Application.SupportedCultures);
Assert.False (Application._forceFakeConsole);
Assert.Equal (-1, Application._mainThreadId);
Assert.Empty (Application._topLevels);
Expand Down

0 comments on commit a0e639d

Please sign in to comment.