サーチ…


通貨

Currency currency = Currency.getInstance("USD");
NumberFormat format = NumberFormat.getCurrencyInstance();
format.setCurrency(currency);
format.format(10.00);

Androidアプリに翻訳を追加する

新しい言語ごとに異なるstrings.xmlファイルを作成する必要があります。

  1. resフォルダを右クリックします。
  2. 新規値リソースファイルを選択します。
  3. 使用可能な修飾子からロケールを選択する
  4. [ 次へ ]ボタン(>>)をクリックします。
  5. 言語を選択
  6. ファイルにstrings.xmlという名前を付けます。

strings.xml

<resources>
    <string name="app_name">Testing Application</string>
    <string name="hello">Hello World</string>
</resources>

strings.xml(hi)

<resources>
    <string name="app_name">परीक्षण आवेदन</string>
    <string name="hello">नमस्ते दुनिया</string>
</resources>

プログラムで言語を設定する:

public void setLocale(String locale) // Pass "en","hi", etc.
{
    myLocale = new Locale(locale);
    // Saving selected locale to session - SharedPreferences.
    saveLocale(locale);
    // Changing locale.
    Locale.setDefault(myLocale);
    android.content.res.Configuration config = new android.content.res.Configuration();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        config.setLocale(myLocale);
    } else {
        config.locale = myLocale;
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        getBaseContext().createConfigurationContext(config);
    } else {
        getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
    }
}

上記の関数は、 strings.xmlから参照されるテキストフィールドを変更します。たとえば、次の2つのテキストビューがあるとします。

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:text="@string/app_name"/>
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:text="@string/hello"/>

その後、ロケールを変更した後、 app_namehelloを持つ言語文字列がそれに応じて変更されます。

「res」フォルダの下にあるリソースディレクトリのタイプ

各タイプのリソースをローカライズするには、アンドロイドのプロジェクト構造内に独自のホームがあります。次に、 \resディレクトリの下に置くことができるさまざまなディレクトリを示します。これらの各ディレクトリに配置されているリソースタイプは、次の表で説明されています。

ディレクトリリソースタイプ
アニメーター/ プロパティアニメーションを定義するXMLファイル。
アニメ/ トゥイーンアニメーションを定義するXMLファイル。 (プロパティアニメーションもこのディレクトリに保存できますが、プロパティアニメーションでは2つのタイプを区別するためにアニメータ/ディレクトリが優先されます)。
色/ 色の状態リストを定義するXMLファイル。カラーステートリストリソースを参照してください。
ドロアブル/ "ビットBitmap files - Nine-Patches (re-sizable bitmaps) - State lists - Shapes - Animation drawables - Other drawables - "サイズ変更可能なBitmap files - Nine-Patches (re-sizable bitmaps) - State lists - Shapes - Animation drawables - Other drawables - "ビットマップファイル(.png、.9.png、.jpg、.gif)、または以下の描画可能リソースサブタイプにコンパイルされたXMLファイル。 Bitmap files - Nine-Patches (re-sizable bitmaps) - State lists - Shapes - Animation drawables - Other drawables - "
ミップマップ/ 異なるランチャーアイコン密度のための描画可能なファイル。ミップマップ/フォルダを使用したランチャーアイコンの管理の詳細については、「プロジェクトの管理の概要」を参照してください。
レイアウト/ ユーザーインターフェイスのレイアウトを定義するXMLファイル。レイアウトリソースを参照してください。
メニュー/ オプションメニュー、コンテキストメニュー、サブメニューなど、アプリケーションメニューを定義するXMLファイル。メニューリソースを参照してください。
生/ 生の形式で保存する任意のファイル。未処理のInputStreamでこれらのリソースを開くには、リソースID(R.raw.filename)を使用してResources.openRawResource()を呼び出します。
ただし、元のファイル名とファイル階層にアクセスする必要がある場合は、いくつかのリソースをassets /ディレクトリ(res / raw /の代わりに)に保存することを検討することもできます。アセットファイル/はリソースIDが与えられていないため、AssetManagerを使用して読み取ることができます。
値/ 文字列、整数、色、スタイル、テーマなどの単純な値を含むXMLファイル
xml / Resources.getXML()を呼び出して実行時に読み取ることができる任意のXMLファイル。検索可能な構成など、さまざまなXML構成ファイルをここに保存する必要があります。

"res"ディレクトリ下の各フォルダの構成タイプと修飾子名

resフォルダの下の各リソースディレクトリ(上の例に挙げられている)は、同様の名前のディレクトリ内に含まれているさまざまなバリエーションを、各configuration-typeごとに異なるqualifier-valuesをつけてサフィックスとして持つことがconfiguration-type

``アンドロイドプロジェクトで頻繁に見られる修飾語の接尾辞が異なる ``ディレクトリのバリエーションの例:

  • ドロアブル/
  • drawable-en /
  • drawable-fr-rCA /
  • drawable-en-port /
  • drawable-en-notouch-12key /
  • drawable-port-ldpi /
  • drawable-port-notouch-12key /

すべての異なる設定タイプとアンドロイドリソースの修飾子の値の完全なリスト:

構成修飾子の値
MCCとMNC 例:
mcc310
mcc310-mnc004
mcc208-mnc00
言語と地域 例:
エン
fr
en-rUS
fr-rFR
fr-rCA
レイアウトの方向 ldrtl
ldltr
smallestWidth swdp
例:
sw320dp
sw600dp
sw720dp
使用可能な幅 wdp
w720dp
w1024dp
使用可能な高さ hdp
h720dp
h1024dp
画面サイズ 小さい
正常
×ラージ
画面のアスペクト 長いです
長くない
ラウンドスクリーン 円形
notround
画面の向き
土地
UIモード
テレビ
アプライアンスウォッチ
ナイトモード
夜はない
スクリーンピクセル密度(dpi) ldpi
mdpi
hdpi
xhdpi
xxhdpi
xxxhdpi
nodpi
tvdpi
anydpi
タッチスクリーンタイプ 触らないで
キーボードの可用性 キーを押した
鍵隠れ
keyssoft
主なテキスト入力方法 ノーキー
QWERTY
12キー
ナビゲーションキーの可用性 未公開
ナビゲート
一次非タッチナビゲーション方式 ノンアブ
dpad
トラックボール
ホイール
プラットフォームバージョン(APIレベル) 例:
v3
v4
v7

プログラムでロケールのアンドロイドアプリケーションを変更する

上記の例では、アプリケーションのリソースをローカライズする方法を理解しています。次の例では、アプリケーションではなくアプリケーション内でアプリケーションのロケールを変更する方法を説明します。アプリケーションロケールのみを変更するには、以下のロケールutilを使用します。

import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.preference.PreferenceManager;
import android.view.ContextThemeWrapper;

import java.util.Locale;

/**
 * Created by Umesh on 10/10/16.
 */
public class LocaleUtils {

    private static Locale mLocale;

    public static void setLocale(Locale locale){
        mLocale = locale;
        if(mLocale != null){
            Locale.setDefault(mLocale);
        }
    }

    public static void updateConfiguration(ContextThemeWrapper wrapper){
        if(mLocale != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
            Configuration configuration = new Configuration();
            configuration.setLocale(mLocale);
            wrapper.applyOverrideConfiguration(configuration);
        }
    }

    public static void updateConfiguration(Application application, Configuration configuration){
        if(mLocale != null && Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1){
            Configuration config = new Configuration(configuration);
            config.locale = mLocale;
            Resources res = application.getBaseContext().getResources();
            res.updateConfiguration(configuration, res.getDisplayMetrics());
        }
    }

    public static void updateConfiguration(Context context, String language, String country){
        Locale locale = new Locale(language,country);
        setLocale(locale);
        if(mLocale != null){
            Resources res = context.getResources();
            Configuration configuration = res.getConfiguration();
            configuration.locale = mLocale;
            res.updateConfiguration(configuration,res.getDisplayMetrics());
        }
    }




    public static String getPrefLangCode(Context context) {
        return PreferenceManager.getDefaultSharedPreferences(context).getString("lang_code","en");
    }

    public static void setPrefLangCode(Context context, String mPrefLangCode) {

        SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
        editor.putString("lang_code",mPrefLangCode);
        editor.commit();
    }

    public static  String getPrefCountryCode(Context context) {
        return PreferenceManager.getDefaultSharedPreferences(context).getString("country_code","US");
    }

    public static void setPrefCountryCode(Context context,String mPrefCountryCode) {

        SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
        editor.putString("country_code",mPrefCountryCode);
        editor.commit();
    }
}

ユーザーが優先するロケールをApplicationクラスから初期化します。

public class LocaleApp extends Application{

    @Override
    public void onCreate() {
        super.onCreate();

        LocaleUtils.setLocale(new Locale(LocaleUtils.getPrefLangCode(this), LocaleUtils.getPrefCountryCode(this)));
        LocaleUtils.updateConfiguration(this, getResources().getConfiguration());
    }
}

また、基本アクティビティを作成し、このアクティビティを他のすべてのアクティビティに拡張して、アプリケーションのロケールを次のように1箇所だけ変更できるようにする必要があります。

public abstract class LocalizationActivity extends AppCompatActivity {

    public LocalizationActivity() {
        LocaleUtils.updateConfiguration(this);
    }

    // We only override onCreate
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

}

注:常にロケールをコンストラクターで初期化してください。

これで、LocalizationActivityを以下のように使用できます。

public class MainActivity extends LocalizationActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }
}

注:プログラムのロケールをプログラムで変更する場合は、ロケールの変更を有効にするためにアクティビティを再起動する必要があります。このソリューションで正しく動作するためには、アプリケーションの起動時に共有の環境設定からロケールを使用してくださいandroid:name=".LocaleApp" inあなたManifest.xml。

リントチェッカーが、リリースビルドの作成を促すことがあります。このような問題を解決するには、以下のオプションを実行します。

最初:

一部の文字列の変換を無効にする場合は、デフォルトのstring.xmlに次の属性を追加します

<string name="developer" translatable="false">Developer Name</string>

二番目:

次の属性を追加するリソースファイルからすべての欠落している変換を無視します。次のように、文字列ファイル内のツールの名前空間の無視属性です。

<?xml version="1.0" encoding="utf-8"?>
<resources
  xmlns:tools="http://schemas.android.com/tools"
  tools:ignore="MissingTranslation" >
http://stackoverflow.com/documentation/android/3345/localization-with-resources-in-android#
  <!-- your strings here; no need now for the translatable attribute -->

</resources>

三番:

翻訳不可能な文字列を無効にする別の方法

http://tools.android.com/recent/non-translatablestrings

翻訳すべきではないリソースがたくさんある場合は、それらをdonottranslate.xmlという名前のファイルに置くことができ、lintはそのすべてを翻訳不可能なリソースと見なします。

第4:

リソースファイルにロケールを追加することもできます

<resources
xmlns:tools="http://schemas.android.com/tools"
    tools:locale="en" tools:ignore="MissingTranslation">

また、app / build.gradleからlintの翻訳チェックが欠けているのを無効にすることもできます

lintOptions {
        
        disable 'MissingTranslation'
    }


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow