BUG|Flutter Text組件和國(guó)際化

發(fā)現(xiàn)問(wèn)題

新版本引入了一個(gè)新勛章,測(cè)試走查其多語(yǔ)言時(shí)發(fā)現(xiàn),泰文版勛章名沒(méi)有一行展示而是換行了,如圖所示:



因?yàn)槠渌Z(yǔ)言沒(méi)問(wèn)題、泰文版其他勛章名也是正常的,所以第一反應(yīng)是有問(wèn)題的泰文是不是誤加了換行符?經(jīng)查并沒(méi)有。而且在限制勛章名Text組件最多展示一行且按照末尾打點(diǎn)后,原本換到第二行的內(nèi)容也被打點(diǎn)掉了:



這時(shí)嘗試給Text一個(gè)最大寬度,沒(méi)有任何變化:
return ConstrainedBox(
  constraints: BoxConstraints(maxWidth: 150),
  child: Text(...),
)

接著嘗試給Text一個(gè)固定寬度,此時(shí)終于能正常一行展示了:

return Container(
  width: 150,
  child: Text(...),
);

但這不符合設(shè)計(jì),Text后面緊挨著一個(gè)小問(wèn)號(hào),要求Text是自適應(yīng)寬度的,因此要給Text一個(gè)實(shí)際寬度才行,但僅算出來(lái)的寬度還不行,要多加一點(diǎn)寬度才可以:

final painter = TextPainter(
  textDirection: TextDirection.ltr,
  maxLines: 1,
  text: TextSpan(
    text: ...,
    style: ...,
  ),
);
painter.layout(minWidth: 0, maxWidth: 150);
return Container(
  width: painter.width + 2, // 2就是額外寬度
  child: Text(...),
);

最終效果如圖:


定位原因

本以為這個(gè)問(wèn)題算是解決了,在自測(cè)時(shí)突然發(fā)現(xiàn)好幾處都有類似問(wèn)題,比如這個(gè)頁(yè)面圈出來(lái)的幾處泰文,如果限制了最大行數(shù)會(huì)表現(xiàn)為提前打點(diǎn)、未限制時(shí)會(huì)表現(xiàn)為莫名換行,且只有泰文有問(wèn)題:


這些泰文的相同點(diǎn)是最后一個(gè)字符都包含 -?,為驗(yàn)證的確是該符號(hào)引起,做了如下測(cè)試:

那是否只有-?符號(hào)會(huì)導(dǎo)致錯(cuò)誤呢?wiki-泰文字一文了解在泰文共包含這些字母:

其中,紅框圈出的被稱為組合符號(hào)(Combining Character),即可以加在前一個(gè)字母之上:

經(jīng)過(guò)測(cè)試,這16個(gè)組合符號(hào)中有4個(gè)會(huì)導(dǎo)致顯示異常(前四個(gè)):

其實(shí)也不難猜到,因?yàn)檫@4個(gè)符號(hào)明顯超出底部輔音字母寬度,且超出部分能在后一個(gè)輔音字母的空間中顯示。因此,如果它們不在最后一個(gè),實(shí)際寬度就等于測(cè)量寬度(輔音字母寬度之和);如果處于最后一個(gè),實(shí)際寬度就大于測(cè)量寬度,導(dǎo)致?lián)Q行或打點(diǎn)。

解決辦法

這里提供幾種解決思路:
1、直接修改翻譯,或在文本后加一個(gè)空格即可,可以快速修復(fù)線上問(wèn)題
2、優(yōu)化Text組件,兼容泰文這幾個(gè)特殊符號(hào)處于最后一個(gè)的情況
3、設(shè)置字體,如Google提供的這一款泰文字體 Google Fonts-Noto Serif Thai 可以調(diào)整組合字符的顯示區(qū)域,使之不超出輔音字母。

總結(jié)

突然發(fā)現(xiàn)最近三篇BUG系列都是多語(yǔ)言問(wèn)題,在解決問(wèn)題過(guò)程中也學(xué)習(xí)各個(gè)地區(qū)語(yǔ)言的與眾不同,也是很有意思的經(jīng)歷了~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容