Load language specific string from resource?
Solution 1:
Looking in the documentation, this looks promising:
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);
In other words, create a new Resources object configured to a standard locale.
Solution 2:
From my own question and taking reference from this answer and this answer, I came up with the following custom class solution:
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);
}
}
}