From fc3159d3fb2aa2bc8703984b8b0d58876f1623bc Mon Sep 17 00:00:00 2001 From: Adolfo Reyna Date: Tue, 24 Feb 2026 16:04:32 -0500 Subject: [PATCH] Internationalize Bible UI and add locale-aware translation fetch --- Views/BibleChapterView.js | 11 +++--- Views/BiblePicker.js | 35 +++++++++-------- Views/NewPost.js | 2 +- components/BibleEmbeddedView.js | 7 ++-- i18nMessages.js | 68 +++++++++++++++++++++++++++++++++ utils/bibleReferences.js | 47 ++++++++++++++++++++--- 6 files changed, 136 insertions(+), 34 deletions(-) diff --git a/Views/BibleChapterView.js b/Views/BibleChapterView.js index 1013a58..a3ffd19 100644 --- a/Views/BibleChapterView.js +++ b/Views/BibleChapterView.js @@ -3,8 +3,9 @@ import { FlatList, Pressable, View } from "react-native"; import { ActivityIndicator, Text } from "react-native-paper"; import { SafeAreaView } from "react-native-safe-area-context"; import { useNavigation } from "@react-navigation/native"; -import { parseBibleReference } from "../utils/bibleReferences.js"; +import { fetchBibleChapter, parseBibleReference } from "../utils/bibleReferences.js"; import GlobalState from "../contexts/GlobalState.js"; +import i18n from "../i18nMessages.js"; const BibleChapterView = ({ route }) => { const navigation = useNavigation(); @@ -23,14 +24,12 @@ const BibleChapterView = ({ route }) => { setLoading(true); setError(""); try { - const response = await fetch(`https://bible-api.com/${encodeURIComponent(chapterReference)}`); - if (!response.ok) throw new Error("Failed chapter request"); - const payload = await response.json(); + const payload = await fetchBibleChapter(chapterReference, i18n.locale); if (!mounted) return; setChapterData(payload); } catch (_error) { if (!mounted) return; - setError("Unable to load chapter."); + setError(i18n.t("message.unableLoadChapter")); setChapterData(null); } finally { if (mounted) setLoading(false); @@ -100,7 +99,7 @@ const BibleChapterView = ({ route }) => { {chapterData?.translation_name || chapterData?.translation_id || "KJV"} {selectable ? ( - Tap a verse to select it. + {i18n.t("message.tapVerseToSelect")} ) : null} { const navigation = useNavigation(); @@ -57,11 +58,11 @@ const BiblePicker = ({ route }) => { setError(""); setLoadingPreview(true); try { - const passage = await fetchBiblePassage(reference); + const passage = await fetchBiblePassage(reference, i18n.locale); setPreview(passage); } catch (_err) { setPreview(null); - setError("Unable to load this Bible passage."); + setError(i18n.t("message.unableLoadPassage")); } finally { setLoadingPreview(false); } @@ -74,9 +75,7 @@ const BiblePicker = ({ route }) => { } setLoadingVerses(true); try { - const response = await fetch(`https://bible-api.com/${encodeURIComponent(`${book} ${chapterNumber}`)}`); - if (!response.ok) throw new Error("Failed chapter fetch"); - const payload = await response.json(); + const payload = await fetchBibleChapter(`${book} ${chapterNumber}`, i18n.locale); const options = Array.isArray(payload?.verses) ? payload.verses.map((v) => String(v?.verse || "")).filter(Boolean) : []; @@ -103,9 +102,9 @@ const BiblePicker = ({ route }) => { return ( - Bible Reference + {i18n.t("message.bibleReferenceTitle")} - Pick a reference to insert into your {target === "chat" ? "chat message" : "post"}. + {target === "chat" ? i18n.t("message.biblePickerSubtitleChat") : i18n.t("message.biblePickerSubtitlePost")} { /> - {computedReference ? Selected: {computedReference} : null} + {computedReference ? {i18n.t("message.selected")}: {computedReference} : null} {preview?.text ? ( navigation.navigate("BibleChapter", { reference: computedReference, selectable: true })} @@ -134,7 +133,7 @@ const BiblePicker = ({ route }) => { {preview.reference} ({preview.translation}) - Tap preview to pick verse from chapter + {i18n.t("message.tapPreviewPickVerse")} ) : null} {error ? {error} : null} @@ -143,27 +142,27 @@ const BiblePicker = ({ route }) => { {activeStep === "book" ? ( <> - Books + {i18n.t("message.books")} { {activeStep === "chapter" ? ( <> - Chapters {selectedBook ? `(${selectedBook})` : ""} + {i18n.t("message.chapters")} {selectedBook ? `(${selectedBook})` : ""} { {activeStep === "verse" ? ( <> - Verses {selectedBook && chapter ? `(${selectedBook} ${chapter})` : ""} + {i18n.t("message.verses")} {selectedBook && chapter ? `(${selectedBook} ${chapter})` : ""} {loadingVerses ? ( diff --git a/Views/NewPost.js b/Views/NewPost.js index 1e62000..d747fb6 100644 --- a/Views/NewPost.js +++ b/Views/NewPost.js @@ -248,7 +248,7 @@ let NewPostView = (props) => { mode="outlined" onPress={() => navigation.navigate("BiblePicker", { target: "post" })} > - Bible + {i18n.t("message.bible")}