首先:我对处理对象和处理方法不太了解。
目前我正在开发一个解决方案,其中包括 ASP.Net API、WPF 和库项目(全部在 .NET 6.0 中)。该库包含提供本地化字符串的 .resx 文件。我已经根据本指南实现了本地化。除了某些情况外,这种方法效果很好。主要问题出在WPF项目中。我将简化命名空间,使它们更易于访问:
My.Namespace.WPF
My.Namespace.Language
为了获取所有支持的语言,我在
My.Namespace.Language
中使用此类:
public class LanguageProvider
{
public static IEnumerable<CultureInfo> GetSupportedLanguages()
{
List<CultureInfo> supportedLanguages = new();
CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.NeutralCultures);
foreach (CultureInfo culture in cultures)
{
try
{
using ResourceSet? rs = Resources.Strings.ResourceManager.GetResourceSet(culture, true, false);
if (rs is not null && culture.TwoLetterISOLanguageName != "iv")
{
if (!supportedLanguages.Contains(culture))
{
supportedLanguages.Add(culture);
}
}
else if (culture.TwoLetterISOLanguageName == "en")
{
supportedLanguages.Add(culture);
}
}
catch (Exception)
{
}
}
return supportedLanguages;
}
}
该项目还包含带有
Strings.resx
和 Strings.de.resx
的资源文件夹(命名空间 My.Namespace.Language.Resources
)。要从我的 WPF 项目中的资源中获取字符串,我只需使用以下命令:
string customText = My.Namespace.Language.Resources.Strings.sometext;
在第一次调用
GetSupportedLanguages()
之后初始化的所有对象都无法访问 Strings
并抛出 ObjectDisposedException: Cannot access a closed resource set.
通常在初始化 MainWindow
之前调用它。因此我什至无法显示它。由于资源在某个时刻被处置,我是否必须以不同的方式实现可用语言的列表?
设置参数,让您可以在调用
ResourceSet
时控制是否创建false
为GetResourceSet
:
using ResourceSet? rs = strings.ResourceManager.GetResourceSet(culture, false, false);
然后,在调用
ResourceManager
方法后,您应该能够像往常一样使用生成的 Resources.Strings
中的 GetSupportedLanguages()
检索资源:
string customText = My.Namespace.Language.Resources.Strings.sometext;