I am working on the HealthVault SDK from Microsoft, I am trying to include a few translations for the text resources provided with SDK.
This is a piece of resource file used
resources.restext
# Used in many files
ListSeparator=,
ListFormat=, {0}
GroupSeparator=;
GroupFormat=; {0}
Range={0} - {1}
DateRange={0} to {1}
This is the code that initializes the Resource manager.
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;
}
where baseName is resources
, assemblyToUse is Assembly.GetCallingAssembly()
.
The default strings are present in a text file named resources.restext
. I wish to translate a few strings to Swedish and I added resources.sv-se.restext
and made the translations. When I built the project, Satellite assembles were created in the bin
folder inside a folder named sv-se
. But the strings are still taken from the default resource file. I modified the default file and the changes are reflected immediately.
I tried loading the dll manually and the manifest names consisted of a name Microsoft.Health.ItemTypes.resources.sv-se.resources
. I initialized the ResourceManager
with that name and the same assembly.
var rm = new ResourceManager("Microsoft.Health.ItemTypes.resources.sv-se.resources", assembly);
rm.GetString("Key"); // Causes MissingManifestResourceException
However, I tried and was able to get the key by using the following
var rm = new ResourceManager("Microsoft.Health.ItemTypes.resources.sv-se", assembly); // manifest name - trailing resources
rm.GetString("Key"); // works!
My question is this:
What is the correct way to use ResourceManger
? Should the satellite assembly be passed to the RM constructor? and how must be the resource files named, so that I do not have to edit the manifest name to create the resource manager instance?
Solved.
In the
.csproj
for the project, the logical name of the resource was changed.Changing the csproj to following solved my issues