资源管理器获得默认语言,并且只有一个特定文化的翻译,每下一个文化都会返回英语。

问题描述 投票:1回答:1

我在一个c# godot项目中使用resx文件。在经历了一些问题之后,我现在终于可以用资源管理器访问翻译了。

我遇到的问题是,我只能得到一个特定文化的翻译,当我在另一个语言文化中调用相同的字符串时,它总是回到默认的英语。

我有一个字符串 ID: test_string

英文值:test1

西班牙语值:test2

法值: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)

所以第三种语言并没有返回预期的 "test 3 "字符串,而是返回了默认的英语字符串。但我发现更奇怪的是,如果我改变调用字符串的顺序(切换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)

基本上,第一个 "翻译 "不是英语,下一个就停止工作了。

知道为什么会出现这种情况吗?

更新。

发现了一个问题,由于每种语言的.dll-s都有相同的名称,所以在第一个语言集锦之后无法加载正确的语言集锦。

如果我把应用程序切换到 "控制台应用程序",它可以工作,但是当我把它切换回 "类库应用程序 "时,它不能加载同名的程序集,所以即使我用不同的指定文化调用它,程序集也保持不变。

如何绕过这个问题?

c# localization resources godot resourcemanager
1个回答
0
投票

解决办法。

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);
        } 
    } 
}
© www.soinside.com 2019 - 2024. All rights reserved.