package joaocsousa.github.com.myapplication; import android.content.Context; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.annotation.StringRes; import android.support.v4.view.LayoutInflaterCompat; import android.support.v7.app.AppCompatActivity; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; import java.util.HashMap; import java.util.Locale; import java.util.Map; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { LayoutInflaterCompat.setFactory2(getLayoutInflater(), new CustomLayoutInflater(this, new StringIdExtractor(), new Translations())); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public static class CustomLayoutInflater implements LayoutInflater.Factory2 { private final AppCompatActivity appCompatActivity; private final StringIdExtractor stringIdExtractor; private final Translations translations; public CustomLayoutInflater(AppCompatActivity appCompatActivity, StringIdExtractor stringIdExtractor, Translations translations) { this.appCompatActivity = appCompatActivity; this.stringIdExtractor = stringIdExtractor; this.translations = translations; } @Override public View onCreateView(View parent, String name, Context context, AttributeSet attributeSet) { View view = appCompatActivity.getDelegate().createView(parent, name, context, attributeSet); if (view == null) { view = appCompatActivity.onCreateView(parent, name, context, attributeSet); } if (view == null) { view = appCompatActivity.onCreateView(name, context, attributeSet); } if (view != null && view instanceof TextView) { int stringId = stringIdExtractor.getStringId(attributeSet); String translation = translations.getTranslationFor(stringId); ((TextView) view).setText(translation); } return view; } @Override public View onCreateView(String name, Context context, AttributeSet attributeSet) { return null; } } public static class StringIdExtractor { public static final int NOT_FOUND = Integer.MIN_VALUE; private static final String NAMESPACE = "http://schemas.android.com/apk/res/android"; private static final String TAG_TEXT = "text"; @StringRes public int getStringId(@Nullable AttributeSet attributeSet) { if (attributeSet == null) { return NOT_FOUND; } String stringId = attributeSet.getAttributeValue(NAMESPACE, TAG_TEXT); if (stringId != null) { stringId = stringId.replace("@", ""); try { return Integer.valueOf(stringId); } catch (NumberFormatException e) { return NOT_FOUND; } } return NOT_FOUND; } } public static class Translations { private static final Map enTranslations = new HashMap<>(); private static final Map frTranslations = new HashMap<>(); private static final Map DEFAULT_TRANSLATIONS = enTranslations; static { enTranslations.put(R.string.whatever, "Whatever (English)"); frTranslations.put(R.string.whatever, "Whatever (French)"); enTranslations.put(R.string.hello, "Hello (English)"); frTranslations.put(R.string.hello, "Hello (French)"); } public String getTranslationFor(@StringRes int resId) { if (Locale.getDefault().getISO3Language().equals(Locale.FRANCE.getISO3Language())) { return frTranslations.get(resId); } else if (Locale.getDefault().getISO3Language().equals(Locale.UK.getISO3Language())) { return enTranslations.get(resId); } else { return DEFAULT_TRANSLATIONS.get(resId); } } } }