C# WPF实现多语言国际化支持,无法生成对应的资源dll文件

问题描述 投票:0回答:1

我正在尝试在我的 C# WPF 应用程序中实现多语言国际化支持。我已遵循安装指南,但在尝试生成相应的资源 DLL 文件时遇到问题。

以下是我尝试过的步骤:

  1. 我添加了 WPFLocalizeExtension 包以实现多语言支持。
  2. 我编写了一个 LanguageHelper 类来获取国际化字符串。
public static string GetLocalizedString(string key, string resourceFileName = "Languages", bool addSpaceAfter = false)
  {
      var localizedString = String.Empty;

      // Build up the fully-qualified name of the key
      var assemblyName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
      var fullKey = assemblyName + ":" + resourceFileName + ":" + key;
      var locExtension = new LocExtension(fullKey);
      locExtension.ResolveLocalizedValue(out localizedString);

      // Add a space to the end, if requested
      if (addSpaceAfter)
      {
          localizedString += " ";
      }

      return localizedString;
  }

返回一个字符串。它有三个参数:

  • key
    :用于指定要获取的本地化字符串的关键字或标识符。
  • resourceFileName
    :用于指定资源文件的名称,默认值为“Languages”。
  • addSpaceAfter
    :一个布尔值,如果为 true,则会在本地化字符串的末尾添加一个空格。

该方法用于根据给定的键从指定的资源文件(默认为“Languages”)获取本地化字符串。

  1. 在 Xaml 中进行引用
lex:LocalizeDictionary.DesignCulture="en-US" 
lex:ResxLocalizationProvider.DefaultAssembly="AppSample" 
lex:ResxLocalizationProvider.DefaultDictionary="Langs"  

配置WPF的Xaml文件支持多种语言,并在不同的语言环境中显示相应的本地化资源。

  1. 使用此方法更改语言
public void ChangeLanguage(string languageCode)
    {
        WPFLocalizeExtension.Engine.LocalizeDictionary.Instance.Culture = new CultureInfo(languageCode);
    }
  1. 写入 .resx 文件

.resx 文件的配置详细信息为:

  • 文件存放路径是i18n文件夹,不是Resources文件夹。
  • 命名统一为:Languages.en_US.resx
  • 全部都是嵌入式资源
  • 为所有文件设置公共访问修饰符
  1. 构建项目

但是,在第6步时,我遇到了以下问题:

生成时会报错

The file "obj\x64\All\en-US\DarkMode 2.resources.dll" cannot be copied because the file cannot be found.

我已经检查了我的代码和配置,但仍然无法解决问题。我想知道是否有人在类似的情况下遇到过类似的问题,或者是否有人知道如何正确生成多语言支持的资源 DLL 文件。

这是我使用的环境和工具:

  • Visual Studio 版本:2022 17.6.2
  • .NET版本:.Net Framework 4.8

我的英语能力不好。如果您有任何疑问,请随时询问。任何有关如何解决此问题的建议或指导将不胜感激。谢谢!

我以前尝试过:

  1. 删除obj目录
  2. 清理解决方案并重建
c# .net wpf internationalization resx
1个回答
0
投票

这个问题困扰了我很多天,直到现在我终于找到了问题的原因。这个问题在之前的版本中并不存在,但是在最近的更新中出现了。因此,我使用 Git 比较了之前版本和当前版本的工作树,并找出了问题所在。在之前的版本中,对编译辅助程序集没有任何限制,导致当前版本设置为始终编译辅助程序集时出现这个问题。要解决这个问题,只需在项目的

.csproj
文件中将辅助程序集的编译设置为False即可。

<Project>
    <PropertyGroup>
        <GenerateSatelliteAssembliesForCore>false</GenerateSatelliteAssembliesForCore>
    </PropertyGroup>
</Project>
© www.soinside.com 2019 - 2024. All rights reserved.