在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 )
.
回退机制或多或少像宣传的那样。 除了...默认 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
文件中指定本地化资源应该包含在主程序集中,而不是在附属程序集中?
好吧,经过更多的思考并试图弄清楚这个恐怖......我想我已经破解了它。
很简单,当我在我的
.csproj
文件中指定以下内容时:
<!-- ... -->
<UICulture>en</UICulture>
<!-- ... -->
那么这意味着我应该命名“Neutral Culture”资源文件而没有其识别
en
后缀。因此,我应该在 .csproj
文件中将其简单地称为:
<!-- ... -->
<EmbeddedResource Include="locale.restext" />
<!-- ... -->
当我这样做时,它会被编译到主程序集中。
.GetString( String, CultureInfo )
的最终回退无需指定即可完美运行:
[assembly:NeutralResourcesLanguage( "en", UltimateResourceFallbackLocation.Satellite )]
支持 Microsoft 开源其大量 .NET 代码。 (即使它是神秘的东西,比如 MSBuild 定义。)
我很感激我不再需要用
.restext
手动预编译resgen
文件,因为很多文档仍然说。
一般来说,他们的文档是最重要的。
但我确实认为他们应该更新描述 SDK 样式项目的资源和本地化的页面。