kin*_*ton 13 android locale arabic
编辑
我正在将我的应用移植到阿拉伯语区域设置.我有一些带有以下参数的getString():
getString(R.string.distance, distance)
Run Code Online (Sandbox Code Playgroud)
哪里 <string name="distance">%1d km</string>
要求是在阿拉伯语中我应该这样表达:"2.3كم".
如果我设置为沙特阿拉伯(country ="sa")或阿联酋(country ="ae")的区域设置,则数字以东方阿拉伯语显示,但我的客户希望使用西方阿拉伯语.
这里的解决方案是使用埃及作为当地的国家,但这对我来说是不可能的.
我试过了:
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public void setAppContextLocale(Locale savedLocale) {
Locale.Builder builder = new Locale.Builder();
builder.setLocale(savedLocale).setExtension(Locale.UNICODE_LOCALE_EXTENSION, "nu-latn");
Locale locale = builder.build();
Configuration config = new Configuration();
config.locale = locale;
config.setLayoutDirection(new Locale(savedLocale.getLanguage()));
mAppContext.getResources().updateConfiguration(config, mContext.getResources().getDisplayMetrics());
}
Run Code Online (Sandbox Code Playgroud)
Kon*_*nov 23
在谷歌的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));
Run Code Online (Sandbox Code Playgroud)
如果使用new的解决方案Locale根本不起作用,那么有一个丑陋的解决方法:
public String replaceArabicNumbers(String original) {
return original.replaceAll("?","1")
.replaceAll("?","2")
.replaceAll("?","3")
.....;
}
Run Code Online (Sandbox Code Playgroud)
(以及与Unicodes匹配的变体(U + 0661,U + 0662,...).在这里查看更多类似的想法)
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));
Run Code Online (Sandbox Code Playgroud)
或者覆盖默认值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;
}
}
Run Code Online (Sandbox Code Playgroud)
我希望,这有帮助
有一个简单的方法。取整数并将其格式化为字符串,它将通过此方法隐式地将本地化应用于数字:
String YourNumberString = String.format("%d", YourNumberInteger);
Run Code Online (Sandbox Code Playgroud)
所以123将变成??? 等等。
有关更多信息,请参见以下网址的 “格式编号”部分:https: //developer.android.com/training/basics/supporting-devices/languages
| 归档时间: |
|
| 查看次数: |
10887 次 |
| 最近记录: |