【问题标题】:Set language to French in android DatePickerDialog在 android DatePickerDialog 中将语言设置为法语
【发布时间】:2014-02-10 23:32:59
【问题描述】:

有什么方法可以在法语DatePickerDialog 中显示日期

我已经搜索过这个但没有找到结果

这是我的代码:

 Calendar c = Calendar.getInstance();

 picker = new DatePickerDialog(PaymentView.this, 
                               PaymentView.this,
                   c.get(Calendar.YEAR), 
                               c.get(Calendar.MONTH),
                   c.get(Calendar.DAY_OF_MONTH));

 picker.setIcon(R.drawable.ic_launcher);
 picker.setTitle("Choisir la date");
 picker.getDatePicker().setMinDate(System.currentTimeMillis() - 2000);

我想要法语缩写而不是 2014 年 11 月 21 日星期五 在实例化它之前我还添加了:

 Locale locale = new Locale("FR");
 Locale.setDefault(locale);
 Configuration config = new Configuration();
 config.locale = locale;
 getApplicationContext().getResources().updateConfiguration(config, null);

【问题讨论】:

  • 你能给我你提到的那个例子的法语缩写吗?
  • 我不太清楚,但可能是“Ven 21 Nov 2014”
  • DatePicker 使用手机的默认语言设置。你为什么要改变它?如果电话设置为法语,则格式将为法语格式。

标签: android localization datepicker


【解决方案1】:

我成功了!

我在所有 DatePickerDialog 内容之前添加了这两行:

Locale locale = getResources().getConfiguration().locale;
Locale.setDefault(locale);

然后:

Calendar c = Calendar.getInstance();
int mYear = c.get(Calendar.YEAR);
int mMonth = c.get(Calendar.MONTH);
int mDay = c.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dialog = new DatePickerDialog(MainActivity.this,
            this, mYear, mMonth, mDay);
dialog.getDatePicker().setMaxDate(c.getTimeInMillis());
dialog.setTitle(R.string.main_first_day_of_your_last_period);
dialog.show();

我希望它对某人有所帮助。

【讨论】:

  • 嗨@lightbyte,它会更改顶部显示日期,但不会更改月份名称的星期几。仍然是 M、T、W 等。
【解决方案2】:

你可以在DatePicker之前添加这个声明:

Locale.setDefault(Locale.FRANCE);

【讨论】:

  • 如果应用程序在您的应用程序中有其他本地化部分,请小心,因为一旦打开对话框,这将更改所有应用程序本地化。
  • 这似乎并未翻译所有日期选择器窗口,仅翻译 Fri, Nov 21, 2014 标题,但未翻译月份和日期列名。
【解决方案3】:

我遇到了几乎类似的问题,我找到了这个答案的解决方案here

就我而言,我需要:

  1. 有来自链接的initPicker(context) 方法

     /**
      * Use reflection to use the Locale of the application for the month spinner.
      * 
      * PS: DAMN DATEPICKER DOESN'T HONOR Locale.getDefault()
      * <a href="http://code.google.com/p/android/issues/detail?id=25107">Bug Report</a>
      * @param context
      */
     public void initPicker(Context context) {
         String monthPickerVarName;
         String months[] =  context.getResources().getStringArray(R.array.short_months);
    
         if (Build.VERSION.SDK_INT >= 14) {
             monthPickerVarName = "mMonthSpinner";
         } else {
             monthPickerVarName = "mMonthPicker";
         }
    
         try {
             Field f[] = mDatePicker.getClass().getDeclaredFields();
    
             for (Field field : f) {
                 if (field.getName().equals("mShortMonths")) {
                     field.setAccessible(true);
                     field.set(mDatePicker, months); 
                 } else if (field.getName().equals(monthPickerVarName)) {
                     field.setAccessible(true);
                     Object o = field.get(mDatePicker);
                     if (Build.VERSION.SDK_INT >= 14) {
                         Method m = o.getClass().getDeclaredMethod("setDisplayedValues", String[].class);
                         m.setAccessible(true);
                         m.invoke(o, (Object)months);
                     } else {
                         Method m = o.getClass().getDeclaredMethod("setRange", int.class, int.class, String[].class);
                         m.setAccessible(true);
                         m.invoke(o, 1, 12, (Object)months);
                     }
                 }
             }
    
         } catch (Exception e) {
             Log.e(TAG, e.getMessage(), e);
         }
    
         try {
             final Method updateSpinner = mDatePicker.getClass().getDeclaredMethod("updateSpinners");
             updateSpinner.setAccessible(true);
             updateSpinner.invoke(mDatePicker);
             updateSpinner.setAccessible(false);
    
    
         } catch (Exception e) {
             Log.e(TAG, e.getMessage(), e);
         }
    
     }
    
  2. 在我的自定义小部件的onViewCreated 方法中调用picker.init(...) 之前调用initPicker(context)

  3. 在 res/values/arrays.xml 中定义 short_months

     <string-array name="short_months">
         <item>Jan</item>
         <item>Feb</item>
         <item>Mar</item>
         <item>Apr</item>
         <item>May</item>
         <item>Jun</item>
         <item>Jul</item>
         <item>Aug</item>
         <item>Sep</item>
         <item>Oct</item>
         <item>Nov</item>
         <item>Dec</item>
     </string-array>
    
  4. 在 res/values-ru/arrays.xml 中定义 short_months(本题必须是模拟 res/values-fr/arrays.xml)

     <string-array name="short_months">
         <item>Янв</item>
         <item>Фев</item>
         <item>Мар</item>
         <item>Апр</item>
         <item>Май</item>
         <item>Июн</item>
         <item>Июл</item>
         <item>Авг</item>
         <item>Сеп</item>
         <item>Окт</item>
         <item>Ноя</item>
         <item>Дек</item>
     </string-array>
    

编辑:拼写错误的月份值已替换为数组中的短月份。

【讨论】:

  • 大家好,你能告诉我在你的应用程序中设置了哪个 min, target API,因为我在这一行得到 java.lang.NoSuchMethodException: updateSpinner []: final Method updateSpinner = mDatePicker.getClass ().getDeclaredMethod("updateSpinner");
  • 在我的应用程序中它是 16 和 21。我们可以看到 API 级别 9 中添加了 getDeclaredMethod() 方法。这意味着该解决方案不适用于设备低于 API 级别 9。如果您正在为低于 API 级别的设备进行开发,则只需将此解决方案用于 API 级别 9 的设备和用于其他设备的非本地化/替代解决方案。也许您可以使用 getDeclaringMethods() 方法获取所有方法,然后遍历它们。 (只是提示,我没试过。)
  • @IgorK 如何使用TimepickerDialog
  • @SagarHudge 我不知道本地化 TimePickerDialog 是什么意思。正如我所见,这里有两种类型的时间选择器:stackoverflow.com/questions/18208082/…(下午 12 点/上午和仅 24 小时)。你的用例是什么?我怀疑所有语言都需要 am/pm 类型。
  • 这是一个漫长的过程,android日期选择器直接从上下文中直接选择应用的语言,试试这个答案-stackoverflow.com/a/57889138/3448003
【解决方案4】:

相关类:

http://developer.android.com/reference/android/app/DatePickerDialog.html http://developer.android.com/reference/android/widget/DatePicker.html http://developer.android.com/reference/android/widget/CalendarView.html

目前,我认为没有任何可能使用标准选项来使用本地化选项或重用 timepickerdialog 和 datepicker 实现来实现您自己的日历视图(您可以获得日历视图,但不能设置日历视图)。您始终可以实现自己的自定义对话框。

我还在web 上找到了这个开源库。

它表示它将处理本地设置。不过没试过。

【讨论】:

    【解决方案5】:

    伊戈尔的回答对我帮助很大。但是我想补充一点,正如 DoubleK 指出的那样,您可能会遇到NoSuchMethodException,因为在某些TimePickerDatePicker 实现中,有单独的类,例如TimePickerSpinnerDelegateDatePicker.DatePickerSpinnerDelegate,其中包含这些变量和方法.以下是我更新选择器的方式(适用于 API 14+):

    private void initPicker(Object object, String[] values) {
            try {
                Field[] fields = object.getClass().getDeclaredFields();
    
                for (Field field : fields) {
                    // If there's a delegate, we use it instead.
                    if (field.getName().equals("mDelegate")) {
                        field.setAccessible(true);
                        object = field.get(object);
                        fields = object.getClass().getDeclaredFields();
                        break;
                    }
                }
    
                for (Field field : fields) {
                    if (field.getName().equals("mAmPmStrings") ||
                            field.getName().equals("mShortMonths")) {
                        field.setAccessible(true);
                        field.set(object, values);
                    } else if (field.getName().equals("mAmPmSpinner") ||
                            field.getName().equals("mMonthSpinner")) {
                        field.setAccessible(true);
                        Object innerObject = field.get(object);
                        Method method = innerObject.getClass().getDeclaredMethod(
                                "setDisplayedValues", String[].class);
                        method.setAccessible(true);
                        method.invoke(innerObject, (Object) values);
                    }
                }
    
                Method[] methods = object.getClass().getDeclaredMethods();
    
                for (Method method : methods) {
                    if (method.getName().equals("updateAmPmControl") ||
                            method.getName().equals("updateSpinners")) {
                        method.setAccessible(true);
                        method.invoke(object);
                        break;
                    }
                }
            } catch (Exception e) {
                Log.e(APP_TAG, e.getMessage(), e);
            }
        }
    

    所以我只是打电话

    initPicker(timePicker, resources.getStringArray(R.array.am_pm));
    

    initPicker(datePicker, resources.getStringArray(R.array.calendar_months));
    

    在创建视图并且一切都按预期工作之后。

    【讨论】:

      【解决方案6】:

      您可以尝试更改 DateDialogPicker 对话框的上下文。每当出现此类问题时,大部分时间都是由于您当前的上下文。

      我遇到了同样的问题,有时我可以更改语言但有时不能,所以我尝试更改上下文,现在它工作正常。在它是片段上下文(requireContext())之前如下 -

      datePickerDialog = DatePickerDialog(
                  requireContext(), R.style.TimePickerTheme.....
      

      但后来我改为下面的(活动上下文 - requireActivity()),它工作正常 -

      datePickerDialog = DatePickerDialog(
                  requireActivity(), R.style.TimePickerTheme.....
      

      【讨论】:

        猜你喜欢
        • 2022-06-23
        • 2021-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-21
        相关资源
        最近更新 更多