我有一个提供4种语言的应用,可以在应用中选择。在Android上,DatePicker有一个标题。即使在设置了语言环境之后,此标题似乎总是支持设备区域设置。只有标题才能这样做,因为DatePicker的功能部分是以应用程序选择的语言。
以下是应用设置为韩语时的样子。
如何将8月24日星期四改为韩国人?我已将Xamarin和Android区域设置为韩语。我可以设置日期选择器渲染器中的属性吗?
感谢。
答案 0 :(得分:1)
如果你正在做这样的事情来应用新的语言环境上下文基本配置:
localhost
Material-design protected override void AttachBaseContext(Android.Content.Context @base)
{
Locale locale = Locale.Korean;
Locale.SetDefault(Locale.Category.Format, locale);
@base.Resources.Configuration.SetLocale(locale);
var newContext = @base.CreateConfigurationContext(@base.Resources.Configuration);
base.AttachBaseContext(newContext);
}
没有正确地遵守上下文的语言环境,而是传递给它的.ctor,你最终会得到错误的Title本地化,如你的问题所示;-(
一个选项是继承CalendarView
并重新实现DatePicker
并将其应用于子类DatePickerCalendarDelegate
,但这对于正确编码有点疯狂解决了这个问题。
所以这是我一直在使用的修复(hack)(简化为SO,所以你需要API API各种API级别检查等等):
AlertDialog
// globals/cached
bool headerChangeFlag = true;
TextView headerTextView;
string headerDatePatternLocale;
SimpleDateFormat monthDayFormatLocale;
void SetHeaderMonthDay(DatePickerDialog dialog, Locale locale)
{
if (headerTextView == null)
{
// Material Design formatted CalendarView being used, need to do API level check and skip on older APIs
var id = base.Resources.GetIdentifier("date_picker_header_date", "id", "android");
headerTextView = dialog.DatePicker.FindViewById<TextView>(id);
headerDatePatternLocale = Android.Text.Format.DateFormat.GetBestDateTimePattern(locale, "EMMMd");
monthDayFormatLocale = new SimpleDateFormat(headerDatePatternLocale, locale);
headerTextView.SetTextColor(Android.Graphics.Color.Red);
headerTextView.TextChanged += (sender, e) =>
{
headerChangeFlag = !headerChangeFlag;
if (!headerChangeFlag)
return;
SetHeaderMonthDay(dialog, locale);
};
}
var selectedDateLocale = monthDayFormatLocale.Format(new Date((long)dialog.DatePicker.DateTime.ToUniversalTime().Subtract(
new System.DateTime(1970, 1, 1, 0, 0, 0, System.DateTimeKind.Utc)).TotalMilliseconds));
headerTextView.Text = selectedDateLocale;
}