web-dev-qa-db-ja.com

Androidのアラビア語テキストのアラビア数字

[〜#〜]編集[〜#〜]

アプリをアラビア語のロケールに移植しています。次のようなパラメータを持つgetString()があります:

getString(R.string.distance, distance)

どこ <string name="distance">%1d km</string>

要件は、アラビア語では「2.3كم」のように表示することです。

サウジアラビア(国= "sa")またはUAE(国= "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());
}

この質問 で提案されていますが、その後は国が無視されるため、SAとAEロケールの両方がデフォルトファイルの文字列を使用します。

16
kingston

以下のようにTypeFaceをアラビア語に設定します

Typeface font = Typeface.createFromAsset(getAssets(), "fonts/abcd.TTF");

abcdはアラビア語フォントです。

textview.setTypeface(font);
2

Googleのバグトラッカーにそのような問題があります: アラビア語のアラビア数字で、ヒンドゥー語-アラビア数字システムではありません

一部のお客様の問題のために特にエジプトのロケールが機能しない場合(私はそれを理解できます)、文字列を他の西欧のロケールにフォーマットできます。例えば:

_ 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));
_

New Localeを使用したソリューションがまったく機能しない場合は、醜い回避策があります。

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

(およびUnicodeに一致する(U + 0661、U + 0662、...)の周囲のバリエーション。同様のアイデアをもっと見る here

Upd1:書式化文字列を1つずつ呼び出さないようにするには、小さなツールメソッドを作成することをお勧めします。

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

それが役に立てば幸い

25

簡単な方法があります。あなたの整数を取り、それを文字列にフォーマットします、そしてそれはこの方法によって暗黙的に数値にローカライズを適用します:

String YourNumberString = String.format("%d", YourNumberInteger);

したがって、123はbecomeなどになります。

詳細については、次のセクションの「フォーマット番号」を参照してください。 https://developer.Android.com/training/basics/supporting-devices/languages

7
MohammadL

デフォルトのロケールは、システムプロパティ設定からアプリケーションプロセスの実行時に静的に構築されるため、アプリケーションの起動時にそのデバイスで選択されたロケールを表します。通常、これで問題ありませんが、アプリケーションプロセスの実行後にユーザーが設定でロケールを変更した場合、getDefaultLocale()の値はおそらくすぐには更新されません。

アプリケーションで何らかの理由でこのようなイベントをトラップする必要がある場合は、代わりに、リソースのConfigurationオブジェクトから利用可能なロケールを取得してみてください。

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

アプリケーションで必要な場合は、設定の変更後、この値がより速く更新されることがあります。

        // please try below code
 double distance = 2.3; // ex. distance is 2.3
        Locale current = getResources().getConfiguration().locale; //get current locale
        Log.d("Locale", current + " ");


        if(current.toString().equals("ar_EG")){ //for arabic
            char[] arabicChars = {'٠','١','٢','٣','٤','٥','٦','٧','٨','٩'};
            StringBuilder builder = new StringBuilder();
            String str="2.3";
            for(int i =0;i<str.length();i++)
            {
                if(Character.isDigit(str.charAt(i)))
                {
                    builder.append(arabicChars[(int)(str.charAt(i))-48]);
                }
                else
                {
                    builder.append(str.charAt(i));
                }
            }
            Log.d("Locale"," " +builder.toString()+" كم"); // get distance in arabic كم ٢.٣
        }else if (current.toString().equals("en_US")){
            Log.d("Locale"," " +distance+" KM"); // get distance in us english 2.3 KM
        }
1
Krunal Patel