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
相关产品推荐
相关产品推荐

