如果我不需要支持特定于区域设置的变体,是否可以仅对中文使用 zh-Hans/zh-Hant resx 文件?



背景
我们有一个旧的webforms应用程序,并且我们没有使用我所知道的任何自定义语言/全球化代码。我们正在将resx文件用于特定于区域性的资源。对于中文,我们目前有4resx文件:zh、zh-cn、zh-hans和zh-hant。为了简单起见,我希望只配对到2:zh-hans和zh-hant。我们不打算支持任何特定于语言环境的变体;只有通用的简体中文和通用的繁体中文。

问题

  1. 我的主要问题是:在任何情况下,我都需要拥有超过zh-hans或zh-hant的中文文件吗*不需要支持任何特定于语言环境的变体

    基本上,我需要保证,如果用户使用zhzh-cnzh-sg语言代码浏览我们的网站,他们将从zhon-hans文件中获得资源,如果他们使用zh-twzh-hkzh-mo浏览,他们将在zhon-hant中获得资源。这些是我所知道的唯一的中文代码,但如果还有其他代码,它们也应该包含在这里——基本上是说中文的用户,他们的浏览器设置为任何中文,应该看到合适的简体中文或繁体中文——绝对不会看到英文

    到目前为止,我的测试似乎表明,是的,.NET正确地解决了这些问题,但我想确保没有遗漏任何隐藏或罕见的场景。

  2. 我知道zh-hans和zh-hant代码有点新,被认为是"父母"文化。我也知道旧的通用父代码是zh-chs和zh-cht是否有旧的浏览器允许选择这些zh-chs/zh-cht代码,如果是,.NET还会适当地解决它们吗

  3. 我不完全确定.NET是如何解析正确的资源文件的,所以如果有人能给我指明正确的方向,比如涉及哪些类/命名空间,那也太好了。


资源
简体中文和繁体中文的语言代码
IETF语言标签

答案是否定的——你不能只有zh-hans/zh-hant。因为,如果你这样做了,并且你用浏览器传递了基本的zh代码,它将不会自动解析为zh-hans或zh-hant-resx文件。

原因是一种叫做"资源回退过程"的东西。

基本上,.NET通过层次结构解析资源。它将从请求的区域性代码开始,如果该特定区域性代码的resx不存在,它将开始向上移动,搜索具有resx的下一个区域性代码。但是,它从不向下传播,只向上传播。


以下是zh-sg[新加坡]的层次结构示例:

  1. 不变量
  2. zh
  3. zh-Hans
  4. zh-chs(遗留通用代码)
  5. zh-sg(特定于区域设置的代码)

所以首先它寻找zh-sg。如果没有zh-sg的资源文件,它将查找zh-chs。如果没有zh-chs的资源文件,它将查找zh-Hans。等等

只有zh-Hans和zh-Hant适用于所有特定于区域设置的代码,如zh-sg、zh-tw等。一些浏览器允许您选择通用简化(zh-Hans)或通用繁体(zh-Hant),显然它也适用于这些场景。唯一不适用于的情况是,在请求中选择并传递了基本中文zh。在这种情况下,如果zh不存在,它看起来的下一个地方就是不变文化——在这种情况中,它返回英文文本——这显然不是我们想要的。

那么,我的解决方案是,对于我的2个代码,将其配对为基数zhzh-Hant。那么,基本zh就是我的包含简体文本的文件,zh-Hant当然是我的包含繁体文本的文件。我本可以用另一种方式来做(让zh包含传统文本,并使用zh-Hans表示简体),但实际上,我找不到关于基本zh应该代表什么的指导方针。它应该是简化的,还是传统的?我怀疑这在很大程度上是一个偏好问题。对几个流行网站的快速搜索显示,在大多数情况下,对基本zh的请求会产生谷歌翻译识别为简体的文本。在少数情况下,它确实产生了传统。但是,我同意大多数人似乎正在做的事情。