At one point in one of my Android apps I need to load strings of a specific language. For example:
values: <string name="txt_help">Help</string> values-de: <string name="txt_help">Hilfe</string> values-fr: <string name="txt_help">Aider</string>
Now I need the default (values) text.
Is there a way to load the key "txt_help" with a given language "en"? I can't find a method where I can set a locale as an additional parameter.
Or can I create a new ResourceManager with a given locale and read the String through this resource object?
Many thanks in advance. hjw
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.
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); } } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With