Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Load language specific string from resource?

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

like image 887
Harald Wilhelm Avatar asked Mar 09 '11 11:03

Harald Wilhelm


2 Answers

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.

like image 50
Anomie Avatar answered Sep 19 '22 19:09

Anomie


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);         }     } } 
like image 24
brandall Avatar answered Sep 17 '22 19:09

brandall