本地化

组件显示的每个标签都来自扩展组件的消息包:消息输入框的占位符、其按钮的无障碍名称、错误横幅及其 Retry、代码块的复制和换行操作、长消息的 Show more 切换按钮。对这些文本可以有两种方式进行本地化,并可以同时使用。

全局修改

扩展组件的键值按组件进行分组:

键族 包含

aiChat.i18n.*

聊天组件答案生成过程全生命周期的文本,以及屏幕阅读器。

aiMessageInput.i18n.*

消息输入框:占位符、发送、停止、附件,以及附件被拒绝时显示的消息。

aiMessageList.i18n.*

消息列表:错误横幅、重试、滚动到底部、复制,以及折叠状态切换按钮。

aiCodeBlock.i18n.*

代码块:复制、已复制,以及两个换行标签。

在应用程序自己的消息包中重新定义键值可以全局覆盖扩展组件中的配置:

aiChat.i18n.generating=Generating the answer
aiMessageInput.i18n.send=Send the message

这也是扩展组件的翻译方式:在每个语言地区的消息包中定义覆盖的键值。

修改单个聊天

组件 XML 内部的 i18n 元素可以修改单个实例。在 aiChat 上,与元素树对应:元素本身的属性修改聊天组件的文本,内部的 messageInput、messageList 和 codeBlock 元素修改组件的各个部分:

XML
<aichat:aiChat id="chat" width="100%" height="100%">
    <aichat:i18n generating="msg://chat.generating"
                 failed="msg://chat.failed">
        <aichat:messageInput placeholder="msg://chat.placeholder"
                             send="msg://chat.send"/>
        <aichat:messageList retry="msg://chat.retry"
                            showMore="msg://chat.showMore">
            <aichat:codeBlock copy="msg://chat.codeCopy"
                              wrapOn="msg://chat.codeWrapOn"/>
        </aichat:messageList>
    </aichat:i18n>
</aichat:aiChat>
消息包
com.company.demo.view.localization/chat.generating=Working on it
com.company.demo.view.localization/chat.failed=That did not work
com.company.demo.view.localization/chat.placeholder=Ask about this ticket
com.company.demo.view.localization/chat.send=Send the question
com.company.demo.view.localization/chat.retry=Try again
com.company.demo.view.localization/chat.showMore=Read the whole question
com.company.demo.view.localization/chat.codeCopy=Copy this snippet
com.company.demo.view.localization/chat.codeWrapOn=Wrap the lines

当这些组件单独使用时,也可以使用同样的配置。参见 aiMessageInput、aiMessageList 和 aiCodeBlock。

优先级

这两种机制中,更具体的配置具有更高的优先级:

  1. 扩展组件的消息包提供每个标签的基础文本。

  2. 在应用程序的消息包中重新定义的键会在所有地方覆盖。

  3. 在组件内部 i18n 元素上的属性会为特定的实例覆盖。

元素是覆盖而不是替换:未声明的标签保留来自下层的值,而空的 i18n 元素不会改变任何内容。因此,完全未声明 i18n 的聊天组件仍会显示应用程序范围的覆盖,而声明了 i18n 的聊天对于其未提及的每个标签也会显示应用程序的配置。