如何将本地化资源文件嵌入到.NET 7 WPF应用程序的主程序集中?

juud5qan  于 2023-05-30  发布在  .NET
关注(0)|答案(1)|浏览(256)

this example之后,我在WPF应用程序的.csproj文件中包含了一些本地化资源文件:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net7.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <UseWPF>true</UseWPF>
    <UICulture>en</UICulture>
  </PropertyGroup>

  <ItemGroup>
    <EmbeddedResource Include="locale.en.restext" />
    <EmbeddedResource Include="locale.es.restext" />
    <EmbeddedResource Include="locale.fr.restext" />
  </ItemGroup>

</Project>

然后我可以创建一个ResourceManager示例并使用.GetString( String, CultureInfo )
回退机制的工作原理或多或少与宣传的一样。***Except...***默认UICulture的最终回退似乎不起作用-即使我在类中包含以下属性:

[assembly:NeutralResourcesLanguage( "en" ) ]

我相当肯定这是因为我的.en.restext文件是作为附属程序集构建的,而不是包含在主程序集中。

PS > Get-ChildItem .\bin\Debug\net7.0-windows

    Directory: C:\Users\user\path\to\proj\bin\Debug\net7.0-windows

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2023-05-18    23:56                en
d----          2023-05-18    23:56                es
d----          2023-05-18    23:56                fr
-a---          2023-05-18    23:56            679 Proj.deps.json
-a---          2023-05-18    23:56           6144 Proj.dll
-a---          2023-05-18    23:56         154624 Proj.exe
-a---          2023-05-18    23:56          12888 Proj.pdb
-a---          2023-05-18    23:56            266 Proj.runtimeconfig.json

特别是如果我在我的类中包含以下内容,那么回退机制就可以完美地工作:

[assembly:NeutralResourcesLanguage( "en", UltimateResourceFallbackLocation.Satellite )]

那么,如何在.csproj文件中指定本地化资源应包含在主程序集中,而不是附属程序集中?

hzbexzde

hzbexzde1#

好吧,经过一些更futzing周围,并试图使意义this horror ...我想我已经破解了。
很简单,当我在.csproj文件中指定以下内容时:

<!-- ... -->
    <UICulture>en</UICulture>
<!-- ... -->

那么这意味着我应该将资源文件命名为“Neutral Culture”,而不使用其标识后缀en。这意味着它将出现在.csproj***中,而不是像这样:

<!-- ... -->
    <EmbeddedResource Include="locale.en.restext" />
<!-- ... -->

但是***像这样:***

<!-- ... -->
    <EmbeddedResource Include="locale.restext" />
<!-- ... -->

当我这样做时,它会被编译到主程序集。
.GetString( String, CultureInfo )的最终回退可以完美地工作,而无需指定:

[assembly:NeutralResourcesLanguage( "en", UltimateResourceFallbackLocation.Satellite )]

支持微软开放他们的.NET代码。(即使是神秘的东西,比如MSBuild定义。
我很感激我不再需要像很多文档中说的那样,用resgen手动预编译.restext文件。
一般来说,他们的文档都是顶级的。
但我认为他们应该更新描述SDK风格项目的资源和本地化的页面。

相关问题