瀏覽代碼

Merge pull request #3633 from BDisp/v2_3632_embedded-strings-resources-for-self-contained

Fixes #3632. Automate getting cultures from the embedded resources strings for self-contained app.
Tig 1 年之前
父節點
當前提交
a0e639dbe7
共有 3 個文件被更改,包括 27 次插入27 次删除
  1. 2 1
      SelfContained/Program.cs
  2. 23 23
      Terminal.Gui/Application/Application.cs
  3. 2 3
      UnitTests/Application/ApplicationTests.cs

+ 2 - 1
SelfContained/Program.cs

@@ -18,11 +18,12 @@ 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 (Application.SupportedCultures.Count > 0);
             Debug.Assert (Equals (CultureInfo.CurrentCulture, Thread.CurrentThread.CurrentUICulture));
         }
 

+ 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>

+ 2 - 3
UnitTests/Application/ApplicationTests.cs

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