Android
Androidでのリソースによるローカライゼーション
サーチ…
通貨
Currency currency = Currency.getInstance("USD");
NumberFormat format = NumberFormat.getCurrencyInstance();
format.setCurrency(currency);
format.format(10.00);
Androidアプリに翻訳を追加する
新しい言語ごとに異なるstrings.xml
ファイルを作成する必要があります。
- resフォルダを右クリックします。
- 新規 → 値リソースファイルを選択します。
- 使用可能な修飾子からロケールを選択する
- [ 次へ ]ボタン(>>)をクリックします。
- 言語を選択
- ファイルに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_name
とhello
を持つ言語文字列がそれに応じて変更されます。
「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'
}