百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

【AWTK使用经验】如何在AWTK显示阿拉伯文本

zhezhongyun 2025-09-01 19:01 10 浏览

AWTK是基于C语言开发的跨平台GUI框架。AWTK使用经验系列文章将介绍开发AWTK过程中一些常见问题与解决方案,例如:如何播放视频或摄像头画面?如何播放序列帧动画?这些都会在系列文章进行解答。


本篇文章将简单介绍阿拉伯文本相关整形与排序规则,接着介绍在AWStudio设置阿拉伯语言翻译的步骤。


阿拉伯文本整形规则

一般GUI显示英文或者中文时,内存中存储的字符串和我们人眼看到的字符串是一样的;但是阿拉伯文本比较特殊,内存中的字符串需要经过几个步骤处理(主要是整形与文本方向排序),最终才形成成我们人眼看到的字符串。
关于阿拉伯文本整形可以分为5种,下面将简单介绍这几种类型的整形。

1、字母位置不同,如在开头或结尾可能会导致不一样的变形:

图 1 字母位置变形(Shaper)

2、字母会受到前后字母影响而变形,如下图两个字符会结合形成第三个字符:


图 2 连写变形(Ligature)

3、元音符号和字母会有组合的特性,如下图,一个字母与一个元音符号会有位移结合的变形:


图 3 元音符号变形(Diacritics)

4、有时候为了美观的视觉效果会将字母延长凑成一整行的长度,这种是字母延长变形:


图 4 字母延长变形(Kashida)

5、字母之间插入连接符号会影响变形:


图 5 字母插入连接符号变形(Tatwell)


阿拉伯文本双向排序

Unicode不同类型字符的方向属性

Unicode字符可以分为强字符、弱字符和中性字符,不同类型的字符具有不同的方向性特征:

1、强字符:英文、汉字、阿拉伯字母等,它们方向性都是确定的,比如英文属于从左到右的LTR字符,阿拉伯属于从右到左的RTL字符,它们可能影响前后字符的方向性;

2、弱字符:数字和数字相关的符号,它们方向性是确定的,但是对前后字符不会产生影响;

3、中性字符:大部分标点符号和空格,它们方向是不确定的,由上下文bidi属性决定其方向。


AWTK支持阿拉伯文本的哪些规则

由于阿拉伯文本整形规则和排序规则比较复杂,AWTK内部调用了bidi算法对阿拉伯文本进行排序并做简单的变形,bidi算法支持文本双向排序算法,在整形规则上暂时只支持字母位置变形和连写变形,不支持元音符号变形。

如何在AWTK使用阿拉伯语言

如果想在AWTK正确使用阿拉伯语言,可以参考以下步骤:

下载阿拉伯语言字库

AWStudio新建工程的默认字库是不支持显示阿拉伯文本的,因此需要先找到支持阿拉伯文本字库文件。字库文件可以在相关字体下载网站搜索并下载,或者从awtk资源目录拷贝自带的阿拉伯语言字库文件:

awtk/design/default/fonts/trado.ttf导入阿拉伯语言字库到工程准备好字库文件后,可以使用AWStudio将字库文件导入到自己的项目工程。在AWStudio资源浏览器选择“字体”,点击右上角加号选择字库文件并导入。


图 6 使用AWStudio导入字库文件


在AWStudio设置阿拉伯语言翻译文本

AWStudio支持给工程设置多国语言翻译并实时切换的功能,点击AWStudio上方菜单栏的“翻译”按钮进入多语言翻译设置页面,页面操作步骤如下:1、点击界面右下角添加语言按钮;2、在对话框选择要添加的语言、国家或地区,比如阿拉伯语言选择“Arabic”;3、点击对话框确定按钮;4、在对应语言框输入翻译后的文本内容。(如果显示异常可能是字体缺失,可以在添加语言对话框点击“导入字体”添加字库文件)


图 7 使用AWStudio添加阿拉伯语言翻译

最后在AWStudio给控件text属性设置原始文本,并且开启翻译选项,之后该控件就会根据程序当前语言翻译进行翻译。


图 8 开启控件翻译选项

关于在程序实时翻译的详细步骤可以参考官方文档《多国语言互译》里面的“实时切换语言”章节:
https://awstudio.zlg.cn/docs/awtk_docs/AWTK_Guide/8.Locale.html

阿拉伯语言方向性问题

由于阿拉伯书写习惯是从右到左,在切换语言后同样需要遵循这个习惯。AWTK内置的bidi算法可以自动处理阿拉伯文本排序,也可以手动定义bidi属性(默认为auto),如强制设置RTL排序。关于bidi双向排序算法详细的使用说明可以阅读官方在线文档《如何启用文本双向排版》
:https://awstudio.zlg.cn/docs/awtk_docs/HowTo/how_to_enable_bidi.html


图 9 bidi属性自动排序阿拉伯文本

相关推荐

perl基础——循环控制_principle循环

在编程中,我们往往需要进行不同情况的判断,选择,重复操作。这些时候我们需要对简单语句来添加循环控制变量或者命令。if/unless我们需要在满足特定条件下再执行的语句,可以通过if/unle...

CHAPTER 2 The Antechamber of M de Treville 第二章 特雷维尔先生的前厅

CHAPTER1TheThreePresentsofD'ArtagnantheElderCHAPTER2TheAntechamber...

CHAPTER 5 The King'S Musketeers and the Cardinal'S Guards 第五章 国王的火枪手和红衣主教的卫士

CHAPTER3TheAudienceCHAPTER5TheKing'SMusketeersandtheCardinal'SGuard...

CHAPTER 3 The Audience 第三章 接见

CHAPTER3TheAudienceCHAPTER3TheAudience第三章接见M.DeTrévillewasatt...

别搞印象流!数据说明谁才是外线防守第一人!

来源:Reddit译者:@assholeeric编辑:伯伦WhoarethebestperimeterdefendersintheNBA?Here'sagraphofStea...

V-Day commemorations prove anti-China claims hollow

People'sLiberationArmyhonorguardstakepartinthemilitaryparademarkingthe80thanniversary...

EasyPoi使用_easypoi api

EasyPoi的主要特点:1.设计精巧,使用简单2.接口丰富,扩展简单3.默认值多,writelessdomore4.springmvc支持,web导出可以简单明了使用1.easypoi...

关于Oracle数据库12c 新特性总结_oracle数据库12514

概述今天主要简单介绍一下Oracle12c的一些新特性,仅供参考。参考:http://docs.oracle.com/database/121/NEWFT/chapter12102.htm#NEWFT...

【开发者成长】JAVA 线上故障排查完整套路!

线上故障主要会包括CPU、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题...

使用 Python 向多个地址发送电子邮件

在本文中,我们将演示如何使用Python编程语言向使用不同电子邮件地址的不同收件人发送电子邮件。具体来说,我们将向许多不同的人发送电子邮件。使用Python向多个地址发送电子邮件Python...

提高工作效率的--Linux常用命令,能够决解95%以上的问题

点击上方关注,第一时间接受干货转发,点赞,收藏,不如一次关注评论区第一条注意查看回复:Linux命令获取linux常用命令大全pdf+Linux命令行大全pdf为什么要学习Linux命令?1、因为Li...

linux常用系统命令_linux操作系统常用命令

系统信息arch显示机器的处理器架构dmidecode-q显示硬件系统部件-(SMBIOS/DMI)hdparm-i/dev/hda罗列一个磁盘的架构特性hdparm-tT/dev/s...

小白入门必知必会-PostgreSQL-15.2源码编译安装

一PostgreSQL编译安装1.1下载源码包在PostgreSQL官方主页https://www.postgresql.org/ftp/source/下载区选择所需格式的源码包下载。cd/we...

Linux操作系统之常用命令_linux系统常用命令详解

Linux操作系统一、常用命令1.系统(1)系统信息arch显示机器的处理器架构uname-m显示机器的处理器架构uname-r显示正在使用的内核版本dmidecode-q显示硬件系...

linux网络命名空间简介_linux 网络相关命令

此篇会以例子的方式介绍下linux网络命名空间。此例中会创建两个networknamespace:nsa、nsb,一个网桥bridge0,nsa、nsb中添加网络设备veth,网络设备间...