中文资源不适用于 .Net 3.5
Chinese resources don't work with .Net 3.5
使用 .Net 3.5 时,我们的中文本地化资源存在一个奇怪的错误。此问题会影响控制台应用程序和 Windows 表单应用程序,并且很容易重现。
基本上没有使用中文资源,而是使用其他资源(例如法语和英语)。此外,如果我们使用 .Net 4.x.
它工作正常
在 Windows 7 和 Windows 10 上出错(我没试过 Windows 8.x,但我预计那也会出错)。
使用控制台应用程序很容易重现:
- 创建默认的 .Net 3.5 控制台应用程序。
- 添加默认资源文件,"Resources.resx"并向其添加一对name/value:测试,我是英语
- 添加一个"Resources.fr.resx"文件并向其中添加一个name/value对:测试,我是法国人
- 添加一个"Resources.zh.resx"文件并向其中添加一个name/value对:测试,我是中国人
- 将下面的代码添加到
Main()
方法
代码:
System.Threading.Thread.CurrentThread.CurrentUICulture = System.Threading.Thread.CurrentThread.CurrentCulture;
Console.WriteLine(System.Threading.Thread.CurrentThread.CurrentUICulture);
Console.WriteLine(ConsoleApplication1.Properties.Resources.Test);
(第一行只是为了方便我们可以在非中文系统上测试这段代码。我们可以在 运行ning 在实际的中文系统上删除该行,因为 CurrentUICulture 语言环境正在不用修改就已经是中文了-错误仍然存在。)
在控制面板中 |区域,将格式更改为英语(美国)和运行程序。输出将是:
en-US
I'm English
现在将区域格式更改为 French(法国) 和 运行 程序。输出将是:
fr-FR
I'm French
现在将区域格式更改为中文(简体,中国)和运行程序。输出将是:
zh-CN
I'm English
请注意,它不起作用。
现在更改项目属性以构建 .Net 4 或更高版本,不更改任何其他内容,然后重新 运行 它。现在输出是:
zh-CN
I'm Chinese
所以它适用于 .Net 4!
我的问题是:
- 其他人可以重现吗?
- 这是已知错误吗?
- 有解决办法吗?
感谢 Hans 的评论(这是正确的答案)我现在有了完整的答案。
似乎在 .Net 3.5 中,"zh" 未被识别为中性的中国文化。
在 .Net 4.x 中,"zh" 被认为是中性的中国文化。
我们通过比较the .Net 3.5 documentation for CultureInfo.IsNeutralCulture
with the .Net 4.0 documentation就可以看出区别了。
.Net 3.5 文档列出了以下中性和特定资源名称:
zh-CHS Chinese (Simplified) : neutral
zh-TW Chinese (Taiwan) : specific
zh-CN Chinese (People's Republic of China) : specific
zh-HK Chinese (Hong Kong S.A.R.) : specific
zh-SG Chinese (Singapore) : specific
zh-MO Chinese (Macao S.A.R.) : specific
zh-CHT Chinese (Traditional) : neutral
.Net 4.0 文档更改为:
zh-Hans Chinese (Simplified) : neutral
zh-TW Chinese (Traditional, Taiwan) : specific
zh-CN Chinese (Simplified, PRC) : specific
zh-HK Chinese (Traditional, Hong Kong S.A.R.) : specific
zh-SG Chinese (Simplified, Singapore) : specific
zh-MO Chinese (Traditional, Macao S.A.R.) : specific
zh Chinese : neutral
zh-Hant Chinese (Traditional) : neutral
zh-CHS Chinese (Simplified) Legacy : neutral
zh-CHT Chinese (Traditional) Legacy : neutral
我们可以看到.Net 4.0已经获得了"zh"中性的中国文化。
所以这不是 .Net 3.5 中的错误,而是记录在案的功能。
如果你需要同时兼容.Net 3.5和.Net 4.x 看来你需要使用"zh-CHS"(简体中文),虽然不清楚这是否会无限期地继续工作。
使用 .Net 3.5 时,我们的中文本地化资源存在一个奇怪的错误。此问题会影响控制台应用程序和 Windows 表单应用程序,并且很容易重现。
基本上没有使用中文资源,而是使用其他资源(例如法语和英语)。此外,如果我们使用 .Net 4.x.
它工作正常在 Windows 7 和 Windows 10 上出错(我没试过 Windows 8.x,但我预计那也会出错)。
使用控制台应用程序很容易重现:
- 创建默认的 .Net 3.5 控制台应用程序。
- 添加默认资源文件,"Resources.resx"并向其添加一对name/value:测试,我是英语
- 添加一个"Resources.fr.resx"文件并向其中添加一个name/value对:测试,我是法国人
- 添加一个"Resources.zh.resx"文件并向其中添加一个name/value对:测试,我是中国人
- 将下面的代码添加到
Main()
方法
代码:
System.Threading.Thread.CurrentThread.CurrentUICulture = System.Threading.Thread.CurrentThread.CurrentCulture;
Console.WriteLine(System.Threading.Thread.CurrentThread.CurrentUICulture);
Console.WriteLine(ConsoleApplication1.Properties.Resources.Test);
(第一行只是为了方便我们可以在非中文系统上测试这段代码。我们可以在 运行ning 在实际的中文系统上删除该行,因为 CurrentUICulture 语言环境正在不用修改就已经是中文了-错误仍然存在。)
在控制面板中 |区域,将格式更改为英语(美国)和运行程序。输出将是:
en-US
I'm English
现在将区域格式更改为 French(法国) 和 运行 程序。输出将是:
fr-FR
I'm French
现在将区域格式更改为中文(简体,中国)和运行程序。输出将是:
zh-CN
I'm English
请注意,它不起作用。
现在更改项目属性以构建 .Net 4 或更高版本,不更改任何其他内容,然后重新 运行 它。现在输出是:
zh-CN
I'm Chinese
所以它适用于 .Net 4!
我的问题是:
- 其他人可以重现吗?
- 这是已知错误吗?
- 有解决办法吗?
感谢 Hans 的评论(这是正确的答案)我现在有了完整的答案。
似乎在 .Net 3.5 中,"zh" 未被识别为中性的中国文化。
在 .Net 4.x 中,"zh" 被认为是中性的中国文化。
我们通过比较the .Net 3.5 documentation for CultureInfo.IsNeutralCulture
with the .Net 4.0 documentation就可以看出区别了。
.Net 3.5 文档列出了以下中性和特定资源名称:
zh-CHS Chinese (Simplified) : neutral
zh-TW Chinese (Taiwan) : specific
zh-CN Chinese (People's Republic of China) : specific
zh-HK Chinese (Hong Kong S.A.R.) : specific
zh-SG Chinese (Singapore) : specific
zh-MO Chinese (Macao S.A.R.) : specific
zh-CHT Chinese (Traditional) : neutral
.Net 4.0 文档更改为:
zh-Hans Chinese (Simplified) : neutral
zh-TW Chinese (Traditional, Taiwan) : specific
zh-CN Chinese (Simplified, PRC) : specific
zh-HK Chinese (Traditional, Hong Kong S.A.R.) : specific
zh-SG Chinese (Simplified, Singapore) : specific
zh-MO Chinese (Traditional, Macao S.A.R.) : specific
zh Chinese : neutral
zh-Hant Chinese (Traditional) : neutral
zh-CHS Chinese (Simplified) Legacy : neutral
zh-CHT Chinese (Traditional) Legacy : neutral
我们可以看到.Net 4.0已经获得了"zh"中性的中国文化。
所以这不是 .Net 3.5 中的错误,而是记录在案的功能。
如果你需要同时兼容.Net 3.5和.Net 4.x 看来你需要使用"zh-CHS"(简体中文),虽然不清楚这是否会无限期地继续工作。