|
|
import gradio as gr |
|
|
|
|
|
from TranslationNoteFinderLLMOnly import TranslationNoteFinder |
|
|
from ScriptureReference import ScriptureReference as SR |
|
|
|
|
|
|
|
|
bible_urls = { |
|
|
'en': 'https://raw.githubusercontent.com/BibleNLP/ebible/main/corpus/eng-engkjvcpb.txt', |
|
|
'hi': 'https://raw.githubusercontent.com/BibleNLP/ebible/main/corpus/hin-hin2017.txt', |
|
|
'es': 'https://raw.githubusercontent.com/BibleNLP/ebible/main/corpus/spa-spabes.txt', |
|
|
'ru': 'https://raw.githubusercontent.com/BibleNLP/ebible/main/corpus/rus-russyn.txt' |
|
|
} |
|
|
|
|
|
tnf = None |
|
|
|
|
|
def load_resources(api_key, lang_code): |
|
|
global tnf |
|
|
bible_text_url = bible_urls.get(lang_code) |
|
|
|
|
|
|
|
|
tnf = TranslationNoteFinder(bible_text_url, api_key, lang_code=lang_code) |
|
|
return "Language resources loaded successfully.", "", "", "" |
|
|
|
|
|
def validate_verse_ref(verse_ref): |
|
|
verse_ref = SR(verse_ref) |
|
|
is_valid = verse_ref.is_valid |
|
|
print(f"Verse reference is valid: {is_valid}") |
|
|
|
|
|
return gr.Button("Translate", interactive=is_valid) |
|
|
|
|
|
|
|
|
with gr.Blocks(css="highlightNote.css") as app: |
|
|
|
|
|
def find_notes(verse_ref): |
|
|
global tnf |
|
|
if tnf is None: |
|
|
return "Please load language resources first.", "", "", "" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
results = tnf.verse_notes(verse_ref) |
|
|
verse_ref_formatted = f"{results['verse_ref']['bookCode']} {results['verse_ref']['startChapter']}:{results['verse_ref']['startVerse']}" |
|
|
|
|
|
target_text = results['target_verse_text'] |
|
|
ngrams_formatted = "" |
|
|
|
|
|
line_number = str(results['line_number']) |
|
|
|
|
|
for i, ngram in enumerate(results['ngrams']): |
|
|
note_id = f"note_{i}" |
|
|
ngram_text = f"""<span id='{note_id}' |
|
|
class='note' |
|
|
data-verse-text='{target_text}' |
|
|
data-start-pos='{ngram['start_pos']}' |
|
|
data-end-pos='{ngram['end_pos']}' |
|
|
onmouseover=" |
|
|
const noteElement = document.getElementById('{note_id}'); |
|
|
if (noteElement) {{ |
|
|
const highlightedText = `<span class='highlight'>{target_text[ngram['start_pos']:ngram['end_pos']]}</span>`; |
|
|
const verseTextElement = document.querySelector('.verse-text'); |
|
|
if (verseTextElement) {{ |
|
|
verseTextElement.innerHTML = `{target_text[:ngram['start_pos']]}` |
|
|
+ highlightedText |
|
|
+ `{target_text[ngram['end_pos']:]}`; |
|
|
}} |
|
|
}} |
|
|
" |
|
|
onmouseout="document.querySelector('.verse-text').innerHTML = '{target_text}'" |
|
|
> |
|
|
{ngram['source_term']}: {ngram['trans_note']} |
|
|
</span><br><br>""" |
|
|
ngrams_formatted += ngram_text |
|
|
|
|
|
|
|
|
return verse_ref_formatted, target_text, line_number, ngrams_formatted |
|
|
|
|
|
gr.Markdown( |
|
|
""" |
|
|
# Translation Note Finder |
|
|
## Purpose |
|
|
To align the Greek terms in Unfolding Word's translation notes with the corresponding terms in any target language verse. |
|
|
## Value |
|
|
This tool demonstrates the capability to localize translation resources faster or even on the fly. |
|
|
## How to Use |
|
|
1. Enter the API key for the OpenAI API. |
|
|
2. Select the language code for the Bible text. Load the language. |
|
|
3. Enter a verse reference and click "Translate". |
|
|
4. Hover over the translation notes to see the equivalent terms highlighted in the target language. |
|
|
""" |
|
|
) |
|
|
api_key_input = gr.Textbox(label="API Key", type='password') |
|
|
with gr.Row(): |
|
|
lang_dropdown = gr.Dropdown(choices=list(bible_urls.keys()), label="Language Code") |
|
|
load_btn = gr.Button("Load Language") |
|
|
verse_input = gr.Textbox(label="Verse Reference", placeholder="e.g. jhn3:16") |
|
|
translate_btn = gr.Button("Translate", interactive=False) |
|
|
verse_ref_output = gr.Textbox(label="Verse Reference") |
|
|
line_number_output = gr.Textbox(label="Line Number", visible=False) |
|
|
target_text_output = gr.HTML(label="Target Verse Text", elem_classes=["verse-text"]) |
|
|
|
|
|
notes_output = gr.HTML(label="N-grams") |
|
|
|
|
|
load_btn.click( |
|
|
fn=load_resources, |
|
|
inputs=[ |
|
|
api_key_input, |
|
|
lang_dropdown], |
|
|
outputs=[ |
|
|
verse_ref_output, |
|
|
target_text_output, |
|
|
line_number_output, |
|
|
notes_output |
|
|
] |
|
|
) |
|
|
|
|
|
verse_input.change( |
|
|
fn=validate_verse_ref, |
|
|
inputs=verse_input, |
|
|
outputs=translate_btn |
|
|
) |
|
|
|
|
|
translate_btn.click( |
|
|
fn=find_notes, |
|
|
inputs=verse_input, |
|
|
outputs=[ |
|
|
verse_ref_output, |
|
|
target_text_output, |
|
|
line_number_output, |
|
|
notes_output |
|
|
] |
|
|
) |
|
|
|
|
|
|
|
|
app.launch(share=True) |
|
|
|