Flutter国际化:如何获取select类型翻译配置中的所有选项键?
Flutter国际化:如何获取select类型翻译配置中的所有选项键?
嘿,我完全get到你的需求了——你用Flutter Intl的select语法实现了类似Androidmale、female、other这类)对吧?
其实核心思路是解析你的翻译配置字符串,因为select的语法是固定格式,我们可以用正则表达式来匹配提取。下面分两种场景给你解决方案:
1. 直接解析翻译JSON文件
如果你的翻译内容存在JSON文件(比如en.json)里,可以直接读取并解析JSON,再用正则提取选项键:
import 'dart:convert'; import 'dart:io'; void extractSelectKeys() async { // 读取翻译JSON文件 final file = File('lib/l10n/en.json'); final jsonStr = await file.readAsString(); final translations = jsonDecode(jsonStr) as Map<String, dynamic>; // 获取目标翻译项的原始模板字符串 final targetStr = translations['pronoun'] as String; // 正则匹配select中的选项键(匹配`{key{`格式里的key) final regex = RegExp(r'(\w+)\{'); final matches = regex.allMatches(targetStr); // 提取结果并去重(防止意外重复) final keys = matches.map((match) => match.group(1)) .whereType<String>() .toSet() .toList(); print(keys); // 输出: [male, female, other] }
2. 运行时从已加载的本地化实例提取
如果已经通过Flutter Intl加载了本地化内容,你可以先获取对应的翻译模板字符串,再用同样的正则方法提取:
import 'package:intl/intl.dart'; import 'package:your_app/l10n/app_localizations.dart'; void getSelectKeys(BuildContext context) { final loc = AppLocalizations.of(context)!; // 注意:要拿翻译的原始模板字符串,不是已经替换变量后的内容 final pronounTemplate = "{gender, select, male{he} female{she} other{they}}"; final regex = RegExp(r'(\w+)\{'); final matches = regex.allMatches(pronounTemplate); final keys = matches.map((match) => match.group(1)) .whereType<String>() .toList(); print(keys); }
小提示
如果你的select选项键包含特殊字符(比如连字符),可以把正则里的\w+改成[\w-]+来适配;如果有嵌套的select语法,可能需要调整正则逻辑来避免误匹配。
备注:内容来源于stack exchange,提问作者Draško
相关产品推荐
相关产品推荐

