Установить язык на французский в android DatePickerDialog

Есть ли способ показать дату в 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);

Вместо пт, 21 ноября 2014 г. Я хочу иметь французскую аббревиатуру Я также добавил, что до его создания:

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

Ответ 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();

Я надеюсь, что это поможет кому-то.

Ответ 2

У меня была почти аналогичная проблема, и я нашел решение для этого ответа здесь

В моем случае мне нужно:

  • имеют метод 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);
        }
    
    }
    
  • для вызова initPicker(context) перед вызовом метода picker.init(...) в onViewCreated моего пользовательского виджета

  • Определите short_months в res/values ​​/arrays.xml

    <string-array name="months_values">
        <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>
    
  • Определите short_months в res/values-ru/arrays.xml(в этом вопросе должны быть аналоговые res/values-fr/arrays.xml)

    <string-array name="months_values">
        <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>
    

Ответ 3

Соответствующие классы:

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 для реализации собственного календаря (вы можете получить календарь, но вы не можете установить календаря). Вы всегда можете реализовать свой собственный диалог.

Также я нашел эту библиотеку с открытым исходным кодом на веб-странице .

Он указывает, что он будет обрабатывать локальные настройки. Не пробовал, хотя.

Ответ 4

Ответ Игоря мне очень помог. Но я хотел бы добавить, что вы можете столкнуться с NoSuchMethodException, как указал DoubleK, потому что в некоторых реализациях TimePicker и DatePicker существуют отдельные классы, такие как TimePickerSpinnerDelegate и DatePicker.DatePickerSpinnerDelegate, которые содержат эти переменные и методы, Вот как я обновил сборщики (для API 14 +):

private void initPicker(Object object, String[] values) {
        try {
            Field[] fields = object.getClass().getDeclaredFields();

            for (Field field : fields) {
                // If there 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));

после создания представлений, и все работает так, как ожидалось.