在官方文件中,我找不到关于.Designer.cs个文件与.resx个文件如何工作的太多信息,搜索这种情况也没有得到任何有用的信息.


我目前正在进行的项目需要支持多种语言.因此,它有本地化文件:

  • Localization.resx
  • Localization.en.resx
  • Validation.resx
  • Validation.en.resx

Note: English isn't the default language.

我注意到,除了.resx个文件外,我们还有大约Designer.cs个文件.具体地说,我们有以下几项:

  • Localization.Designer.cs
  • Localization.en.Designer.cs
  • Validation.Designer.cs

由于某些原因,Validation.en.resx没有对应的.en.Designer.cs文件.

如果我们对.en.resx文件进行修改,则不会为其生成设计器文件.不过,这些变化仍然有效.在我们的网站上,将文化设置为英语,展示了英语的价值观.看看我们的Git状态,似乎在其他地方没有.en.Designer.cs文件,我们的.gitignore文件也没有忽略它.

为了生成一个Validation.en.Designer.cs的文件,我try 过:

  • 禁用代码生成并将其重新启用为公共
  • 将VS2022与"运行自定义工具"操作配合使用
  • 在"生成资源"操作中使用Rider
  • 创建空白.resx/.en.resx文件并手动将值移入其中
  • 手动更新.csproj文件,以确保它与其他文件具有相同的ResX代码

唯一有效的方法是创建一个空的Validator.en.Designer.cs文件,该文件立即填充了正确的值.

然而,当团队成员对.en.resx文件进行更改时,.en.Designer文件不会更新,即使他们的更改在编译/运行应用程序时生效.然而,对默认.resx文件do的改变导致对.Designer.cs文件的改变.

那么,在我们的.en.resx文件之外,我们supposed会有一个.en.Designer.cs文件吗?或者,默认的.Designer.cs文件应该根据本地文件 Select 正确的.resx源文件,而我们的项目中只有额外的文件?

推荐答案

简短的回答是,没有,每个本地化的资源文件都没有设计器文件.

C#文件实际上并不包含resx文件的Value部分.相反,它会生成代码来查找资源文件中的值,这也包括与区域性相关的查找代码.您可以在主resx文件生成的设计器文件中看到这一点,C#代码中有一段代码说(为简洁起见,重新格式化):

public static global::System.Globalization.CultureInfo Culture {
    get { return resourceCulture; }
    set { resourceCulture = value; }
}

这意味着有内置的本地化支持,因此当您设置您的文化时:

Resources.Validation.Culture = new CultureInfo("en");

...然后引用本地化字符串(以Greeting为例):

Console.WriteLine(Resources.Validation.Greeting);

...它会自动 Select 合适的资源.如果未找到字符串,则默认为主resx文件.

示例

假设您有三个资源文件:

  • 主打:Validation.resx,包含(Anatid,Duck-translation here)
  • 中文:Validation.en.resx,包含(Anatid,Duck)
  • 日语:Validation.ja-JP.resx,包含(Anatid,カモ)

要使用它们,请执行以下操作:

foreach (string loc in new[] { "en", "ja-JP", "sr-Cyrl-RS" })
{
    Resources.Validation.Culture = new CultureInfo(loc);
    Console.WriteLine(Resources.Validation.Anatid);
}
/* Outputs:
Duck
カモ (Or ??. `chcp 932` if you really want to see katakana. Point is, it looks up the value.)
Duck-translation here
*/

对于附加功能,您可以按照列出的说明here进行操作,但这可能比您需要做的更多.

Csharp相关问答推荐

获取Windows和Linux上的下载文件夹

如何在Visual Studio中为C# spread操作符设置格式规则?

需要深入了解NpgSQL DateTimeOffset处理

ASP.NET MVC中创建视图的过滤器

如何循环遍历XML文档 node 以使用XSLT存储值

ASP.NET核心REST API返回一个非常大的数字

用C#调用由缓冲区指针参数组成的C API

在调整大小的控件上绘制

如何在WPF的树视图中显示一个对象的两个或多个属性,其中只有一个是分层项?

方法从数据表中只 Select 一个条件?

C#-VS2022:全局使用和保存时的代码清理

BlockingCollection T引发意外InvalidOperationException

确定System.Text.Json序列化中是否无法识别Type

如何比较C#中的L和ł(波兰字符)返回TRUE

为什么方法的值在SELECT方法中不会更改?

用于请求用户返回列表的C#Google API

实例化列表时的集合表达式是什么?

我想我必须手动使用res1(字符串形式的PowerShell哈希表)

根据运行时值获取泛型类型的字典

在c#中,使用Okta和Blazor时,LocalReDirect()陷入循环,出现错误&请求太多.