.resx 文件的每个变体是否应该生成自己的 Designer.cs 文件?

Are each variations of a .resx file supposed to generate their own Designer.cs file?

提问人:micka190 提问时间:10/24/2023 最后编辑:General Grievancemicka190 更新时间:10/25/2023 访问量:49

问:

我无法找到太多关于文件如何与官方文档中的文件相关的工作方式,并且谷歌搜索这种情况并没有产生任何有用的信息。.Designer.cs.resx


我目前正在从事的项目需要支持多种语言。因此,它具有本地化文件:

  • Localization.resx
  • Localization.zh.resx
  • 验证.resx
  • Validation.zh.resx

注意:英语不是默认语言。

我注意到,除了文件之外,我们还有一些文件。具体来说,我们有以下几种:.resxDesigner.cs

  • 本地化设计器 .cs
  • 本地化.en.Designer,.cs
  • 验证.设计器 .cs

由于某种原因,没有相应的文件。Validation.en.resx.en.Designer.cs

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

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

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

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

但是,当团队成员对文件进行更改时,文件不会更新,即使他们的更改在编译/运行应用时有效。但是,对默认文件的更改确实会导致对文件的更改。.en.resx.en.Designer.resx.Designer.cs

那么我们应该在文件旁边有一个文件吗?还是默认文件应该处理根据本地选择正确的源,而我们的项目中只有额外的文件?.en.Designer.cs.en.resx.Designer.cs.resx

C# 代码生成 Rider Resx

评论

0赞 micka190 10/24/2023
我已经尝试过两者和 .“生成操作”设置为“嵌入资源”ResXFileCodeGeneratorPublicResXFileCodeGenerator
0赞 General Grievance 10/24/2023
奇怪。如果我创建一个新的 resx 文件,并在文件名中添加额外的内容,我可以在 2019 年重现此文件。我注意到在创建时它没有为自定义工具填写任何内容,也没有设计器文件。将其设置为自动为我生成文件。编辑:啊,我明白了。对我来说,当我保存时它也不会更新。.enResXFileCodeGenerator
0赞 micka190 10/24/2023
您知道通常是否需要该文件才能正常工作吗?它似乎对我有用,但我在网上读到的所有内容似乎都暗示它不应该。.en.Designer.cs
0赞 General Grievance 10/24/2023
对我来说,在 2019 年,它只会生成错误的代码(它也不会在现有资源文件中获取任何内容)。我认为在 C# 中将文件名解析为有效的类名可能遇到麻烦。您可以重命名文件吗?像 ?.Validation_EN
0赞 micka190 10/24/2023
对不起,回复晚了。我可以用 后缀 ,但本地化不再起作用了。这与我在文档中看到的内容一致(它总是提到格式)。_enthe .en.resx

答:

2赞 General Grievance 10/24/2023 #1

简短的回答是,不,每个本地化的资源文件都没有 Designer 文件。

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

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);

...它将自动选择适当的资源。如果未找到字符串,则默认为主 resx 文件。

假设您有三个资源文件:

  • 主要一个:Validation.resx,包含 (,AnatidDuck-translation here)
  • 英语:Validation.en.resx,包含 (,AnatidDuck)
  • 日语: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
*/

对于其他功能,您可以按照此处列出的说明进行操作,但这可能超出了您需要做的范围。

评论

1赞 micka190 10/25/2023
似乎我们的困惑是由于 Rider 自动生成一个文件,如果我们通过右键单击文件夹创建一个新文件。在 rider 中执行此操作的“正确”方法是通过 Localization Manager 窗口,该窗口不会创建 Designer 文件。我们最终在某个时候得到了一些额外的 Designer 文件,Rider 偶尔会更新这些文件。但是,是的,删除 Designer 文件似乎有效(只要它们对应的类未被使用)。谢谢!.en.Designer.cs.resx.en.Designer.cs