国际化-RTL
December 07, 2024
什么是RTL?
RTL是”Right-to-Left”的缩写,指的是从右向左的书写和阅读方向。与世界上大多数语言(如英语、中文等)采用的LTR(Left-to-Right,从左到右)方向不同,RTL语言有着独特的展示和交互方式。
典型的RTL语言包括:
- 阿拉伯语(Arabic)
- 波斯语(Persian/Farsi)
- 希伯来语(Hebrew)
- 乌尔都语(Urdu
这些语言覆盖了中东等地区约8亿人口,是国际化产品不可忽视的重要市场。
RTL适配的核心挑战
1. RTL交互设计
文本翻译只是第一步,整个UI交互逻辑都需要适配RTL习惯。这包括:
- 导航结构
- 内容流方向
- 手势交互
- 视觉层次
2. 文字混排(Bi-directional Text)
当RTL与LTR文字混合时(如阿拉伯语中包含英文单词或数字),会出现复杂的双向文本(Bidi)问题。Unicode虽然提供了基础支持,但实际应用中仍需特别注意。
3. 跨端容器适配
主流跨端框架如React Native、Flutter对RTL有良好支持,但自研框架可能需要改造
4. 自定义控件适配
标准组件通常有官方RTL支持,但自定义组件、动效和手势交互需要业务方自行适配,这是主要的开发成本所在。
RTL适配规范与方案
1. RTL切换机制
- Locale识别:通过i18n SDK识别当前语言环境
- 界面刷新:语言切换后重新加载界面
- 推荐方案:i18n SDK提供RTL标识,业务代码据此适配
2. 文字处理
- 纯文本:RTL或LTR纯文本可自动识别,无需处理
- 混排场景:需要特别处理拼接、占位等可能出现混排的情况
- 解决方案:
- 布局方向:依赖系统能力
- 双向语序:使用i18n SDK提供的混排能力,见 Unicode双向算法 W3C RTL Script wikipedia:Bidi_text
3. 布局适配
- 基本原则:
- 支持双向布局,一套代码完成LTR/RTL切换
- 禁止使用left/right硬编码
- 特殊元素单独适配
- 技术栈方案:
- Web:postcss-rtlcss布局工具
- iOS:iOS-Right to left布局支持
- Android:Android 布局镜像
- React Native:官方RTL方案
4. 图标处理
- 对称图标:通过代码镜像反转,不增加包大小
- 非对称图标:可能需要设计两套资源
- 解决方案:业务层根据RTL标识控制图片显示方式
5. 动效与手势
- 方向性动效:需要对称反转播放方向
- 页面转场动画
- 轮播组件
- Lottie动画
- 下拉刷新指示器
- 手势交互:需要调整左右方向
- 页面侧滑退出
- Tab切换手势
- Banner滑动方向
主流跨端框架的RTL方案
1. React Native
- Meta从v0.33.0-rc开始支持RTL
- 在Facebook等应用中经过充分验证
- 提供全面的RTL布局支持
2. Flutter
- 通过
Directionality
组件控制文本方向 - 支持RTL布局镜像
- 丰富的RTL感知组件
3. Web方案
- CSS方案:使用
direction
和text-align
属性 - RTLCSS:通过PostCSS插件自动生成RTL样式
- 框架支持:主流框架如React、Vue都有RTL方案
阅读量
Written by xi ming You should follow him on Github