> ## Documentation Index
> Fetch the complete documentation index at: https://docs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Intelligent Delivery：语言修饰符

> Intelligent Delivery：语言修饰符

语言修饰符声明 chunk 中内容适用的语言。如果你在安装包中的 chunk 上标记了一个或多个语言修饰符，安装时主机会：

1. 判断哪些 chunk 与用户所需语言以及包中语言的匹配度最佳

2. 只下载标记为该语言的 chunk 以及没有语言修饰符的 chunk

如果找不到完全匹配，可用语言修饰符声明回退语言。

## 感知语言的安装

Intelligent Delivery 语言修饰符会为内容打标签，使包中只有一部分本地化资源被安装到主机。这为选择数字化安装的客户节省带宽，为所有客户节省硬盘空间。

要表示内容特定于一种或多种语言，请在 layout.xml 文件的 chunk 上添加 `Languages` 属性。以下示例显示的 chunk 只会安装到已确定法语与其运行时语言最匹配的主机上。此 chunk 会安装到语言设置为加拿大法语 (fr-CA) 或法语 (fr-FR) 的主机上。没有语言修饰符的 chunk 会安装到所有主机，除非被其他修饰符（例如设备类型）排除。

```xml theme={null}
<Chunk Id="1001" Languages="fr">
    <FileGroup DestinationPath="\Data\Maps\X1\fr" SourcePath="Y:\Maps\Level1\X1\fr" Include="*.map"/>
<Chunk>  
```

## 判断用户所选语言

使用 [XPackageGetUserLocale](https://docs.xbox.com/zh-CN/reference/system/xpackage/functions/xpackagegetuserlocale.md) 函数查询操作系统确定的、与用户系统上游戏安装最匹配的区域设置名称。

返回的区域设置由某种算法决定，该算法大致执行以下操作，以根据关于用户的所有可用数据确定最佳匹配。

1. 生成与用户当前语言设置最匹配的语言列表。
2. 生成 MicrosoftGame.config/清单中所声明的所有语言列表。
3. 生成当前已安装且在包中可用的所有语言列表。
4. 清单中声明的第一个语言是语言选择的最终回退。
5. 结果始终为 MicrosoftGame.config/清单中声明的某个语言，或者如果未声明任何语言，则为用户语言。

> [!NOTE]
>
> 所用算法可能随时间变化，未必与上述描述完全一致。

[XPackageGetUserLocale](https://docs.xbox.com/zh-CN/reference/system/xpackage/functions/xpackagegetuserlocale.md) 返回的语言未必与 **GetUserDefaultLocaleName** 或其他 NLS（国家语言支持）及本地化相关 Win32 API 函数返回的语言一致，应优先使用它。

有关本地化以及 MicrosoftGame.config 中语言设置的详细信息，请参阅 National Language Support API 和 Localization GDK 示例。

> [!NOTE]
>
> 你必须确保 layout.xml 文件中引用的所有语言也存在于 MicrosoftGame.config 文件中，否则 MakePkg 工具会报错。

## 用户切换到不同语言后启动游戏时的行为

如果用户启动你的游戏时，最适合用户的语言已作为包的一部分可用但尚未安装（例如用户在游戏未运行时切换了语言），下次启动游戏时会向他们提示安装最佳匹配语言的机会。

> [!NOTE]
>
> 如果用户选择安装某种语言，*在原来选择的已安装语言下*仍可运行游戏，直到新语言下载完成。我们假设如果他们最初使用其他语言，很可能能理解该语言，并可能希望在等待*首选*语言下载期间继续游玩。
>
> 请注意，此行为让许多开发者感到困惑。测试时应通过在启动游戏前监视游戏安装队列来验证新语言是否已完成安装。如果用户选择安装某种语言，[XPackageGetUserLocale](https://docs.xbox.com/zh-CN/reference/system/xpackage/functions/xpackagegetuserlocale.md) 在其下载完成前不会报告该语言。

## 在游戏中提供其他语言

有些游戏允许用户（在首次游玩过程中或通过菜单）在不考虑主机语言设置的情况下选择语言。安装时，Intelligent Delivery 根据主机的语言设置以及 layout.xml 文件中指定的语言，仅为特定包安装一种语言。你的游戏默认应以此语言渲染。

此外，XBOX 外壳允许安装辅助语言。你可通过自己的 UI 从游戏中公开此选项。游戏可通过调用 [XPackageEnumeratePackages](https://docs.xbox.com/zh-CN/reference/system/xpackage/functions/xpackageenumeratepackages.md) 方法确定可安装的语言。根据所选语言和安装来源，安装可能来自磁盘或 XBOX Live。当用户选择除默认之外的语言时，游戏应调用 [XPackageFindChunkAvailability](https://docs.xbox.com/zh-CN/reference/system/xpackage/functions/xpackagefindchunkavailability.md) 方法确定标记了该语言的 chunk 的安装状态。该 API 返回一个 [XPackageChunkAvailability](https://docs.xbox.com/zh-CN/reference/system/xpackage/enums/xpackagechunkavailability.md) 对象，值如下表所示。

| 状态 | 说明 |
| - | - |
| Ready | chunk 已安装且可读取。 |
| Pending | chunk 尚未安装，但将会安装。 |
| Installable | chunk 不会被安装，但可下载。要安装资源，请调用 [XPackageInstallChunks](https://docs.xbox.com/zh-CN/reference/system/xpackage/functions/xpackageinstallchunks.md) 方法并传入相应的修饰符。 |
| Unavailable | 无法下载 chunk。 |

如果 [XPackageChunkAvailability](https://docs.xbox.com/zh-CN/reference/system/xpackage/enums/xpackagechunkavailability.md) 返回 *Unavailable*，则表示所指定语言在联机或磁盘上的游戏版本中均不可用。

如果用户选择安装一种可用但当前未安装的语言，游戏应调用 [XPackageInstallChunks](https://docs.xbox.com/zh-CN/reference/system/xpackage/functions/xpackageinstallchunks.md) 方法，并传入一个指定要安装语言的 [XPackageChunkSelector](https://docs.xbox.com/zh-CN/reference/system/xpackage/structs/xpackagechunkselector.md) 对象。此调用会显示系统渲染的 UI，提示用户接受额外的下载和安装。游戏可使用返回的安装监视器句柄，配合 [XPackageGetInstallationProgress](https://docs.xbox.com/zh-CN/reference/system/xpackage/functions/xpackagegetinstallationprogress.md) 方法或 [XPackageRegisterInstallationProgressChanged](https://docs.xbox.com/zh-CN/reference/system/xpackage/functions/xpackageregisterinstallationprogresschanged.md) 方法监视新数据的下载和安装，或判断用户是否拒绝了额外的安装。

游戏可通过调用 [XPackageUninstallChunks](https://docs.xbox.com/zh-CN/reference/system/xpackage/functions/xpackageuninstallchunks.md) 方法卸载语言。如果只安装了一种语言，此调用会被静默忽略。

## 与 XBOX One 软件开发工具包的差异

如果你在使用 XBOX One 软件开发工具包时曾使用过 Intelligent Delivery，请注意语言的声明与映射方式已发生变化。若在 chunk 上添加了 `Languages` 属性，该语言也必须在 MicrosoftGame.config 中声明。判断为某语言安装哪些 chunk 时，现在基于最佳匹配语言的单一值。例如，如果你的布局文件中包含一个标记为 'en' 的 chunk 和另一个标记为 'en-US' 的 chunk，则当用户语言设置为 'en-US' 时，'en' chunk 不会被安装。若希望保留原来的行为，请在 chunk 上声明其应安装的所有语言：en;en-US。

## 参考 API 文档

* [XPackage（API 目录）](https://docs.xbox.com/zh-CN/reference/system/xpackage/xpackage_members.md)
  * 函数
    * [XPackageGetUserLocale](https://docs.xbox.com/zh-CN/reference/system/xpackage/functions/xpackagegetuserlocale.md)
    * [XPackageEnumeratePackages](https://docs.xbox.com/zh-CN/reference/system/xpackage/functions/xpackageenumeratepackages.md)
    * [XPackageFindChunkAvailability](https://docs.xbox.com/zh-CN/reference/system/xpackage/functions/xpackagefindchunkavailability.md)
    * [XPackageInstallChunks](https://docs.xbox.com/zh-CN/reference/system/xpackage/functions/xpackageinstallchunks.md)
    * [XPackageGetInstallationProgress](https://docs.xbox.com/zh-CN/reference/system/xpackage/functions/xpackagegetinstallationprogress.md)
    * [XPackageRegisterInstallationProgressChanged](https://docs.xbox.com/zh-CN/reference/system/xpackage/functions/xpackageregisterinstallationprogresschanged.md)
    * [XPackageUninstallChunks](https://docs.xbox.com/zh-CN/reference/system/xpackage/functions/xpackageuninstallchunks.md)
  * 结构体
    * [XPackageChunkSelector](https://docs.xbox.com/zh-CN/reference/system/xpackage/structs/xpackagechunkselector.md)

## 另请参阅

[Intelligent Delivery](https://docs.xbox.com/zh-CN/build/core-features/common/packaging/overviews/intelligentdelivery.md)


## Related topics

- [Intelligent Delivery](https://docs.xbox.com/zh-CN/build/core-features/common/packaging/overviews/intelligentdelivery.md)
- [Intelligent Delivery：设备修饰符](https://docs.xbox.com/zh-CN/build/core-features/common/packaging/intelligentdelivery-device.md)
- [Intelligent Delivery：自定义标签修饰符](https://docs.xbox.com/zh-CN/build/core-features/common/packaging/intelligentdelivery-custom.md)
- [Intelligent Delivery：功能和配方](https://docs.xbox.com/zh-CN/build/core-features/common/packaging/intelligentdelivery-features-recipes.md)
- [针对 PC 的 MSIXVC2 打包入门](https://docs.xbox.com/zh-CN/build/core-features/common/packaging/overviews/packaging-getting-started-for-PC-msixvc2.md)
