- 由 wyn_writer创建, 最后修改于十二月 08, 2022
1. 内容概述
Wyn 是一款国际化产品,界面支持多种语言,默认可以在en(英文)、pl(波兰文)、zh (中文简体)和 zh-TW(中文繁体)之间进行切换。
除了内置的四种语言之外, Wyn 还支持用户自己定制显示的语言。
2. 操作步骤
在后台语言包管理界面中可以看到,我们有四种内置的官方语言包。

我们可以基于这四种语言包进行定制化处理。然后上传到系统中进行使用。
第1步:首先下载一个语言包,比如中文包。

下载之后将压缩包解压,看到如下文件。

第2步:修改解压后的文件制作语言包。
其中manifest.txt 为声明文件,其中描述了语言包的信息。
需注意以下两点:
- 如下红色底纹中内容不要修改,其他内容请根据实际情况进行修改。
- 其中 LanguageCode (黄色底纹)为语言代码,其命名必须符合RFC4646规范、i18nnext 源代码规范且必须在微软官方DotNet Core中的Culture 列表中(详见本页下方内容)。
且该代码后续会用来在URL中标识本语言包,并用作语言包出现问题时的回退依据。

比如,我们仅将LanguageCode修改为zh-Hans-CN。

其他文件夹中的文件除了工程文件(language-resources.json)之外均为为语言资源文件,请按实际需要修改。
每个文件夹中包含的模块如下:
- gcef-identity-service :登录页面、重置密码页面、序列号注册页面等。
- gces-analysis:数据模型相关页面。
- gces-common:数据源、数据集、用户、组织、角色、生成令牌等页面。
- gces-dashboard:仪表板相关页面。
- gces-forguncy:填报相关页面。
- gces-reporting:报表相关页面。
- gces-server:其他,比如门户页面、后台管理页面、文档详情页面等。
全部修改完成后,将所有文件选中,压缩成.zip 格式。

第3步:在后台上传语言包。
注意
同一个 LanguageCode 的语言包仅能上传一个。

上传后语言包显示在右侧的自定义语言包栏目中,可以对其进行管理。

第4步:使用自定义语言包

有两种使用方式:
方式一:在个人偏好中设置语言。
语言名称为上传时定义的名称,该名称也将作为后续系统UI中对语言包的识别标志。

方式二:在URL中使用语言代码改变显示语言。
语言代码是上一步自定义语言包时定义的 LanguageCode,其规范符合RFC4646。
该代码用于在URL中修改系统的显示语言。
比如:http://localhost:51980/admin/configuration/portal?lng=zh-Hans-CN
3. 自定义语言包回退机制
为避免自定义语言包中出现遗漏或错误,我们做了一定的回退机制来保证系统的正常运行。
回退策略为按照 LanguageCode的名称一级一级往前回退,每种语言的回退策略由声明文件中的 LanguageCode 决定。
比如,本页示例中我们将LanguageCode 定义为了 zh-Hans-CN,那么当该语言包中的某个Key 的值出现问题(比如缺失)时,就会去掉最后面的CN,往前回退成zh-Hans语言包中的内容,再有问题时会进一步去掉Hans,回退成zh,也就是显示 zh 语言包中的内容。以保证最终总能显示出正确的内容。
我们也可以使用 window.i18next.languages 查询语言的回退顺序:

4. RFC4646规范和i18next 语言代码规则解读
在 Wyn 中 LanguageCode 除了遵循 RFC4646 国际规范之外,还必须遵循 i18next 语言代码规则。
只有遵循了 i18next 语言代码规则才可以保证语言包在系统中正常使用。
RFC4646 国际规范部分解读
以下是我们从RFC4646规范中提取的重要内容,帮助您快速熟悉规范。
组成
languagetag=language[−script][−region]∗[−variant]∗[−extension][−privateuse]
提示
1.所有子标签值均不区分大小写。虽然子标签不区分大小写,但是统一的格式有助于理解。RFC4646规范建议:
- 非language子标签的两位字母均采用大写。
- 非language子标签的4位字母均采用首字母大写,其他字母小写。
(在 i18next 源代码规范中对大小写规定进行了一定的补充说明,请进一步查看)
2. 所有子标签值都具有最长长度为8位的限制,严格不允许存在空格。
3. 中括号表示可省略,星号后的内容可有多个。
详解
Primary Language Subtag(主语言子标签)
- 表示一种被IANA认证通过的语种
- 语言代码的第一个子标签
- 不能被省略
- 格式与规则:
范围 | 规范 | 备注 |
|---|---|---|
2 characters | ||
3 characters | ||
'qaa'~'qtz' | reserved by ISO 639-2 | private use |
4 characters | reserved | possible future standardization |
5~8characters | discouraged | no examples |
'i' | used by some grandfathered tags | |
other | unallowed |
另外,主语言子标签还可以包含拓展语言子标签。
Extended Language Subtags(拓展语言子标签)
- 位置紧跟主语言子标签,在其他子标签之前,理解成为主语言子标签的一部分
- 最多可以拥有三个扩展语言子标签
- 拓展语言子标签的值不能被其他规范注册
5. 举例:
zh, en
Script Subtag(方言子标签)
- 用于区分语言书面形式和书写系统,最显著地作用就是标注书写显示或打印时语言是从左到右还是从右到左
- 必须紧跟主语言子标签或者扩展语言子标签,在其他子标签之前
- 可以省略,最多一个
- 不同语言对应有固定的方言子标签,例如Hans和Hant就是针对中文(zh),不能跟在其他主语言子标签之后
- 格式与规则:
6.举例:
script subtag: Hans(简体中文)、Hant(繁体中文)
primary language subtag+script subtag: zh-Hans、zh-Hant
Region Subtag(地区子标签)
- 用于标注与国家、地区相关的语言变体,一般只这种语言对该地区的特有表述做了定制化
- 地区子标签位于主语言子标签、扩展语言子标签和方言子标签之后,其他子标签之前
- 可以省略,最多一个
- 格式与规则:
范围 | 规范 | 备注 |
|---|---|---|
2 characters | 规范中ISO3166 Alpha-3不能使用 | |
3 digits | 部分可用 |
5. 举例
region subtag: TW(台湾省)、CH(瑞士)
primary language subtag+region subtag: zh-TW(台湾省使用的中文)、de-CH(瑞士使用的德语)
primary language subtag+script subtag+region subtag: zh-Hant-TW(台湾省使用的繁体中文)
Variant Subtag(变体子标签)
- 变体子标签用于表示语言的其他的、易于识别的变体,这些变体定义了一种语言或其方言,而其他可用的子标签没有涵盖这些变体。
- 变体子标签位于扩展子标签和私有用途子标签之前
- 可以没有,也可以有多个
- 每个变体都对应固定的主语言子标签,不同语言的变体子标签不能混用
- 格式与规则:
范围 | 规范 | 备注 |
|---|---|---|
>5characters | 没有规范 | 需要rfc4646规范进行注册 |
1digit+>3(character|digit) | 没有规范 | 需要rfc4646规范进行注册 |
6. 举例
variant subtag:1991(从1991年之后算起)
primary language subtag+variant subtag:de-1991(自1991年以后的规范德语)
Extension Subtag
- 扩展子标签提供了一种机制来扩展语言标记,以便在各种应用程序中使用
- 扩展子标签与前面的其他子标记之间由一个单字符子标记分隔,该字符不能为x
- 可以没有,也可以有多个
- 每个扩展子标记的长度必须在2至8个字符之间,且仅由字母或数字组成,每个子标记之间用一个'-'分隔。
- 格式与规则:
格式 | singleton-extension subtag |
|---|---|
singleton | 非x的单字符 |
extension subtag | 2~8characters |
其他 | 每个singleton之后必须跟至少一个extension subtag |
6. 举例
extention subtag:a-US、a-AM、b-CHRIS
primary subtag+extension subtag:zh-a-US、zh-a-US-AM-b-CHRIS
Private Use Subtag
- 私有使用子标签被用于通过私有协议来表示特定上下文中重要的语言差异
- 私有使用子标签必须放在语言标签的最后
- 私有使用子标与前面的定义的子标签之间有一个'x'字符分隔
- 举例:
private use subtag: x-AZE
primary language subtag+private use subtag: de-x-AZE
提示
- 简单说,RFC4646 文件规定,一种语言的标签应该按照如下方式排列:
language-script-region-variant-extension-privateuse
1. language:这部分就是ISO 639规定的代码,比如中文是zh。
2. script:表示变体,比如简体汉字是zh-Hans,繁体汉字是zh-Hant。
3. region:表示语言使用的地理区域,比如zh-Hans-CN就是中国大陆使用的简体中文。
4. variant:表示方言。
5. extension-privateuse:表示扩展用途和私有标识。
一般约定,language标签全部小写,region标签全部大写,script标签只有首字母大写。不同标签之间用连字号-链接。
- 下面列出一些与中文有关的语言标签。
zh-Hans 简体中文
zh-Hans-CN 大陆地区使用的简体中文
zh-Hans-HK 香港地区使用的简体中文
zh-Hans-MO 澳门使用的简体中文
zh-Hans-SG 新加坡使用的简体中文
zh-Hans-TW 台湾使用的简体中文
zh-Hant 繁体中文
zh-Hant-CN 大陆地区使用的繁体中文
zh-Hant-HK 香港地区使用的繁体中文
zh-Hant-MO 澳门使用的繁体中文
zh-Hant-SG 新加坡使用的繁体中文
zh-Hant-TW 台湾使用的繁体中文
i18next 语言代码规则
特殊值:hans、hant、lntn、cyrl、cans、mong、arab
具体规范:
1. 如果code被‘-’分为2部分:
a. 第一部分:
必须全部为小写;
b. 第二部分:
如果全小写后不在特殊值范围内,则第二部分需要全大写;
如果全小写后在特殊值范围内,则第二部分首字母大写
举例:zh-HANS(非法)应该为zh-Hans 、zh-tw(非法)应该为zh-TW
2. 如果code被‘-’分为3部分:
a. 第一部分:
必须全部为小写;
b. 第二部分:
如果全小写后在特殊值范围内,则第二部分首字母大写;
如果全小写后不在特殊值范围内:
且长度为2,则必须全部大写
且长度不为2,则大小写都可以
c. 第三部分:
如果全小写后在特殊值范围内,则第三部分首字母大写;
如果全小写后不在特殊值范围内:
且第一部分不为sgn,同时第三部分长度为2时,第三部分必须全大写
其他情况大小写都可以
3. 其他情况,大小写都可以
微软官方DotNet Core中的Culture 列表
微软官方对 Culture 的支持列表不是固定的,而是与计算机相关。
具体请参考如下链接中内容:
https://docs.microsoft.com/en-us/dotnet/api/system.globalization.cultureinfo?view=net-6.0#Custom
- 无标签