可通过两种方法创建库的本地化版本:
- 将所有本地化资源程序集包含在单个包中。
- 按照一组严格的约定创建单独的本地化卫星包。
这两种方法都有其优点和缺点,如以下部分所述。
单个包中的本地化资源程序集
在单个包中包含本地化资源程序集通常是最简单的方法。 为此,请在 lib 中为软件包默认语言(假定为 en-us)以外的受支持语言创建文件夹。 在这些文件夹中,可以放置资源程序集和本地化的 IntelliSense XML 文件。
例如,以下文件夹结构支持德语(de)、意大利语(it)、日语(ja)、俄语(ru)、中文(简体中文)(zh-Hans)和中文(繁体中文)(zh-Hant):
lib
└───net40
│ Contoso.Utilities.dll
│ Contoso.Utilities.xml
│
├───de
│ Contoso.Utilities.resources.dll
│ Contoso.Utilities.xml
│
├───it
│ Contoso.Utilities.resources.dll
│ Contoso.Utilities.xml
│
├───ja
│ Contoso.Utilities.resources.dll
│ Contoso.Utilities.xml
│
├───ru
│ Contoso.Utilities.resources.dll
│ Contoso.Utilities.xml
│
├───zh-Hans
│ Contoso.Utilities.resources.dll
│ Contoso.Utilities.xml
│
└───zh-Hant
Contoso.Utilities.resources.dll
Contoso.Utilities.xml
可以看到,语言都列在目标框架文件夹下 net40 。 如果您 支持多个框架,那么在每个变体下都有一个文件夹。
在设置好这些文件夹后,引用 .nuspec 中的所有文件。
<?xml version="1.0"?>
<package>
<metadata>...
</metadata>
<files>
<file src="lib\**" target="lib" />
</files>
</package>
使用此方法的一个示例包是 Microsoft.Data.OData 5.4.0。
优点和缺点(本地化的资源程序集)
将单个包中的所有语言捆绑在一起有几个缺点:
-
共享元数据:由于 NuGet 包只能包含单个
.nuspec文件,因此只能为单个语言提供元数据。 也就是说,NuGet 不支持本地化元数据。 - 包大小:根据支持的语言数量,库可能会变得很大,这会减缓包的安装和还原速度。
- 同时发布:将本地化文件捆绑到单个包中需要同时释放该包中的所有资产,而不是能够单独发布每个本地化。 此外,任何本地化更新都需要整个包的新版本。
但是,它也有一些好处:
- 简单性:包使用者在单个安装中获取所有支持的语言,而无需单独安装每种语言。 单个包在 nuget.org 上也更容易找到。
- 耦合版本:由于所有资源程序集都与主程序集位于同一个包中,因此它们都共享相同的版本号,并且没有错误分离的风险。
本地化卫星包
与 .NET Framework 如何支持附属程序集类似,此方法将本地化资源和 IntelliSense XML 文件分成附属包。
为此,主包使用命名约定 {identifier}.{version}.nupkg ,并包含默认语言的程序集(如 en-US)。 例如, ContosoUtilities.1.0.0.nupkg 将包含以下结构:
lib
└───net40
ContosoUtilities.dll
ContosoUtilities.xml
卫星程序集随后使用命名约定 {identifier}.{language}.{version}.nupkg,例如 ContosoUtilities.de.1.0.0.nupkg。 标识符 必须与 主包的标识符完全匹配。
由于这是一个单独的包,因此它 .nuspec 有自己的文件,其中包含本地化的元数据。 请注意,该.nuspec语言必须与文件名中使用的语言匹配。
附属程序集 还必须 使用 [] 版本表示法将主包的确切版本声明为依赖项(请参阅 包版本控制)。 例如,ContosoUtilities.de.1.0.0.nupkg 必须声明对ContosoUtilities.1.0.0.nupkg的依赖,使用[1.0.0]符号。 附属包的版本号当然可以与主包不同。
然后,卫星包的结构必须在与包文件名中的 {language} 相匹配的子文件夹中包括资源程序集和 XML IntelliSense 文件。
lib
└───net40
└───de
ContosoUtilities.resources.dll
ContosoUtilities.xml
注意:除非需要特定的语言变体 ja-JP,请始终使用高级语言标识符,例如 ja。
在卫星程序集里,NuGet 将仅识别文件夹中的那些文件,该文件夹的名称与{language}文件名匹配。 将忽略所有其他项。
满足所有这些约定后,NuGet 会将包识别为附属包,并将本地化文件安装到主包的文件夹 lib 中,就好像它们最初捆绑在一起一样。 卸载卫星包会从同一文件夹中删除其文件。
对于每种受支持的语言,您可以以相同的方式创建附加的卫星程序集。 例如,检查 ASP.NET MVC 包集:
- Microsoft.AspNet.Mvc (英语主要)
- Microsoft.AspNet.Mvc.de (德语)
- Microsoft.AspNet.Mvc.ja (日语)
- Microsoft.AspNet.Mvc.zh-Hans (简体中文)
- Microsoft.AspNet.Mvc.zh-Hant (繁体中文)
所需约定摘要
- 主包必须命名
{identifier}.{version}.nupkg - 卫星包必须命名
{identifier}.{language}.{version}.nupkg - 附属包
.nuspec必须指定其语言以匹配文件名。 - 卫星包必须在其
.nuspec文件中使用 [] 符号声明对主程序包的确切版本的依赖。 不支持该范围。 - 卫星包必须将文件放在与文件名完全匹配的
lib\[{framework}\]{language}文件夹中{language}。
优点和缺点(卫星套餐)
使用卫星包具有以下优势:
- 包大小:将主要包的总体占用空间降到最低,使用者只会产生要使用的每种语言的成本。
-
单独的元数据:每个卫星包都有自己的
.nuspec文件,因此拥有自己的本地化元数据。 这可以让某些用户使用本地化术语搜索 nuget.org 更容易找到软件包。 - 分离版本:卫星程序集可以随着时间的推移而发布,而不是一次性发布,从而让你能够分散本地化工作。
不过,卫星包有它自己的一些缺点:
- 混乱:与单个包相反,多个包可能导致 nuget.org 上搜索结果的混乱,并在 Visual Studio 项目中产生很长的引用列表。
- 严格的约定。 卫星包必须严格遵循约定,否则本地化版本将无法被正确识别。
- 版本控制:每个附属包必须对主包具有确切的版本依赖关系。 这意味着,即使资源未更改,更新主包也可能需要更新所有附属包。