Skip to content

Instantly share code, notes, and snippets.

@gnh1201
Last active March 27, 2024 04:15
Show Gist options
  • Save gnh1201/93cecb002080da2b65eda3dd6032f05a to your computer and use it in GitHub Desktop.
Save gnh1201/93cecb002080da2b65eda3dd6032f05a to your computer and use it in GitHub Desktop.
A customized translation service that is compatible with the LibreTranslate API
#!/usr/bin/env python3
#
# hello.py
# serverless translation service gateway
#
# @author: Namhyeon Go <abuse@catswords.net>
# @created_on: 2024-03-15
# @updated_on: 2024-03-19
#
import traceback
from flask import Flask, request, jsonify # Not supported on the serverless
#from flask import request, jsonify
import translators as ts
import json
app = Flask(__name__) # not supported on the serverless
# 기본 번역기 지정
translator = 'sysTran'
# 언어 코드와 설명을 별개의 리스트로 분리
language_codes = [
'af', 'sq', 'am', 'ar', 'hy', 'az', 'eu', 'be', 'bn', 'bs', 'bg', 'ca', 'ceb', 'ny',
'zh-CN', 'zh-TW', 'co', 'hr', 'cs', 'da', 'nl', 'en', 'eo', 'et', 'tl', 'fi', 'fr',
'fy', 'gl', 'ka', 'de', 'el', 'gu', 'ht', 'ha', 'haw', 'iw', 'hi', 'hmn', 'hu', 'is',
'ig', 'id', 'ga', 'it', 'ja', 'jw', 'kn', 'kk', 'km', 'ko', 'ku', 'ky', 'lo', 'la',
'lv', 'lt', 'lb', 'mk', 'mg', 'ms', 'ml', 'mt', 'mi', 'mr', 'mn', 'my', 'ne', 'no',
'ps', 'fa', 'pl', 'pt', 'pa', 'ro', 'ru', 'sm', 'gd', 'sr', 'st', 'sn', 'sd', 'si',
'sk', 'sl', 'so', 'es', 'su', 'sw', 'sv', 'tg', 'ta', 'te', 'th', 'tr', 'uk', 'ur',
'uz', 'vi', 'cy', 'xh', 'yi', 'yo', 'zu'
]
language_names = [
'아프리칸스어', '알바니아어', '암하라어', '아랍어', '아르메니아어', '아제르바이잔어', '바스크어', '벨라루스어',
'벵골어', '보스니아어', '불가리아어', '카탈로니아어', '세부아노어', '치체와어', '중국어(간체)', '중국어(번체)',
'코르시카어', '크로아티아어', '체코어', '덴마크어', '네덜란드어', '영어', '에스페란토어', '에스토니아어',
'필리핀어', '핀란드어', '프랑스어', '프리지아어', '갈리시아어', '조지아어', '독일어', '그리스어', '구자라트어',
'아이티어', '하우사어', '하와이어', '히브리어', '힌디어', '몽어', '헝가리어', '아이슬란드어', '이그보어',
'인도네시아어', '아일랜드어', '이탈리아어', '일본어', '자바어', '칸나다어', '카자흐어', '크메르어', '한국어',
'쿠르드어', '키르기스어', '라오어', '라틴어', '라트비아어', '리투아니아어', '룩셈부르크어', '마케도니아어',
'말라가시어', '말레이어', '말라얄람어', '몰타어', '마오리어', '마라티어', '몽골어', '버마어', '네팔어',
'노르웨이어', '파슈토어', '페르시아어', '폴란드어', '포르투갈어', '펀잡어', '루마니아어', '러시아어', '사모아어',
'스코틀랜드 게일어', '세르비아어', '소토어', '쇼나어', '신디어', '싱할라어', '슬로바키아어', '슬로베니아어',
'소말리아어', '스페인어', '순다어', '스와힐리어', '스웨덴어', '타지크어', '타밀어', '텔루구어', '태국어',
'터키어', '우크라이나어', '우르두어', '우즈베크어', '베트남어', '웨일스어', '코사어', '이디시어', '요루바어',
'주앙어', '중국어', '줄루어'
]
# 언어 이름 확인
def get_language_name(code):
try:
index = language_codes.index(code)
except:
index = -1
return language_names[index] if index > -1 else code
# 번역 API 엔드포인트
@app.route('/translate', methods=['POST']) # Not supported on the serverless
def translate():
# 번역하고자 하는 텍스트
original_texts = []
# 클라이언트로부터 요청 받은 데이터 (formData)
data = request.form.to_dict()
if 'q' in data:
original_texts.append(data['q'])
# 클라이언트로부터 JSON 요청으로 데이터를 받은 경우 (jsonData)
try:
jsondata = json.loads(request.data)
if 'q' in jsondata and 'target' in jsondata:
data.update({
"q": jsondata['q'],
"source": jsondata['source'] if 'source' in jsondata else 'auto',
"target": jsondata['target']
})
for text in data['q']:
original_texts.append(text)
except Exception as e:
traceback.print_exc()
app.logger.info(str(e))
return jsonify({"error": str(e)}), 500
# 필수 요청 매개변수 확인
if 'q' not in data or 'target' not in data:
return jsonify({"error": "Missing required parameters"}), 400
# 출발지 언어가 없는 경우 자동으로 설정
from_language = data['source'] if 'source' in data else 'auto'
# 번역 진행
try:
translated_texts = []
for text in original_texts:
translated_texts.append(ts.translate_text(text, from_language=from_language, to_language=data['target'], translator=translator))
return jsonify({"translatedText": translated_texts}), 200
except Exception as e:
traceback.print_exc()
app.logger.info(str(e))
return jsonify({"error": str(e)}), 500
# 지원되는 언어 목록 API 엔드포인트
@app.route('/languages', methods=['GET']) # Not supported on the serverless
def supported_languages():
try:
# translators 패키지가 지원하는 언어 목록 가져오기
languages = ts.get_languages(translator=translator)
# 언어 목록을 주어진 형식에 맞게 변환
formatted_languages = []
for code in languages:
formatted_languages.append({
"code": code,
"name": get_language_name(code),
"targets": list(languages.keys())
})
return jsonify(formatted_languages), 200
except Exception as e:
traceback.print_exc()
app.logger.info(str(e))
return jsonify({"error": str(e)}), 500
'''
def main():
#route = request.path # Not supported on the serverless
route = request.args.get('route') # Alternative to the request.path
if request.method == 'POST' and route == '/translate':
response_text, _ = translate()
return response_text
if request.method == 'GET' and route == '/languages':
response_text, _ = supported_languages()
return response_text
if request.method == 'GET' and route == '/':
return jsonify({"welcome": True})
return jsonify({"welcome": False})
#app.run(debug=True) # Not supported on the serverless
'''
if __name__ == "__main__":
app.run(debug=True)
[Unit]
Description=serverless translation service gateway
Documentation=https://gist.github.com/gnh1201/93cecb002080da2b65eda3dd6032f05a
After=network.target
[Service]
User=gosomi
Group=gosomi
WorkingDirectory=/home/gosomi/Projects/language-service
ExecStart=/usr/bin/python3 /home/gosomi/Projects/language-service/hello.py
Restart=always
[Install]
WantedBy=multi-user.target
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment