更改android语言本地化时防止更改号码本地化

时间:2016-03-20 07:16:02

标签: android

我想更改Android应用程序本地化阿拉伯语 - 英语 但是当我将语言改为阿拉伯语时,它将所有数字都更改为阿拉伯语,以便应用程序崩溃我希望将语言更改为阿拉伯语并防止使用英语更改数字语言。

NAME         ENDPOINTS             AGE
kubernetes   195.234.109.11:6443   14h
tomcat       <none>                14h

当我想使用gps获取位置时,它会以阿拉伯语返回数字 我怎么能阻止它改变数字语言?

5 个答案:

答案 0 :(得分:8)

我知道这个答案为时已晚,但它可以帮助将来的某个人。 几天我一直在努力,但我找到了一个简单的解决方案。 只是将国家设置为第二个参数。因为有些国家使用阿拉伯数字而其他国家使用所谓的印度数字

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

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

答案 1 :(得分:2)

成立Here 有一个补充,所以你不必更改整个代码

谷歌的bugtracker中存在这样的问题:Arabic numerals in arabic language intead of Hindu-Arabic numeral system

如果由于某个客户的问题(我可以理解),特别是埃及语言环境不起作用,那么您可以将字符串格式化为任何其他西方语言环境。例如:

 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,...)。查看更多类似的想法here

<强> Upd1: 为了避免在任何地方逐个调用格式化字符串,我建议创建一个小工具方法:

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;
    }
}

我希望,这有帮助

答案 2 :(得分:1)

可以在应用中为单个TextView或扩展它的元素设置区域设置。
有关详细信息,请参阅http://developer.android.com/reference/android/widget/TextView.html#setTextLocale(java.util.Locale)

<强>更新
您可以使用以下方法将数字解析为所需的语言环境

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


然后你可以解析数字再加倍

答案 3 :(得分:0)

最好和最简单的方法是在所有本地化字符串中保留所有字符串文件中的数字。或者您需要将每个数字字符串转换为数字

答案 4 :(得分:0)

我遇到了同样的问题,解决方案是将数字变量与空字符串连接起来。 例如这样:

public void displayPoints(int:points){
    TextView scoreA = findViewById(R.id.score_id);
    scoreA.setText(""+points);
}

我用了这个

scoreA.setText(""+points);

代替此

scoreA.setText(String.format("%d",points));

这甚至会警告您,硬编码文本无法正确翻译成其他语言,这正是我们在这里想要的:)。