管理中心
您当前正在浏览新版开发者文档中心,目录分类和层级有所调整。点击左侧当前文档分类名称前的“☰”图标,可切换文档分类。 了解新版目录
指南与API参考指南应用框架ArkUI(方舟UI框架)UI开发 (ArkTS声明式开发范式)UI国际化

UI国际化

本文介绍如何实现应用程序UI界面的国际化,包含资源配置和镜像布局,关于应用适配国际化的详细参考,请参考Localization Kit(本地化开发服务)。

利用资源限定词配置国际化资源

在开发阶段,通过DevEco Studio,可以为应用在对应语言和地区的资源限定词目录下配置不同的资源,来实现UI国际化。详细介绍请参考资源分类与访问。

使用镜像能力

不同国家对文本对齐方式和读取顺序有所不同,例如英语采用从左到右的顺序,阿拉伯语和希腊语则采用从右到左(RTL)的顺序。为满足不同用户的阅读习惯,ArkUI提供了镜像能力。在特定情况下将显示内容在X轴上进行镜像反转,由从左到右显示变成从右到左显示。

展开
镜像前 镜像后

当组件满足以下任意条件时,镜像能力生效:

  1. 组件的direction属性设置为Direction.Rtl。

  2. 组件的direction属性设置为Direction.Auto,且当前的系统语言(如维吾尔语)的阅读习惯是从右向左。

基本概念

  • LTR:顺序为从左到右。
  • RTL:顺序为从右到左。

使用约束

ArkUI 如下能力已默认适配镜像:

但如下三种场景还需要进行适配:

  1. 界面布局、边框设置:关于方向类的通用属性,如果需要支持镜像能力,使用泛化的方向指示词 start/end入参类型替换 left/right、x/y等绝对方向指示词的入参类型,来表示自适应镜像能力。

  2. Canvas组件只支持文本绘制的镜像能力。

  3. XComponent组件不支持组件镜像能力。

界面布局和边框设置

目前,以下三类通用属性需要使用新入参类型适配:

位置设置:position、markAnchor、offset、alignRules

边框设置:borderWidth、borderColor、borderRadius

尺寸设置:padding、margin

以position为例,需要把绝对方向x、y描述改为新入参类型start、end的描述,其他属性类似。

收起
自动换行
深色代码主题
复制
  1. import { LengthMetrics } from '@kit.ArkUI';
  2. @Entry
  3. @Component
  4. struct InterfaceLayoutBorderSettings {
  5. build() {
  6. Stack({ alignContent: Alignment.TopStart }) {
  7. Stack({ alignContent: Alignment.TopStart }) {
  8. Column()
  9. .width(100)
  10. .height(100)
  11. .backgroundColor(Color.Red)
  12. .position({
  13. start: LengthMetrics.px(200),
  14. top: LengthMetrics.px(200)
  15. }) // 需要同时支持LTR和RTL时使用API12新增的LocalizedEdges入参类型,
  16. // 仅支持LTR时等同于.position({ x: '200px', y: '200px' })
  17. }.backgroundColor(Color.Blue)
  18. }.width('100%').height('100%').border({ color: '#880606' })
  19. }
  20. }

自定义绘制Canvas组件

Canvas组件的绘制内容和坐标均不支持镜像能力。已绘制到Canvas组件上的内容并不会跟随系统语言的切换自动做镜像效果。

CanvasRenderingContext2D的文本绘制支持镜像能力,在使用时需要与Canvas组件的通用属性direction(组件显示方向)和CanvasRenderingContext2D的属性direction(文本绘制方向)协同使用。具体规格如下:

  1. 优先级:CanvasRenderingContext2D的direction属性 > Canvas组件通用属性direction > 系统语言决定的水平显示方向。
  2. Canvas组件本身不会自动跟随系统语言切换镜像效果,需要应用监听到系统语言切换后自行重新绘制。
  3. CanvasRenderingContext2D绘制文本时,只有符号等文本会对绘制方向生效,英文字母和数字不响应绘制方向的变化。
收起
自动换行
深色代码主题
复制
  1. import { BusinessError, commonEventManager } from '@kit.BasicServicesKit';
  2. @Entry
  3. @Component
  4. struct CustomizeCanvasComponentDrawing {
  5. @State message: string = 'Hello world';
  6. private settings: RenderingContextSettings = new RenderingContextSettings(true)
  7. private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
  8. aboutToAppear(): void {
  9. // 监听系统语言切换
  10. let subscriber: commonEventManager.CommonEventSubscriber | null = null;
  11. let subscribeInfo2: commonEventManager.CommonEventSubscribeInfo = {
  12. events: ['usual.event.LOCALE_CHANGED'],
  13. }
  14. commonEventManager.createSubscriber(subscribeInfo2,
  15. (err: BusinessError, data: commonEventManager.CommonEventSubscriber) => {
  16. if (err) {
  17. console.error(`Failed to create subscriber. Code is ${err.code}, message is ${err.message}`);
  18. return;
  19. }
  20. subscriber = data;
  21. if (subscriber !== null) {
  22. commonEventManager.subscribe(subscriber, (err: BusinessError, data: commonEventManager.CommonEventData) => {
  23. if (err) {
  24. return;
  25. }
  26. // 监听到语言切换后,需要重新绘制Canvas内容
  27. this.drawText();
  28. })
  29. } else {
  30. console.error(`Need create subscriber`);
  31. }
  32. })
  33. }
  34. drawText(): void {
  35. console.info('drawText')
  36. this.context.reset()
  37. this.context.direction = 'inherit'
  38. this.context.font = '30px sans-serif'
  39. this.context.fillText('ab%123&*@', 50, 50)
  40. }
  41. build() {
  42. Row() {
  43. Canvas(this.context)
  44. .direction(Direction.Auto)
  45. .width('100%')
  46. .height('100%')
  47. .onReady(() =>{
  48. this.drawText()
  49. })
  50. }
  51. .height('100%')
  52. }
  53. }
展开
镜像前 镜像后

镜像状态字符对齐

Direction是指文字的方向,即文本在屏幕上呈现时字符的顺序。在从左到右(LTR)文本中,显示顺序是从左向右;在从右到左(RTL)文本中,显示顺序是从右到左。

TextAlign是将文本作为一个整体,在布局上的影响,具体位置会受Direction影响,以TextAlign为start为例,当Direction为LTR时,布局位置靠左;当Direction为RTL时,布局位置靠右。

在LTR与RTL文本混排时,如一个英文句子中包含阿拉伯语的单词或短语,显示顺序将变得复杂。下图为数字和维吾尔语混合时对应的字符逻辑顺序。

此时,文本渲染引擎会采用名为“双向算法”或“Unicode双向算法”(Unicode Bidirectional Algorithm)的方法来确定字符的显示顺序。下图展示了LTR与RTL文本混合时对应的字符显示顺序,确定字符方向的基本原则如下:

  1. 强字符的方向性:强字符具有明确的方向性,例如,中文为LTR,阿拉伯语为RTL,这类字符的方向性会影响其周围的中性字符。

  2. 弱字符的方向性:弱字符不具备明确的方向性,这些字符不会影响其周围中性字符的方向。

  3. 中性字符的方向性:中性字符无固定方向性,它们会继承其最近的强字符的方向;若附近无强字符,则采用全局方向。