跳转到主要内容
lurno
全部文章
博客

挑一个真的能用阿拉伯语工作的 LMS

阿拉伯语翻译和为从右到左而生的产品,是两回事。方向被排在最后时会坏掉什么,以及一小时就能查出来的测试。

The Lurno teamAugmental阅读约 1 分钟

有阿拉伯语翻译的 LMS,和为从右到左而构建的 LMS,是两种产品,而一场用英语做的演示不会告诉你自己买的是哪一种。翻译是一个字符串文件。方向是布局、图标、日期格式、排序顺序、拖拽手柄和 PDF 渲染器的属性——这些字符串文件一个都碰不到。向每一家厂商索取阿拉伯语版本的登录账号,用阿拉伯语,然后往没人演示的地方追问。

海湾与北非的学校和学院如今默认按双语采购:学员和监护人用阿拉伯语,系统团队用英语或法语,一个平台同时承载两者,而任何一半都不该有移植过来的感觉。失败的方式很少是缺了某个功能。而是一份学期报告把学生的名字印反了,然后一位校长悄悄不再相信这个系统。

翻译是一个文件。方向是整个布局。

一位译者两周就能做完一个字符串文件,审校它只需过一遍截图。这份工作是实实在在的,而且是容易的那一半。

方向牵动每一条写着左或右的规则、每一个指向某处的图标,以及每一次从容器左边缘量起的测量。如果方向从一开始就是一个变量,根元素会带上 `dir="rtl"`,样式表使用逻辑属性——用 `margin-inline-start` 而不是 `margin-left`——于是界面会自我镜像,并在新增界面时保持镜像。如果左和右被写死在上千条规则里,阿拉伯语就意味着重构每一个界面,这也是它一再被排期、又一再被推迟的原因。

Lurno

把方向当作变量:每一个界面都按逻辑上的起点和终点来布局,于是阿拉伯语只是一个设置,下一个功能上线当天就是镜像好的。

Not this

把一个阿拉伯语字符串文件倒进一套从左边缘量起的布局里,然后随着投诉到来,一个界面一个界面地打补丁。

从右到左(RTL)支持

不是翻译。是界面沿垂直轴做镜像——导航、表格、表单标签、进度条、抽屉、焦点顺序——再加上阿拉伯语与拉丁词、数字混排时不出错的句子,与所在国家相符的数字体系和历法,懂阿拉伯语的排序与搜索,以及能把阿拉伯语渲染成连写字体的文档。当方向从一开始就是一个变量时,产品才有它;当阿拉伯语只是被加进字符串文件时,产品就没有。

一个 LMS 有阿拉伯语翻译,就算支持阿拉伯语吗?

光有翻译不算。翻译给你的是放在从左到右布局里的阿拉伯语词,大概是一半的活。另一半是方向:界面做镜像,图标指向正确,含有拉丁词或数字的句子里标点落在正确的那一端,数字体系和历法与国家、而不是与语言相符,姓名按阿拉伯语姓名的方式排序和搜索,PDF 把阿拉伯语渲染成连写字体。要一个界面一个界面地问,这些今天哪些做好了。

从右到左来得太晚时,会坏掉什么

这些都不稀奇。它们是普通的缺陷类别,而且在每一个事后才加上阿拉伯语的产品里,大致都按这个顺序出现。

只翻转了一半的布局

页面主体镜像了,外壳没有。侧边栏还在左边,抽屉从错误的一侧滑出,进度条从左边开始填充,于是一位已完成四分之三的学员看起来像刚开始。表格的表头行镜像了、单元格没有,每个值都跑到了错误的标题下面——这是最糟的一类,因为它看起来像数据问题,而不是布局问题。然后是小的那些:截断字符串的省略号出现在错误的一端,工具提示在错误的一侧,Tab 顺序不再跟着视线走。

指错方向的图标

有些图标必须镜像,有些必须不镜像,规则取决于含义。表示在内容中前后移动的,要镜像:后退和前进箭头,下一个和上一个的尖角箭头,回复,缩进,展开树的小三角。描绘某个实物或某种约定的,不要镜像:时钟仍然顺时针走,对勾仍然是对勾,播放键在阿拉伯语里也不指向左。做一半比不开始更糟——一个指向右的后退箭头,挨着一个指向右的下一个箭头,没法被读成一对。

在两个方向上跑的句子

在一个 LMS 里,几乎没有哪句真实的阿拉伯语是纯阿拉伯语的。它里面会有课程代码、版本号、文件名、分数,或者一个英文产品名。Unicode 双向算法决定每一段文本往哪儿放;它在标记良好的文本上表现不错,在开发者拼接出来的字符串上表现很差。症状很好认:句号跑到最左边,括号互换、于是右括号成了短语的开头,版本号顺序被打乱。

解法是结构性的,而不是取巧的——一条带占位符的翻译字符串,并把值隔离起来,让算法把它当作一个整体。

an Arabic sentence with one Latin value inside it

  concatenated   part1 + fileName + "."
                 → value and full stop land on the wrong side,
                   and only for some values

  interpolated   t("upload.done", { file })     one string, one placeholder
  isolated       <bdi>{{file}}</bdi>            or unicode-bidi: isolate

  where to look  learner names, file names, course codes, scores —
                 anything dropped into a translated sentence

数字、日期与一周

阿拉伯语不是一个 locale。埃及和海湾大部分地区使用东阿拉伯-印度数字(٠١٢٣٤);摩洛哥、阿尔及利亚和突尼斯使用这句话里所用的数字,所以只有一个 `ar` locale 的平台,总有一处是错的——而它会显现在一位家长在电话里念出来的成绩上。沙特的机构常常需要在同一份报告里,让伊斯兰历日期与公历日期并列。工作周是按国家设置的:阿拉伯联合酋长国在 2022 年把公共部门的周末改为周六至周日,而沙特和埃及仍是周五至周六。斋月是最尖锐的考验,因为整整一个月里上学时间会缩短,每一条定时提醒都得跟着移动。

排序与搜索

一份按码位排序的班级名单,不是按字母顺序排的。alef 的各种变体(ا أ إ آ)会被排开,于是 أحمد 和 احمد 落在同一份名册的两半里。名字末尾的 taa marbuta(ة)和 haa(ه)会被随手互换着输入,yaa(ي)和 alef maqsura(ى)也一样,取决于用的是什么键盘。搜索需要同样的规范化,好让一位教务员输入 احمد 时能找到 أحمد——否则职员会认定搜索框坏了,转回去用电子表格。另外,很多阿拉伯语姓名是本名、父名、祖父名和家族名连成的一串,而一个只有两个字段的表单会不声不响地把它截断。

任何可以拖动的东西

在课程里把一个模块拖到位,或者在仪表盘上拖一张卡片,都是对 x 坐标做算术。在从右到左时符号翻转,而一个靠到容器左边缘的距离来推算落点序号的库,会把条目丢到相反的一端。历史上各浏览器对从右到左容器中 `scrollLeft` 的符号并不一致,所以一个横向网格可能只在某一个浏览器里滚到错误的位置。还有,现在左方向键应该让条目往前移动。厂商有没有把这件事做对,能告诉你是否真有讲阿拉伯语的人在这个产品里搭过课程——这在截图里是看不出来的。

PDF 与证书

这一项坏得最晚,也最公开,因为这份成果会离开你的大楼。阿拉伯语是连写的:每个字母依相邻字母取不同的形态,lam 后面跟 alef 会合成一个连字。把它画出来,需要一款含阿拉伯语字形的字体,一个能为每个位置挑出正确形态的整形引擎,以及在落笔之前完成的双向重排。一条按存储顺序逐个字符去画的流水线,会得到那个经典结果——一个由断开的字母组成、且顺序颠倒的名字——每一位阿拉伯语读者都能一眼认出,而采购委员会里没有一个人认得出。证书还多一层:一个按拉丁姓名尺寸设计的姓名字段,以及一个证书本身不是、它却按从左到右渲染的核验页。

为什么 PDF 里的阿拉伯语文字会颠倒或断开?

因为渲染器在画字符,而不是在整形文本。阿拉伯语字母会随相邻字母改变形态,某些组合还会合并成一个连字,所以正确的输出需要三样东西:一款含阿拉伯语字形的字体,一个能为每个字母选出正确上下文形态的整形引擎,以及在字形落位之前完成的双向重排。按存储顺序逐个摆放字符的流水线,跳过了后两样。这是文档流水线的属性,而不是界面的属性,这也是为什么一个平台在屏幕上的阿拉伯语看着没问题,却仍会产出一张不能用的证书。

学校用什么词,不该由厂商来定

教师、监护人、班级,读起来像是固定的术语。它们其实是本地词汇,随国家、课程体系和行业而变,变化程度不亚于随语言而变。

  • 监护人。 在海湾大部分地区,对学生负责的成年人是 ولي الأمر,这是法律上的表述,学校会坚持用它。同一座城市里一所英式课程学校则说 parent。
  • 班级。 在一个体系里是年级组,在另一个体系里是课表上的教学班(شعبة),在美式课程学校里是 homeroom,在培训机构里是一期学员。
  • 教师。 معلم、مدرس 和 أستاذ 带着不同的语体和资历。培训机构说的是 trainer 和 trainee。摩洛哥一所法式体系的学校,在法语这一侧说 enseignant,在阿拉伯语那一侧说另一个词,指的是同一个人。

它们同时沿两个轴变化——按语言,也按组织——而一个翻译文件只处理第一个轴:每个键一个阿拉伯语词,由厂商的译者选定,对该版本上的所有人都一样。所以当一所学校要求用“监护人”而不是“家长”时,一个靠字符串文件的产品有三个答案,而三个都不好:给所有人都改掉,为一个客户单独复刻一份语言文件,或者拒绝。

换个要求:把术语做成配置——每个角色和每个分组名词都有按组织设定的标签,在每种语言里各自独立设置,并应用到这个词出现的每一处。导航栏上的标签是容易的部分。做得浅的迹象是:菜单上写着“监护人”,而通知邮件、报表页眉和导出的 PDF 仍然写着“家长”。

一个 LMS 能在不同国家对教师和监护人用不同的词吗?

只有当这些术语是配置、而不是翻译时才可以。一个翻译文件为该版本上的每一个客户,在每个键上只保存一个阿拉伯语词,所以同一平台上的两所学校没法靠它拥有不同的词汇。本地术语需要的是每个角色和分组名词按组织设定,按语言分别保存,并应用到界面、通知、报表和文档各处。要测试它,改掉一个术语,然后去一封邮件和一份 PDF 里找找那个旧词。

一小时就能跑完的测试

不要问这个平台支不支持阿拉伯语。所有人都会说支持,而所有人指的都是不同的东西。索取一个阿拉伯语租户的登录账号,里面有真实内容和真实姓名,然后跑一遍下面这些。

  1. 切换到阿拉伯语并刷新。整个外壳都镜像了,还是只有页面中间镜像了?
  2. 打开一个表单。检查标签、必填标记、校验提示,以及一段长到装不下的文字。
  3. 找一句含有拉丁词或数字的句子。标点在正确的那一端吗?
  4. 对一份阿拉伯语姓名列表排序。以 أ 和 ا 开头的名字排在一起吗?再搜一个不带 hamza 输入的名字。
  5. 为一位法定姓名有四段的学员报名,看看表单留下了什么。
  6. 在课程里把一个模块拖到新的位置。然后用键盘再做一次。
  7. 为一位阿拉伯语姓名的学员生成一张证书,在手机上打开这份 PDF,再打开它的核验页。
  8. 改掉一个术语——把“家长”改成“监护人”——然后去找那个旧词还活在哪里。
  9. 把这个账号交给一位没参加会议、讲阿拉伯语的同事,看他在没有帮助的情况下工作二十分钟。

厂商可以以后再加上从右到左支持吗?

可以,而且这件事比听起来大:重新检视每一个界面的布局规则,审查每一个有方向的图标,隔离每一个被插进翻译字符串的值,并改造文档流水线,让 PDF 能正确整形阿拉伯语。厂商确实有做完的。要紧的是排期和定义——问清楚今天有哪些界面是镜像的,新功能是上线即镜像还是事后打补丁,以及对 PDF 来说“支持”指的是什么。一个没有指名版本的承诺,是一个会去尝试的承诺。

我们的位置

我们自己就做这样一个平台,这一节请照此掂量。Lurno 有四种产品语言——英语、阿拉伯语、法语和意大利语——阿拉伯语有完整的从右到左支持:镜像的是界面,不只是字符串。这是一个事实,不是一个论点。论点是:你应该用上面那一小时、而不是用一张功能对照表,来核查它,以及核查其他所有人的。

双语集团会在同一天撞上两个问题:方向和身份。一个同时运营一所阿拉伯语授课学校和一所英语授课学校的集团,希望两者各自看起来像自己——自己的 logo、颜色、登录页和域名——这属于白标品牌,而不是一个语言设置。学校集团页讲的是当一个平台承载多所学校时,这两件事怎么配合。如果印着学员姓名的证书会离开你的大楼,那就在签字之前,问清楚阿拉伯语下的文档流水线

严格的理由不是美观。一个在阿拉伯语下只能用一半的平台,会把所有人推回系统团队的语言里,而当初为之买单的学员和监护人就不再打开它了。这种失败是安静的,要一个学期才会出现在任何一份报表上,而且没有哪张功能清单能预测它。