资源管理器获取默认语言,并且只有一个区域性特定的翻译,每隔一个区域性返回英语



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

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

我有一个ID 为 test_string的字符串

英语值:测试1

西班牙语值:测试2

法语值:测试3

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 具有相同的名称。

如果我将应用程序切换到"控制台应用程序",它可以工作,但是当我将其切换回"类库应用程序"时,它无法加载同名程序集,因此程序集保持不变,即使我使用不同的指定区域性调用它也是如此。

如何绕过这个??

解决方法:

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);
} 
} 
}

相关内容

最新更新