【问题标题】:Resource manager gets default language and only one culture specific translation, every next culture returns english资源管理器获取默认语言和只有一种文化特定的翻译,每种文化都返回英语
【发布时间】:2020-09-22 09:24:34
【问题描述】:

我在 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】:

    解决方法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-04
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多