Flutter中使用GetX如何翻译含动态变量值的文本
问题根因
你当前的实现是先把动态计算的剩余天数值硬拼在字符串前部,再把拼接后的完整字符串作为key匹配翻译项。当剩余天数变化时,实际参与匹配的key会变成3,days/ until event day、7,days/ until event day这类带动态值的字符串,和翻译配置里写死的固定key完全不一致,自然无法命中翻译。
另外这种硬拼接变量的写法无法适配不同语言的语序差异,不少语言会把数值放在句子中部或尾部,硬编码变量位置的写法根本不具备多语言适配的通用性。
正确实现方式
GetX原生支持带动态参数的翻译能力,不需要手动拼接变量到翻译key中,按以下步骤修改即可:
- 定义固定的翻译key,在各语种的翻译文本中用
{参数名}格式预留动态变量占位符,占位符位置可以根据对应语言的语法习惯自由调整,不需要固定在句首:
// 全局翻译配置 Map<String, Map<String, String>> translations = { 'en_US': { 'event_remaining_tip': '{days} days until event day', }, // 你当前使用的库尔德语配置,按本地语言表达习惯放置占位符即可 'ku': { 'event_remaining_tip': '{days} ڕؤژ ماوه/ تاوهكو ئیڤێنتی داهاتوو', } };
- 业务层调用
trParams方法传入动态参数,方法会自动完成占位符替换,不需要手动拼接字符串:
// 计算剩余天数 final remainingDays = pDate.difference(DateTime.now()).inDays; // 传入参数获取翻译结果 untilEventDay = 'event_remaining_tip'.trParams({ 'days': remainingDays.toString(), });
可选方案
如果动态参数顺序固定不需要调整,也可以用位置参数写法:翻译文本中用%s标记参数位置,调用时通过.tr(args: [参数1, 参数2])传入参数数组即可。不过更推荐使用命名参数的trParams写法,可读性更高,后续调整翻译文本时也不会因为参数顺序导致内容错乱。
内容的提问来源于stack exchange,提问作者suvi
相关产品推荐
相关产品推荐

