feat: add multilingual support for UI text in ExtrasActivity, MainActivity, SettingsActivity, and UpdateManager

This commit is contained in:
John Doe
2026-06-27 10:57:45 -07:00
parent dcb538e319
commit db610e4095
4 changed files with 47 additions and 29 deletions
@@ -23,6 +23,8 @@ public class ExtrasActivity extends Activity {
private static final int COLOR_ACCENT = Color.rgb(0, 107, 90);
private static final int COLOR_WARM = Color.rgb(217, 75, 61);
private boolean isEnglish;
private static final String VENI_CREATOR_PRAYER =
"Ven, Esp\u00edritu Creador,\n"
+ "visita las almas de tus fieles\n"
@@ -135,6 +137,8 @@ public class ExtrasActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
isEnglish = UpdateManager.isEnglish(this);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().setStatusBarColor(COLOR_BACKGROUND);
getWindow().setNavigationBarColor(COLOR_BACKGROUND);
@@ -143,6 +147,16 @@ public class ExtrasActivity extends Activity {
setContentView(createScreen());
}
@Override
protected void onResume() {
super.onResume();
boolean currentLanguage = UpdateManager.isEnglish(this);
if (currentLanguage != isEnglish) {
isEnglish = currentLanguage;
recreate();
}
}
@Override
public void onBackPressed() {
if (detailContainer != null && detailContainer.getVisibility() == View.VISIBLE) {
@@ -170,7 +184,7 @@ public class ExtrasActivity extends Activity {
content.addView(createTopBar());
titleText = textView("Extras", 34, COLOR_INK, Typeface.BOLD);
titleText = textView(isEnglish ? "Extras" : "Extras", 34, COLOR_INK, Typeface.BOLD);
titleText.setIncludeFontPadding(false);
LinearLayout.LayoutParams titleParams = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
@@ -221,14 +235,14 @@ public class ExtrasActivity extends Activity {
topBar.setOrientation(LinearLayout.HORIZONTAL);
topBar.setGravity(Gravity.CENTER_VERTICAL);
TextView label = textView("ORACIONES", 12, COLOR_ACCENT, Typeface.BOLD);
TextView label = textView(isEnglish ? "PRAYERS" : "ORACIONES", 12, COLOR_ACCENT, Typeface.BOLD);
topBar.addView(label, new LinearLayout.LayoutParams(
0,
ViewGroup.LayoutParams.WRAP_CONTENT,
1f
));
TextView settings = textView("Ajustes", 15, COLOR_ACCENT, Typeface.BOLD);
TextView settings = textView(isEnglish ? "Settings" : "Ajustes", 15, COLOR_ACCENT, Typeface.BOLD);
settings.setGravity(Gravity.CENTER);
settings.setPadding(dp(14), 0, dp(14), 0);
settings.setBackground(roundedRect(Color.WHITE, dp(8), Color.rgb(219, 226, 222), dp(1)));
@@ -240,7 +254,7 @@ public class ExtrasActivity extends Activity {
settingsParams.setMargins(0, 0, dp(8), 0);
topBar.addView(settings, settingsParams);
TextView home = textView("Inicio", 15, COLOR_ACCENT, Typeface.BOLD);
TextView home = textView(isEnglish ? "Home" : "Inicio", 15, COLOR_ACCENT, Typeface.BOLD);
home.setGravity(Gravity.CENTER);
home.setPadding(dp(14), 0, dp(14), 0);
home.setBackground(roundedRect(Color.WHITE, dp(8), Color.rgb(219, 226, 222), dp(1)));
@@ -316,7 +330,7 @@ public class ExtrasActivity extends Activity {
prayerParams.setMargins(0, dp(16), 0, dp(18));
detailContainer.addView(prayer, prayerParams);
TextView backToList = textView("Volver a extras", 15, COLOR_ACCENT, Typeface.BOLD);
TextView backToList = textView(isEnglish ? "Back to extras" : "Volver a extras", 15, COLOR_ACCENT, Typeface.BOLD);
backToList.setGravity(Gravity.CENTER);
backToList.setPadding(dp(14), 0, dp(14), 0);
backToList.setBackground(roundedRect(Color.WHITE, dp(8), Color.rgb(219, 226, 222), dp(1)));
@@ -337,7 +351,7 @@ public class ExtrasActivity extends Activity {
}
private void showPrayerList() {
titleText.setText("Extras");
titleText.setText(isEnglish ? "Extras" : "Extras");
detailContainer.setVisibility(View.GONE);
listContainer.setVisibility(View.VISIBLE);
scrollToTop();
@@ -195,7 +195,7 @@ public class MainActivity extends Activity {
ViewGroup.LayoutParams.WRAP_CONTENT
));
sourceText = textView("Fuente: Vatican News", 13, COLOR_MUTED, Typeface.NORMAL);
sourceText = textView(isEnglish ? "Source: Vatican News" : "Fuente: Vatican News", 13, COLOR_MUTED, Typeface.NORMAL);
LinearLayout.LayoutParams sourceParams = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
@@ -319,7 +319,7 @@ public class MainActivity extends Activity {
}
private View createExtrasButton() {
TextView button = textView("Extras", 15, Color.WHITE, Typeface.BOLD);
TextView button = textView(isEnglish ? "Extras" : "Extras", 15, Color.WHITE, Typeface.BOLD);
button.setGravity(Gravity.CENTER);
button.setPadding(dp(16), 0, dp(16), 0);
button.setBackground(roundedRect(COLOR_ACCENT, dp(8), Color.TRANSPARENT, 0));
@@ -409,9 +409,9 @@ public class MainActivity extends Activity {
);
quickParams.setMargins(0, dp(10), 0, dp(6));
quickRow.addView(smallCalendarButton("- Año", view -> changeVisibleYear(-1)));
quickRow.addView(smallCalendarButton("Hoy", view -> selectDate(Calendar.getInstance())));
quickRow.addView(smallCalendarButton("+ Año", view -> changeVisibleYear(1)));
quickRow.addView(smallCalendarButton(isEnglish ? "- Year" : "- Año", view -> changeVisibleYear(-1)));
quickRow.addView(smallCalendarButton(isEnglish ? "Today" : "Hoy", view -> selectDate(Calendar.getInstance())));
quickRow.addView(smallCalendarButton(isEnglish ? "+ Year" : "+ Año", view -> changeVisibleYear(1)));
panel.addView(quickRow, quickParams);
LinearLayout weekdays = new LinearLayout(this);
@@ -445,7 +445,7 @@ public class MainActivity extends Activity {
button.setGravity(Gravity.CENTER);
button.setBackground(roundedRect(Color.rgb(229, 244, 240), dp(8), Color.TRANSPARENT, 0));
button.setOnClickListener(listener);
button.setContentDescription(text.equals("<") ? "Mes anterior" : "Mes siguiente");
button.setContentDescription(text.equals("<") ? (isEnglish ? "Previous month" : "Mes anterior") : (isEnglish ? "Next month" : "Mes siguiente"));
return button;
}
@@ -997,7 +997,7 @@ public class MainActivity extends Activity {
progressParams.setMargins(0, 0, dp(12), 0);
row.addView(progressBar, progressParams);
statusText = textView("Cargando la Palabra de hoy...", 16, COLOR_INK, Typeface.NORMAL);
statusText = textView(isEnglish ? "Loading today's Word..." : "Cargando la Palabra de hoy...", 16, COLOR_INK, Typeface.NORMAL);
statusText.setLineSpacing(0, 1.16f);
row.addView(statusText, new LinearLayout.LayoutParams(
0,
@@ -1007,7 +1007,7 @@ public class MainActivity extends Activity {
statusBlock.addView(row);
retryButton = new Button(this);
retryButton.setText("Reintentar");
retryButton.setText(isEnglish ? "Retry" : "Reintentar");
retryButton.setTextColor(Color.WHITE);
retryButton.setTextSize(14);
retryButton.setAllCaps(false);
@@ -1043,7 +1043,7 @@ public class MainActivity extends Activity {
LinearLayout labelRow = new LinearLayout(this);
labelRow.setGravity(Gravity.CENTER_VERTICAL);
TextView label = textView("Tamaño de letra", 15, COLOR_INK, Typeface.BOLD);
TextView label = textView(isEnglish ? "Font size" : "Tamaño de letra", 15, COLOR_INK, Typeface.BOLD);
labelRow.addView(label, new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT, 1f));
fontValueText = textView(Math.round(readingFontSp) + " sp", 14, COLOR_MUTED, Typeface.BOLD);
@@ -1954,7 +1954,7 @@ public class MainActivity extends Activity {
DailySection papalWords = DailySection.reflection(cleanSectionText(papalText));
if (gospel.body.isEmpty() && firstReading.body.isEmpty() && papalWords.body.isEmpty()) {
throw new IOException("No encontré las secciones esperadas en la página.");
throw new IOException(isEnglish ? "Could not find the expected sections on the page." : "No encontré las secciones esperadas en la página.");
}
return new DailyReading(
@@ -35,6 +35,7 @@ public class SettingsActivity extends Activity {
private TextView voiceSubtitleText;
private TextView voiceButton;
private UpdateManager.UpdateInfo latestInfo;
private boolean isEnglish;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -46,6 +47,7 @@ public class SettingsActivity extends Activity {
}
executor = Executors.newSingleThreadExecutor();
isEnglish = UpdateManager.isEnglish(this);
setContentView(createScreen());
updateInstalledVersionText();
}
@@ -89,7 +91,7 @@ public class SettingsActivity extends Activity {
content.addView(createVoiceCard());
content.addView(createVersionCard());
checkButton = actionButton("Check now", COLOR_ACCENT, Color.WHITE);
checkButton = actionButton(isEnglish ? "Check now" : "Comprobar", COLOR_ACCENT, Color.WHITE);
checkButton.setOnClickListener(view -> checkForUpdate());
LinearLayout.LayoutParams checkParams = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
@@ -142,7 +144,7 @@ public class SettingsActivity extends Activity {
1f
));
TextView back = textView("Extras", 15, COLOR_ACCENT, Typeface.BOLD);
TextView back = textView(isEnglish ? "Extras" : "Extras", 15, COLOR_ACCENT, Typeface.BOLD);
back.setGravity(Gravity.CENTER);
back.setPadding(dp(14), 0, dp(14), 0);
back.setBackground(roundedRect(Color.WHITE, dp(8), Color.rgb(219, 226, 222), dp(1)));
@@ -181,11 +183,11 @@ public class SettingsActivity extends Activity {
1f
));
TextView langToggle = actionButton(UpdateManager.isEnglish(this) ? "English" : "Spanish", COLOR_ACCENT, Color.WHITE);
TextView langToggle = actionButton(UpdateManager.isEnglish(this) ? "English" : "Español", COLOR_ACCENT, Color.WHITE);
langToggle.setOnClickListener(view -> {
boolean current = UpdateManager.isEnglish(this);
UpdateManager.setEnglish(this, !current);
langToggle.setText(!current ? "English" : "Spanish");
langToggle.setText(!current ? "English" : "Español");
updateVoiceCard();
});
card.addView(langToggle, new LinearLayout.LayoutParams(dp(100), dp(40)));
@@ -336,17 +338,18 @@ public class SettingsActivity extends Activity {
String voiceId = UpdateManager.getTtsVoice(this, english);
voiceSubtitleText.setText(english
? "English voices are shown while English is selected"
: "Spanish voices are shown while Spanish is selected");
: "Las voces en español se muestran mientras el español esté seleccionado");
voiceButton.setText(UpdateManager.getTtsVoiceLabel(english, voiceId));
}
private void updateInstalledVersionText() {
try {
installedVersionText.setText("Installed: "
+ UpdateManager.getInstalledVersionName(this)
+ " (" + UpdateManager.getInstalledVersionCode(this) + ")");
installedVersionText.setText(
(isEnglish ? "Installed: " : "Instalada: ")
+ UpdateManager.getInstalledVersionName(this)
+ " (" + UpdateManager.getInstalledVersionCode(this) + ")");
} catch (Exception error) {
installedVersionText.setText("Installed version unavailable.");
installedVersionText.setText(isEnglish ? "Installed version unavailable." : "Versión instalada no disponible.");
}
}
@@ -205,11 +205,12 @@ final class UpdateManager {
? String.valueOf(info.latestVersionCode)
: info.latestVersionName + " (" + info.latestVersionCode + ")";
boolean english = isEnglish(activity);
new AlertDialog.Builder(activity)
.setTitle("Update available")
.setMessage("Version " + version + " is ready to download.")
.setPositiveButton("Download", (dialog, which) -> openDownload(activity, info.apkUrl))
.setNegativeButton("Later", null)
.setTitle(english ? "Update available" : "Actualización disponible")
.setMessage((english ? "Version " : "Versión ") + version + (english ? " is ready to download." : " está lista para descargar."))
.setPositiveButton(english ? "Download" : "Descargar", (dialog, which) -> openDownload(activity, info.apkUrl))
.setNegativeButton(english ? "Later" : "Después", null)
.show();
}