我的解决方案:程序只包含一个默认语言资源文件(resx)。所有其他语言都从 .resx 编译为 .resources 并作为资源文件嵌入。重要的!我更改了扩展名,因为“.resources”被识别为一种特殊类型的资源,所以我的法语文件被命名为“PIAE.LangResources.fr”。
这是检索已翻译字符串的简单代码(应该通过缓存资源中的值来改进它):
internal static string GetString(string str, string lang)
{
if (string.IsNullOrEmpty(str)) throw new ArgumentNullException("empty language query string");
if (string.IsNullOrEmpty(lang)) throw new ArgumentNullException("no language resource given");
// culture-specific file, i.e. "LangResources.fr"
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("PIAE.LangResources."+lang);
// resource not found, revert to default resource
if (null == stream)
{
stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("PIAE.Properties.LangResources.resources");
}
ResourceReader reader = new ResourceReader(stream);
IDictionaryEnumerator en= reader.GetEnumerator();
while (en.MoveNext())
{
if (en.Key.Equals(str))
{
return en.Value.ToString();
}
}
// string not translated, revert to default resource
return LangResources.ResourceManager.GetString(str);
}