Flutter中如何翻译TextSelectionToolbar的复制、剪切等按钮标签
Flutter 翻译TextSelectionToolbar按钮标签方案
不管是使用GetX还是其他第三方开发包,TextSelectionToolbar的按钮文案默认由Flutter组件本地化体系控制,没有正确配置本地化代理时就会默认显示Copy、Cut等英文标签,具体配置方法如下:
前置依赖准备
首先在pubspec.yaml中引入官方本地化依赖,这是所有系统组件文案翻译的基础:
dependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter # 使用GetX时需要引入 get: 对应兼容版本
GetX场景配置
使用GetX时需要在GetMaterialApp中补全组件本地化代理,很多开发者只配置GetX自身的翻译代理、漏掉系统组件代理,是导致工具栏显示英文的核心原因:
void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return GetMaterialApp( // 配置默认语言、异常回退语言 locale: const Locale('zh', 'CN'), fallbackLocale: const Locale('zh', 'CN'), // 核心:补全所有本地化代理 localizationsDelegates: const [ // 负责Material风格系统组件(含文本选择工具栏)的文案翻译 GlobalMaterialLocalizations.delegate, // 负责基础组件文案翻译 GlobalWidgetsLocalizations.delegate, // 负责Cupertino(iOS风格)组件文案翻译 GlobalCupertinoLocalizations.delegate, // 此处可追加GetX自定义翻译代理、其他第三方组件需要的本地化代理 ], // 声明应用支持的语言列表 supportedLocales: const [ Locale('zh', 'CN'), Locale('en', 'US'), ], home: const HomePage(), ); } }
配置完成后执行热重启(热重载不会加载本地化配置),文本选择工具栏的Copy、Cut、Paste、SelectAll等按钮就会自动显示为对应语言的官方翻译。
自定义按钮文案
如果不需要官方自带翻译、想自定义按钮显示内容,可以自定义本地化代理覆写对应文案字段:
// 自定义中文本地化类,覆写工具栏按钮文案 class CustomZhMaterialLocalizations extends GlobalMaterialLocalizations { const CustomZhMaterialLocalizations(); @override String get copyButtonLabel => '复制'; @override String get cutButtonLabel => '剪切'; @override String get pasteButtonLabel => '粘贴'; @override String get selectAllButtonLabel => '全选'; // 其他需要自定义的系统组件文案也可以在这里重写 } // 自定义本地化代理 class CustomLocalizationsDelegate extends LocalizationsDelegate<MaterialLocalizations> { const CustomLocalizationsDelegate(); @override bool isSupported(Locale locale) => locale.languageCode == 'zh'; @override Future<MaterialLocalizations> load(Locale locale) async { return const CustomZhMaterialLocalizations(); } @override bool shouldReload(covariant LocalizationsDelegate<MaterialLocalizations> old) => false; }
把上面自定义的CustomLocalizationsDelegate放到localizationsDelegates列表的最前面,优先级高于官方代理,就会生效你自定义的文案。
常见踩坑说明
- 非GetX场景下,只要在原生
MaterialApp/CupertinoApp中按同样规则补全本地化代理即可,逻辑完全一致 - 所有基于Flutter原生
EditableText实现的第三方输入框组件,都遵循这套本地化规则,不需要单独修改组件代码 - 如果配置后还是显示英文,优先检查是否漏加
GlobalMaterialLocalizations.delegate、是否执行了热重启
内容的提问来源于stack exchange,提问作者Amin
相关产品推荐
相关产品推荐

