0

我正在研究 Microsoft 的 HealthVault SDK,我正在尝试为 SDK 提供的文本资源添加一些翻译。

这是一块使用的资源文件

资源.restext

# Used in many files
ListSeparator=, 
ListFormat=, {0}
GroupSeparator=;
GroupFormat=; {0} 
Range={0} - {1}
DateRange={0} to {1}

这是初始化资源管理器的代码。

private static ResourceManager InitRMWithAssembly(
        string baseName,
        Assembly assemblyToUse,
        Type usingResourceSet)
    {
        ResourceManager rm = null;

        if (usingResourceSet != null &&
            baseName != null &&
            assemblyToUse != null)
        {
            rm =
                new ResourceManager(
                    baseName,
                    assemblyToUse,
                    usingResourceSet);
        }
        else if (usingResourceSet != null &&
                 baseName == null &&
                 assemblyToUse == null)
        {
            rm = new ResourceManager(usingResourceSet);
        }
        else if (usingResourceSet == null &&
                 baseName != null &&
                 assemblyToUse != null)
        {
            rm = new ResourceManager(baseName, assemblyToUse);
        }
        else
        {
            throw new ArgumentException("assemblyToUse cannot be null", "assemblyToUse");
        }

        return rm;
    }

其中 baseName 是resources, assemblyToUse 是Assembly.GetCallingAssembly()

默认字符串存在于名为resources.restext. 我希望将一些字符串翻译成瑞典语,然后我添加resources.sv-se.restext并进行了翻译。当我构建项目时,在bin名为sv-se. 但是字符串仍然取自默认资源文件。我修改了默认文件,更改立即反映。

我尝试手动加载 dll,清单名称由 name 组成Microsoft.Health.ItemTypes.resources.sv-se.resourcesResourceManager我用那个名字和相同的程序集初始化了。

var rm = new ResourceManager("Microsoft.Health.ItemTypes.resources.sv-se.resources", assembly);
rm.GetString("Key"); // Causes MissingManifestResourceException

但是,我尝试并能够使用以下方法获取密钥

var rm = new ResourceManager("Microsoft.Health.ItemTypes.resources.sv-se", assembly); // manifest name - trailing resources
rm.GetString("Key"); // works!

我的问题是这样的:

正确的使用方法是ResourceManger什么?卫星程序集是否应该传递给 RM 构造函数?以及必须如何命名资源文件,这样我就不必编辑清单名称来创建资源管理器实例?

4

1 回答 1

0

解决了。

.csproj项目中,资源的逻辑名称已更改。

将 csproj 更改为以下解决了我的问题

<ItemGroup>
  <EmbeddedResource Include="resources.restext">
    <LogicalName>resources.resources</LogicalName>
  </EmbeddedResource>
  <EmbeddedResource Include="resources.sv-se.restext">
    <LogicalName>resources.sv-se.resources</LogicalName>
  </EmbeddedResource>
</ItemGroup>
于 2016-02-02T09:57:07.443 回答