CalebKoster/Translation_Note_Alignment
0
1import gradio as gr2# from TranslationNoteFinder import TranslationNoteFinder3from TranslationNoteFinderLLMOnly import TranslationNoteFinder4from ScriptureReference import ScriptureReference as SR5 6# Updated dictionary mapping language codes to URLs of Bible text files7bible_urls = {8 'en': 'https://raw.githubusercontent.com/BibleNLP/ebible/main/corpus/eng-engkjvcpb.txt',9 'hi': 'https://raw.githubusercontent.com/BibleNLP/ebible/main/corpus/hin-hin2017.txt',10 'es': 'https://raw.githubusercontent.com/BibleNLP/ebible/main/corpus/spa-spabes.txt',11 'ru': 'https://raw.githubusercontent.com/BibleNLP/ebible/main/corpus/rus-russyn.txt'12}13 14tnf = None15 16def load_resources(api_key, lang_code):17 global tnf18 bible_text_url = bible_urls.get(lang_code)19 # 'translation_notes.json'20 # 'translation_notes/tn_ROM.tsv'21 tnf = TranslationNoteFinder(bible_text_url, api_key, lang_code=lang_code)22 return "Language resources loaded successfully.", "", "", ""23 24def validate_verse_ref(verse_ref):25 verse_ref = SR(verse_ref)26 is_valid = verse_ref.is_valid27 print(f"Verse reference is valid: {is_valid}")28 # return gr.Button.update(interactive=is_valid)29 return gr.Button("Translate", interactive=is_valid)30 31 32with gr.Blocks(css="highlightNote.css") as app:33 34 def find_notes(verse_ref):35 global tnf36 if tnf is None:37 return "Please load language resources first.", "", "", ""38 39 # Clear the output fields by returning empty strings40 # yield "", "", "", ""41 42 results = tnf.verse_notes(verse_ref)43 verse_ref_formatted = f"{results['verse_ref']['bookCode']} {results['verse_ref']['startChapter']}:{results['verse_ref']['startVerse']}"44 45 target_text = results['target_verse_text']46 ngrams_formatted = ""47 48 line_number = str(results['line_number'])49 # Apply highlights to Greek terms in translation notes50 for i, ngram in enumerate(results['ngrams']):51 note_id = f"note_{i}"52 ngram_text = f"""<span id='{note_id}' 53 class='note' 54 data-verse-text='{target_text}' 55 data-start-pos='{ngram['start_pos']}' 56 data-end-pos='{ngram['end_pos']}' 57 onmouseover="58 const noteElement = document.getElementById('{note_id}');59 if (noteElement) {{60 const highlightedText = `<span class='highlight'>{target_text[ngram['start_pos']:ngram['end_pos']]}</span>`;61 const verseTextElement = document.querySelector('.verse-text');62 if (verseTextElement) {{63 verseTextElement.innerHTML = `{target_text[:ngram['start_pos']]}`64 + highlightedText65 + `{target_text[ngram['end_pos']:]}`;66 }}67 }}68 "69 onmouseout="document.querySelector('.verse-text').innerHTML = '{target_text}'" 70 >71 {ngram['source_term']}: {ngram['trans_note']}72 </span><br><br>"""73 ngrams_formatted += ngram_text74 75 # Since HTML component is used, all outputs must be strings76 return verse_ref_formatted, target_text, line_number, ngrams_formatted77 78 gr.Markdown(79 """80 # Translation Note Finder81 ## Purpose 82 To align the Greek terms in Unfolding Word's translation notes with the corresponding terms in any target language verse.83 ## Value84 This tool demonstrates the capability to localize translation resources faster or even on the fly.85 ## How to Use86 1. Enter the API key for the OpenAI API.87 2. Select the language code for the Bible text. Load the language.88 3. Enter a verse reference and click "Translate".89 4. Hover over the translation notes to see the equivalent terms highlighted in the target language.90 """91 )92 api_key_input = gr.Textbox(label="API Key", type='password')93 with gr.Row():94 lang_dropdown = gr.Dropdown(choices=list(bible_urls.keys()), label="Language Code")95 load_btn = gr.Button("Load Language")96 verse_input = gr.Textbox(label="Verse Reference", placeholder="e.g. jhn3:16")97 translate_btn = gr.Button("Translate", interactive=False)98 verse_ref_output = gr.Textbox(label="Verse Reference")99 line_number_output = gr.Textbox(label="Line Number", visible=False)100 target_text_output = gr.HTML(label="Target Verse Text", elem_classes=["verse-text"])101 102 notes_output = gr.HTML(label="N-grams") # needs elem_classes?103 104 load_btn.click(105 fn=load_resources, 106 inputs=[107 api_key_input, 108 lang_dropdown], 109 outputs=[110 verse_ref_output, 111 target_text_output, 112 line_number_output, 113 notes_output114 ]115 )116 117 verse_input.change(118 fn=validate_verse_ref, 119 inputs=verse_input, 120 outputs=translate_btn121 )122 123 translate_btn.click(124 fn=find_notes, 125 inputs=verse_input, 126 outputs=[127 verse_ref_output, 128 target_text_output, 129 line_number_output, 130 notes_output131 ]132 )133 134 135app.launch(share=True)136 