浏览代码

Fixes #3632. Automatize getting cultures from the embedded resources strings for self-contained app.

BDisp 1 年之前
父节点
当前提交
60da57de43
共有 3 个文件被更改,包括 27 次插入30 次删除
  1. 1 5
      SelfContained/Program.cs
  2. 23 23
      Terminal.Gui/Application/Application.cs
  3. 3 2
      UnitTests/Application/ApplicationTests.cs

+ 1 - 5
SelfContained/Program.cs

@@ -18,13 +18,9 @@ public static class Program
 
         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 (Equals (CultureInfo.CurrentCulture, Thread.CurrentThread.CurrentUICulture));
-        }
 
         #endregion
 

+ 23 - 23
Terminal.Gui/Application/Application.cs

@@ -2,6 +2,8 @@ using System.Diagnostics;
 using System.Diagnostics.CodeAnalysis;
 using System.Globalization;
 using System.Reflection;
+using System.Resources;
+using Terminal.Gui.Resources;
 
 namespace Terminal.Gui;
 
@@ -63,31 +65,29 @@ public static partial class Application
         {
             // 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>

+ 3 - 2
UnitTests/Application/ApplicationTests.cs

@@ -1,4 +1,5 @@
-using Microsoft.VisualBasic;
+using System.Globalization;
+using Microsoft.VisualBasic;
 using Xunit.Abstractions;
 
 // Alias Console to MockConsole so we don't accidentally use Console
@@ -193,7 +194,7 @@ public class ApplicationTests
             // 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);