私のAndroidアプリの1つで、特定の言語の文字列をロードする必要があります。例:
values: <string name="txt_help">Help</string>
values-de: <string name="txt_help">Hilfe</string>
values-fr: <string name="txt_help">Aider</string>
ここで、デフォルトの(値)テキストが必要です。
指定された言語「en」でキー「txt_help」をロードする方法はありますか?追加のパラメータとしてロケールを設定できるメソッドが見つかりません。
または、特定のロケールで新しいResourceManagerを作成し、このリソースオブジェクトを介して文字列を読み取ることはできますか?
よろしくお願いします。 hjw
ドキュメント を見ると、これは有望に見えます:
Resources standardResources = context.getResources();
AssetManager assets = standardResources.getAssets();
DisplayMetrics metrics = standardResources.getDisplayMetrics();
Configuration config = new Configuration(standardResources.getConfiguration());
config.locale = Locale.US;
Resources defaultResources = new Resources(assets, metrics, config);
つまり、標準ロケールに構成された新しいResourcesオブジェクトを作成します。
私自身の質問 から、そして この回答 と この回答 から参照して、私は次のカスタムクラスソリューションを思いつきました:
package com.my.package.localisation;
import Android.content.Context;
import Android.content.res.AssetManager;
import Android.content.res.Configuration;
import Android.content.res.Resources;
import Android.os.Build;
import Android.support.annotation.NonNull;
import Android.util.DisplayMetrics;
import Java.util.Formatter;
import Java.util.Locale;
/**
* Class to manage fetching {@link Resources} for a specific {@link Locale}. API levels less
* than {@link Build.VERSION_CODES#JELLY_BEAN_MR1} require an ugly implementation.
* <p/>
* Subclass extends {@link Resources} in case of further functionality requirements.
*/
public class MyResources {
private final Context mContext;
private final AssetManager assetManager;
private final DisplayMetrics metrics;
private final Configuration configuration;
private final Locale targetLocale;
private final Locale defaultLocale;
public MyResources(@NonNull final Context mContext, @NonNull final Locale defaultLocale,
@NonNull final Locale targetLocale) {
this.mContext = mContext;
final Resources resources = this.mContext.getResources();
this.assetManager = resources.getAssets();
this.metrics = resources.getDisplayMetrics();
this.configuration = new Configuration(resources.getConfiguration());
this.targetLocale = targetLocale;
this.defaultLocale = defaultLocale;
}
public String[] getStringArray(final int resourceId) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
configuration.setLocale(targetLocale);
return mContext.createConfigurationContext(configuration).getResources().getStringArray(resourceId);
} else {
configuration.locale = targetLocale;
final String[] resourceArray = new ResourceManager(assetManager, metrics, configuration).getStringArray(resourceId);
configuration.locale = defaultLocale; // reset
new ResourceManager(assetManager, metrics, configuration); // reset
return resourceArray;
}
}
public String getString(final int resourceId) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
configuration.setLocale(targetLocale);
return mContext.createConfigurationContext(configuration).getResources().getString(resourceId);
} else {
configuration.locale = targetLocale;
final String resource = new ResourceManager(assetManager, metrics, configuration).getString(resourceId);
configuration.locale = defaultLocale; // reset
new ResourceManager(assetManager, metrics, configuration); // reset
return resource;
}
}
private final class ResourceManager extends Resources {
public ResourceManager(final AssetManager assets, final DisplayMetrics metrics, final Configuration config) {
super(assets, metrics, config);
}
/**
* Return the string array associated with a particular resource ID.
*
* @param id The desired resource identifier, as generated by the aapt
* tool. This integer encodes the package, type, and resource
* entry. The value 0 is an invalid identifier.
* @return The string array associated with the resource.
* @throws NotFoundException Throws NotFoundException if the given ID does not exist.
*/
@Override
public String[] getStringArray(final int id) throws NotFoundException {
return super.getStringArray(id);
}
/**
* Return the string value associated with a particular resource ID,
* substituting the format arguments as defined in {@link Formatter}
* and {@link String#format}. It will be stripped of any styled text
* information.
* {@more}
*
* @param id The desired resource identifier, as generated by the aapt
* tool. This integer encodes the package, type, and resource
* entry. The value 0 is an invalid identifier.
* @param formatArgs The format arguments that will be used for substitution.
* @return String The string data associated with the resource,
* stripped of styled text information.
* @throws NotFoundException Throws NotFoundException if the given ID does not exist.
*/
@NonNull
@Override
public String getString(final int id, final Object... formatArgs) throws NotFoundException {
return super.getString(id, formatArgs);
}
/**
* Return the string value associated with a particular resource ID. It
* will be stripped of any styled text information.
* {@more}
*
* @param id The desired resource identifier, as generated by the aapt
* tool. This integer encodes the package, type, and resource
* entry. The value 0 is an invalid identifier.
* @return String The string data associated with the resource,
* stripped of styled text information.
* @throws NotFoundException Throws NotFoundException if the given ID does not exist.
*/
@NonNull
@Override
public String getString(final int id) throws NotFoundException {
return super.getString(id);
}
}
}