资源管理器获取默认语言,并且只有一种特定于文化的翻译,每个下一个文化 returns 英语

Resource manager gets default language and only one culture specific translation, every next culture returns english

我在 c# godot 项目中使用 resx 文件。经过一些问题后,我现在终于可以使用 resourcemanager.

访问 t运行slations

我 运行 遇到的问题是我只能获得一种文化特定的 t运行slations,当我在另一个 language/culture 中调用相同的字符串时,它总是返回到默认英文。

我有一个 ID 的字符串:test_string

english value: test1

spanish value: test2

french value : test3

var translationAssembly = Assembly.GetExecutingAssembly();
var translationAssemblyResource = "GodotFrontend.MultilingualResources.strings";
var resourceManager = new ResourceManager(translationAssemblyResource, translationAssembly);

System.Globalization.CultureInfo ci1 = new System.Globalization.CultureInfo("en"); 
string temp = resourceManager.GetString("test_string", ci1); // returns test1

System.Globalization.CultureInfo ci2 = new System.Globalization.CultureInfo("es"); 
string temp2 = resourceManager.GetString("test_string", ci2); // returns test2   

System.Globalization.CultureInfo ci3 = new System.Globalization.CultureInfo("fr"); 
string temp3 = resourceManager.GetString("test_string", ci3); // returns test1 (WRONG)

所以第三种语言不是 return 预期的“test 3”字符串,而是默认的英语字符串。但我什至发现 st运行ger 是,如果我切换调用字符串的顺序(切换 es 和 fr),我得到法语字符串,但随后西班牙语字符串恢复为英语

System.Globalization.CultureInfo ci1 = new System.Globalization.CultureInfo("en");
string temp = resourceManager.GetString("test_string", ci1); // returns test1

System.Globalization.CultureInfo ci2 = new System.Globalization.CultureInfo("fr");
string temp2 = resourceManager.GetString("test_string", ci2); // returns test3

System.Globalization.CultureInfo ci3 = new System.Globalization.CultureInfo("es");
string temp3 = resourceManager.GetString("test_string", ci3); // returns test1 (WRONG)

基本上它适用于第一个非英语的“t运行slation”,下一个停止工作。

知道为什么会这样吗?

更新:

发现无法在第一个语言程序集之后加载正确的语言程序集的问题,因为每种语言的 .dll-s 具有相同的名称。

如果我将应用程序切换到“控制台应用程序”,它可以工作,但是当我将它切换回“class 库应用程序”时,它无法加载同名程序集,因此程序集保持不变,即使当我用不同的指定文化调用它时。

如何绕过这个?

解决方法:

public static void LoadAllTranslationAssemblies()
{
    string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    foreach (string dll in Directory.GetFiles(path, "*.resources.dll", SearchOption.AllDirectories))
    {
        try
        {
            Assembly loadedAssembly = Assembly.LoadFile(dll);
        }
        catch (FileLoadException loadEx)
        {
            Console.WriteLine(loadEx);
        }
        catch (BadImageFormatException imgEx)
        {
            Console.WriteLine(imgEx);
        } 
    } 
}