Запретить локализацию номеров изменений при изменении локализации языка Android.

Я хочу изменить локализацию приложения для Android. но когда я сменил язык на арабский, он изменил все номера на арабский, чтобы приложение разбилось. Я хочу изменить язык на арабский язык и не менять язык с номерами с английского.

 Locale locale = new Locale(AppConfig.Language);
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = "ar";
    getBaseContext().getResources().updateConfiguration(config,
            getBaseContext().getResources().getDisplayMetrics());
    setContentView(R.layout.activity_main);

когда я хочу использовать gps get location, он возвращает числа в арабском как я могу помешать ему изменить язык номеров?

Ответ 1

Я знаю, что этот ответ слишком поздний, но он может помочь кому-то в будущем. Я боролся с этим несколько дней, но нашел легкое решение. просто укажите страну как второй параметр. Потому что некоторые страны используют арабскую цифру, а другие используют так называемые индуистские цифры

Locale locale = new Locale(LanguageToLoad,"MA");//For Morocco to use 0123...

или

Locale locale = new Locale(LanguageToLoad,"SA");//For Saudi Arabia to use ٠١٢٣...

Ответ 2

Основано Здесь есть дополнение, поэтому вам не нужно изменять весь код.

Там такая проблема в Google bugtracker: арабские цифры на арабском языке с использованием индусско-арабской цифровой системы

Если конкретный язык в Египте не работает из-за какой-либо проблемы с клиентом (я могу это понять), вы можете отформатировать строку в любом другом западном регионе. Например:

 NumberFormat nf = NumberFormat.getInstance(new Locale("en","US")); //or "nb","No" - for Norway
 String sDistance = nf.format(distance);
 distanceTextView.setText(String.format(getString(R.string.distance), sDistance));

Если решение с новым Locale не работает вообще, существует уродливое обходное решение:

public String replaceArabicNumbers(String original) {
    return original.replaceAll("١","1")
                    .replaceAll("٢","2")
                    .replaceAll("٣","3")
                    .....;
}

(и вариации вокруг него с использованием Unicodes (U + 0661, U + 0662,...). См. более похожие идеи здесь)

Upd1: Чтобы избежать вызова строк форматирования один за другим повсюду, я бы предложил создать крошечный метод Tool:

public final class Tools {

    static NumberFormat numberFormat = NumberFormat.getInstance(new Locale("en","US"));

    public static String getString(Resources resources, int stringId, Object... formatArgs) {
        if (formatArgs == null || formatArgs.length == 0) {
            return resources.getString(stringId, formatArgs);
        }

        Object[] formattedArgs = new Object[formatArgs.length];
        for (int i = 0; i < formatArgs.length; i++) {
            formattedArgs[i] = (formatArgs[i] instanceof Number) ?
                                  numberFormat.format(formatArgs[i]) :
                                  formatArgs[i];
        }
        return resources.getString(stringId, formattedArgs);
    }
}

....

distanceText.setText(Tools.getString(getResources(), R.string.distance, 24));

Или переопределить значение по умолчанию TextView и обработать его в setText(CharSequence text, BufferType type)

public class TextViewWithArabicDigits extends TextView {
    public TextViewWithArabicDigits(Context context) {
        super(context);
    }

    public TextViewWithArabicDigits(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        super.setText(replaceArabicNumbers(text), type);
    }

    private String replaceArabicNumbers(CharSequence original) {
        if (original != null) {
            return original.toString().replaceAll("١","1")
                    .replaceAll("٢","2")
                    .replaceAll("٣","3")
                    ....;
        }

        return null;
    }
}

Надеюсь, это поможет

Ответ 3

Можно установить локаль для отдельного TextView или элементов, которые расширяют его в вашем приложении.
см. http://developer.android.com/reference/android/widget/TextView.html#setTextLocale(java.util.Locale) для получения дополнительной информации

UPDATE
Вы можете использовать следующий метод для синтаксического анализа номера в локали, которую вы хотите

public static String nFormate(double d) {
    NumberFormat nf = NumberFormat.getInstance(Locale.ENGLISH);
    nf.setMaximumFractionDigits(10);
    String st= nf.format(d);
    return st;
}


Затем вы можете разыграть номер, чтобы снова удвоить

Ответ 4

Лучший и простой способ - сохранить номер во всех строковых файлах, как есть, во всех строках локализации. Или вам нужно перевести каждую строку чисел в числа