You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter乌尔都语本地化后括号显示倒置问题求解决方案

解决Flutter乌尔都语文本括号倒置问题

问题描述

已将Flutter的locale设置为Locale("ur","PK"),从API获取乌尔都语文本时,出现括号倒置异常——原本的(部分文本)显示为)部分文本(。

问题截图:
乌尔都语文本括号倒置问题

当前使用的代码片段:

Directionality(
    textDirection: TextDirection.rtl,
    child: Text(
      quranScreenController.selectedSurah.trAyat[index].text,
      overflow: TextOverflow.ellipsis,
      textAlign: lang == "ur" ? TextAlign.right : TextAlign.justify,
      style: TextStyle(
        fontFamily: lang == "ur" ? "j_n_n" : "Poppins",
        wordSpacing: 2,
        fontSize: lang == "ur" ? 27.sp : 16.sp,
        fontWeight: FontWeight.w500,
      ),
    ),
),

解决方案

1. 替换为乌尔都语专用括号

ASCII的()属于中性字符,在RTL(从右到左)布局中会被双向文本算法自动反转。直接替换为乌尔都语原生括号即可解决:

// 定义文本处理函数
String fixUrduBrackets(String text) {
  // 将ASCII括号替换为乌尔都语对应括号
  return text.replaceAll('(', '\u0608').replaceAll(')', '\u0609');
}

// 在Text组件中使用处理后的文本
Text(
  fixUrduBrackets(quranScreenController.selectedSurah.trAyat[index].text),
  // 其他属性保持不变
)

2. 用Unicode控制字符强制括号内文本方向

如果需要保留ASCII括号但避免反转,可以通过Unicode双向控制字符,强制括号内内容按LTR(从左到右)渲染:

String fixBracketDirection(String text) {
  // 匹配所有(...)格式的内容,添加控制字符
  return text.replaceAllMapped(RegExp(r'\((.*?)\)'), (match) {
    // \u202D:强制LTR方向;\u202C:恢复原文本方向
    return '\u202D(${match.group(1)})\u202C';
  });
}

3. 调整Directionality的使用策略

如果文本中混合了LTR内容(比如数字、英文),可以尝试不强制设置textDirection: TextDirection.rtl,让Flutter自动根据文本内容识别方向。乌尔都语文本本身会被自动识别为RTL,混合字符时双向算法会更合理地处理排版。


内容的提问来源于stack exchange,提问作者Diificult Ranger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 00:07:24