takumi0002 commited on
Commit
3435a4d
ยท
verified ยท
1 Parent(s): da663a0

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +17 -32
app.py CHANGED
@@ -26,8 +26,8 @@ class AIService:
26
  prefix = "GEMINI_API_KEY_" if "Gemini" in engine else "GROQ_API_KEY_" if "Llama" in engine else "SEA_LION_API_KEY"
27
  keys = AIService.get_all_keys(prefix)
28
  label = engine.split(" ")[-1]
29
- # แž€แŸ†แžŽแžแŸ‹แž–แžถแž€แŸ’แž™ "Status" แžแžถแž˜แž—แžถแžŸแžถแž‚แŸ„แž›แžŠแŸ…
30
- status_label = "แžŸแŸ’แžแžถแž“แž—แžถแž–" if "Khmer" in target_lang else "Status"
31
  html = f"<div style='display: flex; gap: 8px; align-items: center; margin-bottom: 10px;'><b style='color: #94a3b8; font-size: 12px;'>{label} {status_label}:</b>"
32
  for k in keys:
33
  state = key_status_registry.get(k, "ready")
@@ -71,7 +71,7 @@ class AIService:
71
  headers={"Authorization": f"Bearer {key}"},
72
  json={
73
  "model": "aisingapore/Gemma-SEA-LION-v4-27B-IT",
74
- "messages": [{"role": "system", "content": "You are an expert translator. Detect source language automatically. Output ONLY translation."},
75
  {"role": "user", "content": prompt}],
76
  "temperature": 0.7
77
  }, timeout=60)
@@ -85,16 +85,16 @@ class AIService:
85
  def translator_hub(text, target_lang, engine):
86
  if not text.strip(): return "", AIService.get_status_html(engine, target_lang)
87
 
88
- # แžŸแž˜แŸ’แžขแžถแžแžˆแŸ’แž˜แŸ„แŸ‡แž—แžถแžŸแžถแžŠแžพแž˜แŸ’แž”แžธแž•แŸ’แž‰แžพแž‘แŸ… AI
89
  lang_name = re.sub(r'[^\w\s]', '', target_lang).strip()
90
  is_srt = bool(re.search(r'\d+\n\d{2}:\d{2}:\d{2}', text))
91
  fmt = "SRT" if is_srt else "plain text"
92
 
93
- # Prompt แž†แŸ’แž›แžถแžแžœแŸƒแŸ– แžฑแŸ’แž™แžœแžถ Detect แž—แžถแžŸแžถแžŠแžพแž˜แžแŸ’แž›แžฝแž“แžฏแž„ แž“แžทแž„แž”แž€แž”แŸ’แžšแŸ‚แž‘แŸ…แž—แžถแžŸแžถแž‚แŸ„แž›แžŠแŸ…แžŠแŸ‚แž›แž˜แŸแž…แž„แŸ‹แž”แžถแž“
94
  instruction = (
95
- f"Detect the source language automatically and translate to {lang_name}.\n"
96
- f"Maintain {fmt} format strictly. If {lang_name} is Khmer, use family pronouns (แž”แž„, แžขแžผแž“, แž˜แŸ‰แžถแž€แŸ‹, แž”แŸ‰แžถ). "
97
- f"Otherwise, use natural native tone. Output ONLY the translation. No explanations."
 
 
98
  )
99
 
100
  prompt = f"{instruction}\n\nCONTENT:\n{text}"
@@ -107,19 +107,6 @@ def translator_hub(text, target_lang, engine):
107
 
108
  return "โŒ Error", AIService.get_status_html(engine, target_lang)
109
 
110
- def update_ui(lang):
111
- # แž”แŸ’แžแžผแžš Interface แžแžถแž˜แž—แžถแžŸแžถแžŠแŸ‚แž›แž‡แŸ’แžšแžพแžŸแžšแžพแžŸ
112
- if "Khmer" in lang:
113
- return "แž˜แŸ‰แžผแžŠแŸ‚แž› AI", "แžขแžแŸ’แžแž”แž‘แžŠแžพแž˜", "โšก แž”แž€แž”แŸ’แžšแŸ‚แžฅแžกแžผแžœ", "แž›แž‘แŸ’แž’แž•แž›แž”แž€แž”แŸ’แžšแŸ‚", "๐Ÿ“‹ แž…แž˜แŸ’แž›แž„", "๐Ÿ—‘๏ธ แžŸแž˜แŸ’แžขแžถแž"
114
- elif "English" in lang:
115
- return "AI Model", "Original Content", "โšก Translate Now", "Translation Result", "๐Ÿ“‹ Copy", "๐Ÿ—‘๏ธ Clear"
116
- elif "Chinese" in lang:
117
- return "AI ๆจกๅž‹", "ๅŽŸๆ–‡ๅ†…ๅฎน", "โšก ็ซ‹ๅณ็ฟป่ฏ‘", "็ฟป่ฏ‘็ป“ๆžœ", "๐Ÿ“‹ ๅคๅˆถ", "๐Ÿ—‘๏ธ ๆธ…้™ค"
118
- elif "Thai" in lang:
119
- return "เน‚เธกเน€เธ”เธฅ AI", "เน€เธ™เธทเน‰เธญเธซเธฒเธ•เน‰เธ™เธ‰แž”เธฑเธš", "โšก เนเธ›เธฅแžฅแžกแžผแžœ", "เธœเธฅเธฅเธฑเธžเธ˜เนŒแž€แžถแžšเนเธ›เธฅ", "๐Ÿ“‹ เธ„เธฑเธ”เธฅเธญเธ", "๐Ÿ—‘๏ธ เธฅเน‰เธฒเธ‡"
120
- else: # Default for Japanese/Korean
121
- return "AI Model", "Original", "โšก Translate", "Result", "๐Ÿ“‹ Copy", "๐Ÿ—‘๏ธ Clear"
122
-
123
  css = """
124
  body { background-color: #0d1117; }
125
  .btn-trans { background: linear-gradient(90deg, #238636, #2ea043) !important; color: white !important; border: none !important; }
@@ -128,8 +115,8 @@ body { background-color: #0d1117; }
128
  textarea { resize: both !important; }
129
  """
130
 
131
- with gr.Blocks(title="SRT Multi-Pro", css=css) as demo:
132
- gr.Markdown("<h1 style='text-align: center; color: #58a6ff;'>๐ŸŽฌ MULTI-LANGUAGE SMART TRANSLATOR</h1>")
133
 
134
  with gr.Row():
135
  with gr.Column(scale=1):
@@ -137,21 +124,19 @@ with gr.Blocks(title="SRT Multi-Pro", css=css) as demo:
137
  ["๐Ÿ‡ฐ๐Ÿ‡ญ Khmer", "๐Ÿ‡บ๐Ÿ‡ธ English", "๐Ÿ‡จ๐Ÿ‡ณ Chinese", "๐Ÿ‡น๐Ÿ‡ญ Thai", "๐Ÿ‡ฏ๐Ÿ‡ต Japanese", "๐Ÿ‡ฐ๐Ÿ‡ท Korean"],
138
  value="๐Ÿ‡ฐ๐Ÿ‡ญ Khmer", label="Target Language (แž—แžถแžŸแžถแž‚แŸ„แž›แžŠแŸ…)"
139
  )
140
- engine_opt = gr.Radio(["๐Ÿ’Ž Gemini", "๐Ÿฆ™ Llama", "๐Ÿฆ SEA-LION"], value="๐Ÿ’Ž Gemini", label="แž˜แŸ‰แžผแžŠแŸ‚แž› AI")
141
  status_ui = gr.HTML(AIService.get_status_html("๐Ÿ’Ž Gemini", "๐Ÿ‡ฐ๐Ÿ‡ญ Khmer"))
142
- input_box = gr.Textbox(label="แžขแžแŸ’แžแž”แž‘แžŠแžพแž˜", lines=12, placeholder="Paste text here (Auto Detect Language)...")
143
 
144
  with gr.Row():
145
- btn_clear = gr.Button("๐Ÿ—‘๏ธ แžŸแž˜แŸ’แžขแžถแž", variant="secondary", elem_classes="btn-clear")
146
- btn_trans = gr.Button("โšก แž”แž€แž”แŸ’แžšแŸ‚แžฅแžกแžผแžœ", variant="primary", elem_classes="btn-trans")
147
 
148
  with gr.Column(scale=1):
149
- output_box = gr.Textbox(label="แž›แž‘แŸ’แž’แž•แž›แž”แž€แž”แŸ’แžšแŸ‚", lines=23, interactive=False)
150
- btn_copy = gr.Button("๐Ÿ“‹ แž…แž˜แŸ’แž›แž„แžขแžแŸ’แžแž”แž‘", elem_classes="btn-copy")
151
 
152
- # Dynamic UI Changes
153
- lang_opt.change(update_ui, lang_opt, [engine_opt, input_box, btn_trans, output_box, btn_copy, btn_clear])
154
-
155
  btn_trans.click(translator_hub, [input_box, lang_opt, engine_opt], [output_box, status_ui])
156
  btn_clear.click(lambda: ("", ""), None, [input_box, output_box])
157
  btn_copy.click(None, output_box, js="(v) => { navigator.clipboard.writeText(v); alert('Copied!'); }")
 
26
  prefix = "GEMINI_API_KEY_" if "Gemini" in engine else "GROQ_API_KEY_" if "Llama" in engine else "SEA_LION_API_KEY"
27
  keys = AIService.get_all_keys(prefix)
28
  label = engine.split(" ")[-1]
29
+ # แž”แž„แŸ’แž แžถแž‰แžŸแŸ’แžแžถแž“แž—แžถแž–แž‡แžถ แŸข แž—แžถแžŸแžถแžŠแžพแž˜แŸ’แž”แžธแž€แžปแŸ†แžฑแŸ’แž™แž–แžทแž”แžถแž€ Refresh
30
+ status_label = "แžŸแŸ’แžแžถแž“แž—แžถแž–/Status"
31
  html = f"<div style='display: flex; gap: 8px; align-items: center; margin-bottom: 10px;'><b style='color: #94a3b8; font-size: 12px;'>{label} {status_label}:</b>"
32
  for k in keys:
33
  state = key_status_registry.get(k, "ready")
 
71
  headers={"Authorization": f"Bearer {key}"},
72
  json={
73
  "model": "aisingapore/Gemma-SEA-LION-v4-27B-IT",
74
+ "messages": [{"role": "system", "content": "You are an expert translator. Preserve proper names. Output ONLY translation."},
75
  {"role": "user", "content": prompt}],
76
  "temperature": 0.7
77
  }, timeout=60)
 
85
  def translator_hub(text, target_lang, engine):
86
  if not text.strip(): return "", AIService.get_status_html(engine, target_lang)
87
 
 
88
  lang_name = re.sub(r'[^\w\s]', '', target_lang).strip()
89
  is_srt = bool(re.search(r'\d+\n\d{2}:\d{2}:\d{2}', text))
90
  fmt = "SRT" if is_srt else "plain text"
91
 
 
92
  instruction = (
93
+ f"1. Detect source language and translate to {lang_name}.\n"
94
+ f"2. IMPORTANT: DO NOT translate proper names or character names (e.g., Chang Sheng, Xiao Fan). Keep them in their original Latin/English characters.\n"
95
+ f"3. Maintain {fmt} format strictly.\n"
96
+ f"4. If {lang_name} is Khmer, use natural family pronouns (แž”แž„, แžขแžผแž“, แž˜แŸ‰แžถแž€แŸ‹, แž”แŸ‰แžถ, แžฏแž„).\n"
97
+ f"5. Output ONLY the translation. No chat, no explanations."
98
  )
99
 
100
  prompt = f"{instruction}\n\nCONTENT:\n{text}"
 
107
 
108
  return "โŒ Error", AIService.get_status_html(engine, target_lang)
109
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110
  css = """
111
  body { background-color: #0d1117; }
112
  .btn-trans { background: linear-gradient(90deg, #238636, #2ea043) !important; color: white !important; border: none !important; }
 
115
  textarea { resize: both !important; }
116
  """
117
 
118
+ with gr.Blocks(title="SRT Pro (No Refresh)", css=css) as demo:
119
+ gr.Markdown("<h1 style='text-align: center; color: #58a6ff;'>๐ŸŽฌ SMART TRANSLATOR PRO</h1>")
120
 
121
  with gr.Row():
122
  with gr.Column(scale=1):
 
124
  ["๐Ÿ‡ฐ๐Ÿ‡ญ Khmer", "๐Ÿ‡บ๐Ÿ‡ธ English", "๐Ÿ‡จ๐Ÿ‡ณ Chinese", "๐Ÿ‡น๐Ÿ‡ญ Thai", "๐Ÿ‡ฏ๐Ÿ‡ต Japanese", "๐Ÿ‡ฐ๐Ÿ‡ท Korean"],
125
  value="๐Ÿ‡ฐ๐Ÿ‡ญ Khmer", label="Target Language (แž—แžถแžŸแžถแž‚แŸ„แž›แžŠแŸ…)"
126
  )
127
+ engine_opt = gr.Radio(["๐Ÿ’Ž Gemini", "๐Ÿฆ™ Llama", "๐Ÿฆ SEA-LION"], value="๐Ÿ’Ž Gemini", label="AI Model (แž˜แŸ‰แžผแžŠแŸ‚แž›)")
128
  status_ui = gr.HTML(AIService.get_status_html("๐Ÿ’Ž Gemini", "๐Ÿ‡ฐ๐Ÿ‡ญ Khmer"))
129
+ input_box = gr.Textbox(label="Original Content (แžขแžแŸ’แžแž”แž‘แžŠแžพแž˜)", lines=12, placeholder="Paste text here...")
130
 
131
  with gr.Row():
132
+ btn_clear = gr.Button("๐Ÿ—‘๏ธ Clear (แžŸแž˜แŸ’แžขแžถแž)", variant="secondary", elem_classes="btn-clear")
133
+ btn_trans = gr.Button("โšก Translate (แž”แž€แž”แŸ’แžšแŸ‚)", variant="primary", elem_classes="btn-trans")
134
 
135
  with gr.Column(scale=1):
136
+ output_box = gr.Textbox(label="Result (แž›แž‘แŸ’แž’แž•แž›)", lines=23, interactive=False)
137
+ btn_copy = gr.Button("๐Ÿ“‹ Copy Result (แž…แž˜แŸ’แž›แž„)", elem_classes="btn-copy")
138
 
139
+ # Events: แž”แŸ’แžแžผแžšแž—แžถแžŸแžถแž˜แžทแž“ Refresh UI แž‘แŸ แž‚แžบแž‚แŸ’แžšแžถแž“แŸ‹แžแŸ‚แž”แŸ’แžแžผแžšแžแž˜แŸ’แž›แŸƒแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž”แž€แž”แŸ’แžšแŸ‚
 
 
140
  btn_trans.click(translator_hub, [input_box, lang_opt, engine_opt], [output_box, status_ui])
141
  btn_clear.click(lambda: ("", ""), None, [input_box, output_box])
142
  btn_copy.click(None, output_box, js="(v) => { navigator.clipboard.writeText(v); alert('Copied!'); }")