如何将Xamarin.Forms TimePicker的AM/PM显示改为西班牙语(墨西哥)
问题分析与解决方案
1. 是否为Xamarin.Forms已知Bug?
是的,这属于Xamarin.Forms 5.x版本在iOS平台上的已知本地化问题。TimePicker控件的静态显示文本(非滚轮选择界面)在格式化时没有正确继承当前设置的UICulture,而是沿用了默认的英文大写AM/PM格式,即便滚轮选择界面已经正确应用了西班牙语规范的"a.m./p.m."。
2. 是否遗漏了本地化设置?
从你提供的代码和配置来看,核心的本地化设置已经覆盖:
- 正确配置了iOS的
AppleLanguages为西班牙语 - 全局线程的
CurrentCulture和CurrentUICulture都指定为es-MX Info.plist也注册了西班牙语支持
没有遗漏关键的本地化配置项,问题出在Xamarin.Forms控件本身的格式化逻辑上。
3. 解决方式:不一定只能用自定义渲染器,但渲染器是最可靠的方案
方案一:尝试自定义格式字符串
给TimePicker显式设置Format属性,指定符合西班牙语规范的格式:
<TimePicker Format="hh:mm tt" />
不过需要注意,部分Xamarin.Forms 5.x版本可能依然存在格式解析不生效的问题,因为控件内部可能硬编码了AM/PM的显示逻辑。
方案二:自定义iOS渲染器(最可靠)
如果自定义格式无效,通过自定义渲染器强制修正显示文本:
using Xamarin.Forms; using Xamarin.Forms.Platform.iOS; using UIKit; [assembly: ExportRenderer(typeof(TimePicker), typeof(CustomTimePickerRenderer))] namespace YourAppNamespace.iOS.Renderers { public class CustomTimePickerRenderer : TimePickerRenderer { protected override void OnElementChanged(ElementChangedEventArgs<TimePicker> e) { base.OnElementChanged(e); if (Control != null && Element != null) { // 手动格式化时间文本,使用es-MX的AM/PM格式 UpdateTimeText(); // 监听时间变化,实时更新格式 Element.PropertyChanged += (sender, args) => { if (args.PropertyName == TimePicker.TimeProperty.PropertyName) { UpdateTimeText(); } }; } } private void UpdateTimeText() { var time = Element.Time; var culture = System.Globalization.CultureInfo.CurrentUICulture; Control.Text = time.ToString("hh:mm tt", culture); } } }
这个渲染器会强制使用当前UICulture的格式规则生成显示文本,确保输出符合西班牙语规范的"a.m./p.m."。
内容的提问来源于stack exchange,提问作者Victor Chelaru
相关产品推荐
相关产品推荐

