Added translation API: volcengine

增加翻译API:火山翻译
pull/174/head
Physton 2023-06-22 20:28:56 +08:00
parent 4ce2db92af
commit 92f37a1135
5 changed files with 444 additions and 621 deletions

View File

@ -16,6 +16,7 @@ from scripts.physton_prompt.translator.youdao_translator import YoudaoTranslator
from scripts.physton_prompt.translator.mymemory_translator import MyMemoryTranslator
from scripts.physton_prompt.translator.niutrans_translator import NiutransTranslator
from scripts.physton_prompt.translator.caiyun_translator import CaiyunTranslator
from scripts.physton_prompt.translator.volcengine_translator import VolcengineTranslator
caches = {}
@ -104,6 +105,8 @@ def translate(text, from_lang, to_lang, api, api_config=None):
translator = NiutransTranslator()
elif api == 'caiyun':
translator = CaiyunTranslator()
elif api == 'volcengine':
translator = VolcengineTranslator()
elif 'type' in find and find['type'] == 'translators':
translator = TranslatorsTranslator(api)
translator.set_translator(find['translator'])

View File

@ -0,0 +1,186 @@
from scripts.physton_prompt.translator.base_tanslator import BaseTranslator
import datetime
import hashlib
import hmac
import requests
import json
from urllib.parse import quote
from scripts.physton_prompt.get_lang import get_lang
class VolcengineTranslator(BaseTranslator):
def __init__(self):
super().__init__('volcengine')
def translate(self, text):
if not text:
if isinstance(text, list):
return []
else:
return ''
url = 'https://open.volcengineapi.com'
access_key_id = self.api_config.get('access_key_id', '')
access_key_secret = self.api_config.get('access_key_secret', '')
region = self.api_config.get('region', 'cn-north-1')
if not access_key_id:
raise Exception(get_lang('is_required', {'0': 'Access Key ID'}))
if not access_key_secret:
raise Exception(get_lang('is_required', {'0': 'Secret Access Key'}))
if isinstance(text, list):
texts = text
else:
texts = [text]
body = {
"TextList": texts,
"SourceLanguage": self.from_lang,
"TargetLanguage": self.to_lang,
}
response = request(access_key_id, access_key_secret, region, json.dumps(body))
if not response.text:
raise Exception(get_lang('response_is_empty', {'0': 'volcengine'}))
result = response.json()
if not result:
raise Exception(get_lang('response_is_empty', {'0': 'volcengine'}))
if 'ResponseMetaData' not in result:
raise Exception(get_lang('response_is_empty', {'0': 'volcengine'}))
if 'Error' in result['ResponseMetaData']:
raise Exception(result['ResponseMetaData']['Error']['Message'])
if 'Message' in result['ResponseMetaData']:
raise Exception(result['ResponseMetadata']['Message'])
if 'TranslationList' not in result or not result['TranslationList'] or len(result['TranslationList']) == 0:
raise Exception(get_lang('no_response_from', {'0': 'volcengine'}))
if isinstance(text, list):
return [item['Translation'] for item in result['TranslationList']]
else:
return result['TranslationList'][0]['Translation']
def translate_batch(self, texts):
return self.translate(texts)
def norm_query(params):
query = ""
for key in sorted(params.keys()):
if type(params[key]) == list:
for k in params[key]:
query = (
query + quote(key, safe="-_.~") + "=" + quote(k, safe="-_.~") + "&"
)
else:
query = (query + quote(key, safe="-_.~") + "=" + quote(params[key], safe="-_.~") + "&")
query = query[:-1]
return query.replace("+", "%20")
def hmac_sha256(key: bytes, content: str):
return hmac.new(key, content.encode("utf-8"), hashlib.sha256).digest()
def hash_sha256(content: str):
return hashlib.sha256(content.encode("utf-8")).hexdigest()
def request(access_key_id, access_key_secret, region, body):
service = "translate"
date = datetime.datetime.utcnow()
method = 'POST'
host = "open.volcengineapi.com"
contentType = "application/json"
action = "TranslateText"
version = "2020-06-01"
query = {
"Action": action,
"Version": version,
}
header = {
'Content-Type': contentType,
}
# 创建身份证明。其中的 Service 和 Region 字段是固定的。ak 和 sk 分别代表
# AccessKeyID 和 SecretAccessKey。同时需要初始化签名结构体。一些签名计算时需要的属性也在这里处理。
# 初始化身份证明结构体
credential = {
"access_key_id": access_key_id,
"secret_access_key": access_key_secret,
"service": service,
"region": region,
}
# 初始化签名结构体
request_param = {
"body": body,
"host": host,
"path": "/",
"method": method,
"content_type": contentType,
"date": date,
"query": {"Action": action, "Version": version, **query},
}
if body is None:
request_param["body"] = ""
# 第四步:接下来开始计算签名。在计算签名前,先准备好用于接收签算结果的 signResult 变量,并设置一些参数。
# 初始化签名结果的结构体
x_date = request_param["date"].strftime("%Y%m%dT%H%M%SZ")
short_x_date = x_date[:8]
x_content_sha256 = hash_sha256(request_param["body"])
sign_result = {
"Host": request_param["host"],
"X-Content-Sha256": x_content_sha256,
"X-Date": x_date,
"Content-Type": request_param["content_type"],
}
# 第五步:计算 Signature 签名。
signed_headers_str = ";".join(
["content-type", "host", "x-content-sha256", "x-date"]
)
# signed_headers_str = signed_headers_str + ";x-security-token"
canonical_request_str = "\n".join(
[request_param["method"].upper(),
request_param["path"],
norm_query(request_param["query"]),
"\n".join(
[
"content-type:" + request_param["content_type"],
"host:" + request_param["host"],
"x-content-sha256:" + x_content_sha256,
"x-date:" + x_date,
]
),
"",
signed_headers_str,
x_content_sha256,
]
)
# 打印正规化的请求用于调试比对
# print(canonical_request_str)
hashed_canonical_request = hash_sha256(canonical_request_str)
# 打印hash值用于调试比对
# print(hashed_canonical_request)
credential_scope = "/".join([short_x_date, credential["region"], credential["service"], "request"])
string_to_sign = "\n".join(["HMAC-SHA256", x_date, credential_scope, hashed_canonical_request])
# 打印最终计算的签名字符串用于调试比对
# print(string_to_sign)
k_date = hmac_sha256(credential["secret_access_key"].encode("utf-8"), short_x_date)
k_region = hmac_sha256(k_date, credential["region"])
k_service = hmac_sha256(k_region, credential["service"])
k_signing = hmac_sha256(k_service, "request")
signature = hmac_sha256(k_signing, string_to_sign).hex()
sign_result["Authorization"] = "HMAC-SHA256 Credential={}, SignedHeaders={}, Signature={}".format(
credential["access_key_id"] + "/" + credential_scope,
signed_headers_str,
signature,
)
header = {**header, **sign_result}
# header = {**header, **{"X-Security-Token": SessionToken}}
# 第六步:将 Signature 签名写入 HTTP Header 中,并发送 HTTP 请求。
r = requests.request(method=method,
url="https://{}{}".format(request_param["host"], request_param["path"]),
headers=header,
params=request_param["query"],
data=request_param["body"],
)
return r

View File

@ -144,6 +144,15 @@ def test_caiyun():
print(translate(text, 'en_US', 'zh_CN', 'caiyun', api_config))
print(translate(texts, 'en_US', 'zh_CN', 'caiyun', api_config))
def test_volcengine():
api_config = {
'access_key_id': os.getenv('VOLCENGINE_ACCESS_KEY_ID'),
'access_key_secret': os.getenv('VOLCENGINE_ACCESS_KEY_SECRET'),
}
print(translate(text, 'en_US', 'zh_TW', 'volcengine', api_config))
print(translate(texts, 'en_US', 'zh_TW', 'volcengine', api_config))
def test_languages():
i18n = get_i18n()
languages = []
@ -157,4 +166,4 @@ def test_languages():
print(translate(text, 'en_US', lang, 'myMemory_free'))
pass
test_caiyun()
test_volcengine()

View File

@ -1,620 +1,115 @@
[
{
"key": "deepl_free",
"name": "[Free] DeepL, Germany",
"type": "translators",
"translator": "deepl",
"support": {
"bg_BG": "bg",
"cs_CZ": "cs",
"da_DK": "da",
"de_DE": "de",
"el_GR": "el",
"en_GB": "en",
"en_US": "en",
"es_ES": "es",
"et_EE": "et",
"fi_FI": "fi",
"fr_FR": "fr",
"hu_HU": "hu",
"id_ID": "id",
"it_IT": "it",
"ja_JP": "ja",
"ko_KR": "ko",
"lt_LT": "lt",
"lv_LV": "lv",
"no_NO": "nb",
"nl_NL": "nl",
"pl_PL": "pl",
"pt_BR": "pt",
"pt_PT": "pt",
"ro_RO": "ro",
"ru_RU": "ru",
"sk_SK": "sk",
"sl_SI": "sl",
"sv_SE": "sv",
"tr_TR": "tr",
"uk_UA": "uk",
"zh_CN": "zh"
},
"help": [
{
"title": "DeepL - Deepl, Germany",
"url": "https://www.deepl.com/translator"
},
{
"title": "[github]translators",
"url": "https://github.com/UlionTse/translators"
}
]
},
{
"key": "myMemory_free",
"name": "[Free] MyMemory, Italy",
"type": "translators",
"translator": "myMemory",
"support": {
"zh_CN": "zh-CN",
"zh_HK": "zh-TW",
"zh_TW": "zh-TW",
"en_US": "en-GB",
"en_GB": "en-GB",
"af_ZA": "af-ZA",
"sq_AL": "sq-AL",
"am_ET": "am-ET",
"ar_SA": "ar-SA",
"hy_AM": "hy-AM",
"as_IN": false,
"az_Latn_AZ": "az-AZ",
"bn_BD": "bn-IN",
"ba_RU": false,
"eu_ES": "eu-ES",
"bs_Latn_BA": "bs-BA",
"bg_BG": "bg-BG",
"ca_ES": "ca-ES",
"hr_HR": "hr-HR",
"cs_CZ": "cs-CZ",
"da_DK": "da-DK",
"prs_AF": false,
"dv_MV": "dv-MV",
"nl_NL": "nl-NL",
"et_EE": "et-EE",
"fo_FO": "fo-FO",
"fj_FJ": false,
"fil_PH": false,
"fi_FI": "fi-FI",
"fr_FR": "fr-FR",
"fr_CA": "fr-FR",
"gl_ES": "gl-ES",
"ka_GE": "ka-GE",
"de_DE": "de-DE",
"el_GR": "el-GR",
"gu_IN": "gu-IN",
"ht_HT": "ht-HT",
"he_IL": "he-IL",
"hi_IN": "hi-IN",
"mww_Latn_US": false,
"hu_HU": "hu-HU",
"is_IS": "is-IS",
"id_ID": "id-ID",
"ikt_CA": false,
"iu_CA": false,
"iu_Latn_CA": false,
"ga_IE": "ga-IE",
"it_IT": "it-IT",
"ja_JP": "ja-JP",
"kn_IN": "kn-IN",
"kk_KZ": "kk-KZ",
"km_KH": "km-KM",
"tlh_Latn": false,
"tlh_Piqd": false,
"ko_KR": "ko-KR",
"ku_Arab_IQ": "ckb-IQ",
"ku_Latn_TR": "ku-TR",
"ky_KG": "ky-KG",
"lo_LA": "lo-LA",
"lv_LV": "lv-LV",
"lt_LT": "lt-LT",
"mk_MK": "mk-MK",
"mg_MG": "mg-MG",
"ms_Latn_MY": "ms-MY",
"ml_IN": false,
"mt_MT": "mt-MT",
"mi_NZ": "mi-NZ",
"mr_IN": false,
"mn_Cyrl_MN": "mn-MN",
"mn_Mong_CN": "mn-MN",
"my_MM": "my-MM",
"ne_NP": "ne-NP",
"no_NO": "no-NO",
"or_IN": false,
"ps_AF": "ps-PK",
"fa_IR": "fa-IR",
"pl_PL": "pl-PL",
"pt_BR": "pt-PT",
"pt_PT": "pt-PT",
"pa_Guru_IN": "pa-IN",
"otq_Latn_MX": false,
"ro_RO": "ro-RO",
"ru_RU": "ru-RU",
"sm_Latn_WS": "sm-WS",
"sr_Cyrl_RS": "sr-RS",
"sr_Latn_RS": "sr-RS",
"sk_SK": "sk-SK",
"sl_SI": "sl-SI",
"so_SO": "so-SO",
"es_ES": "es-ES",
"sw_KE": "sw-SZ",
"sv_SE": "sv-SE",
"ty_PF": false,
"ta_IN": "ta-LK",
"tt_Latn_RU": false,
"te_IN": "te-IN",
"th_TH": "th-TH",
"bo_CN": "bo-CN",
"ti_ET": "ti-TI",
"to_TO": "to-TO",
"tr_TR": "tr-TR",
"uk_UA": "uk-UA",
"ur_PK": "ur-PK",
"ug_Arab_CN": false,
"uz_Latn_UZ": "uz-UZ",
"vi_VN": "vi-VN",
"cy_GB": "cy-GB",
"yua_MX": false,
"zu_ZA": "zu-ZA"
},
"help": [
{
"title": "MyMemory - Translated, Italy",
"url": "https://mymemory.translated.net/"
},
{
"title": "[github]translators",
"url": "https://github.com/UlionTse/translators"
}
]
},
{
"key": "yandex_free",
"name": "[Free] Yandex, Russia",
"type": "translators",
"translator": "yandex",
"support": {
"zh_CN": "zh",
"zh_HK": false,
"zh_TW": false,
"en_US": "en",
"en_GB": "en",
"af_ZA": "af",
"sq_AL": "sq",
"am_ET": "am",
"ar_SA": "ar",
"hy_AM": "hy",
"as_IN": false,
"az_Latn_AZ": "az",
"bn_BD": "bn",
"ba_RU": "ba",
"eu_ES": "eu",
"bs_Latn_BA": "bs",
"bg_BG": "bg",
"ca_ES": "ca",
"hr_HR": "hr",
"cs_CZ": "cs",
"da_DK": "da",
"prs_AF": false,
"dv_MV": false,
"nl_NL": "nl",
"et_EE": "et",
"fo_FO": false,
"fj_FJ": false,
"fil_PH": false,
"fi_FI": "fi",
"fr_FR": "fr",
"fr_CA": false,
"gl_ES": "gl",
"ka_GE": "ka",
"de_DE": "de",
"el_GR": "el",
"gu_IN": "gu",
"ht_HT": "ht",
"he_IL": "he",
"hi_IN": "hi",
"mww_Latn_US": false,
"hu_HU": "hu",
"is_IS": "is",
"id_ID": "id",
"ikt_CA": false,
"iu_CA": false,
"iu_Latn_CA": false,
"ga_IE": "ga",
"it_IT": "it",
"ja_JP": "ja",
"kn_IN": "kn",
"kk_KZ": "kk",
"km_KH": "km",
"tlh_Latn": false,
"tlh_Piqd": false,
"ko_KR": "ko",
"ku_Arab_IQ": false,
"ku_Latn_TR": false,
"ky_KG": "ky",
"lo_LA": "lo",
"lv_LV": "lv",
"lt_LT": "lt",
"mk_MK": "mk",
"mg_MG": "mg",
"ms_Latn_MY": "ms",
"ml_IN": "ml",
"mt_MT": "mt",
"mi_NZ": "mi",
"mr_IN": "mr",
"mn_Cyrl_MN": "mn",
"mn_Mong_CN": "mn",
"my_MM": "my",
"ne_NP": "ne",
"no_NO": "no",
"or_IN": false,
"ps_AF": false,
"fa_IR": "fa",
"pl_PL": "pl",
"pt_BR": "pt-BR",
"pt_PT": "pt",
"pa_Guru_IN": "pa",
"otq_Latn_MX": false,
"ro_RO": "ro",
"ru_RU": "ru",
"sm_Latn_WS": false,
"sr_Cyrl_RS": "sr",
"sr_Latn_RS": "sr-Latn",
"sk_SK": "sk",
"sl_SI": "sl",
"so_SO": false,
"es_ES": "es",
"sw_KE": "sw",
"sv_SE": "sv",
"ty_PF": false,
"ta_IN": "ta",
"tt_Latn_RU": "tt",
"te_IN": "te",
"th_TH": "th",
"bo_CN": false,
"ti_ET": false,
"to_TO": false,
"tr_TR": "tr",
"uk_UA": "uk",
"ur_PK": "ur",
"ug_Arab_CN": false,
"uz_Latn_UZ": "uz",
"vi_VN": "vi",
"cy_GB": "cy",
"yua_MX": false,
"zu_ZA": "zu"
},
"help": [
{
"title": "Yandex - Yandex, Russia",
"url": "https://translate.yandex.com/"
},
{
"title": "[github]translators",
"url": "https://github.com/UlionTse/translators"
}
]
},
{
"key": "niutrans_free",
"name": "[Free] Niutrans / 小牛翻译, China",
"type": "translators",
"translator": "niutrans",
"support": {
"zh_CN": "zh",
"zh_HK": "cht",
"zh_TW": "cht",
"en_US": "en",
"en_GB": "en",
"af_ZA": "af",
"sq_AL": "sq",
"am_ET": "am",
"ar_SA": "ar",
"hy_AM": "hy",
"as_IN": false,
"az_Latn_AZ": "az",
"bn_BD": "bn",
"ba_RU": "ba",
"eu_ES": "eu",
"bs_Latn_BA": "bs",
"bg_BG": "bg",
"ca_ES": "ca",
"hr_HR": "hr",
"cs_CZ": "cs",
"da_DK": "da",
"prs_AF": false,
"dv_MV": "dv",
"nl_NL": "nl",
"et_EE": "et",
"fo_FO": "fo",
"fj_FJ": "fj",
"fil_PH": "fil",
"fi_FI": "fi",
"fr_FR": "fr",
"fr_CA": "fr",
"gl_ES": "gl",
"ka_GE": "ka",
"de_DE": "de",
"el_GR": "el",
"gu_IN": "gu",
"ht_HT": "ht",
"he_IL": "he",
"hi_IN": "hi",
"mww_Latn_US": "mww",
"hu_HU": "hu",
"is_IS": "is",
"id_ID": "id",
"ikt_CA": false,
"iu_CA": false,
"iu_Latn_CA": false,
"ga_IE": "ga",
"it_IT": "it",
"ja_JP": "ja",
"kn_IN": "kn",
"kk_KZ": "kk",
"km_KH": "km",
"tlh_Latn": false,
"tlh_Piqd": false,
"ko_KR": "ko",
"ku_Arab_IQ": "ku",
"ku_Latn_TR": false,
"ky_KG": "ky",
"lo_LA": "lo",
"lv_LV": "lv",
"lt_LT": "lt",
"mk_MK": "mk",
"mg_MG": "mg",
"ms_Latn_MY": "ms",
"ml_IN": "ml",
"mt_MT": "mt",
"mi_NZ": "mi",
"mr_IN": "mr",
"mn_Cyrl_MN": "mn",
"mn_Mong_CN": "mn",
"my_MM": "my",
"ne_NP": "ne",
"no_NO": "no",
"or_IN": "or",
"ps_AF": "ps",
"fa_IR": "fa",
"pl_PL": "pl",
"pt_BR": "pt",
"pt_PT": "pt",
"pa_Guru_IN": "pa",
"otq_Latn_MX": "otq",
"ro_RO": "ro",
"ru_RU": "ru",
"sm_Latn_WS": "sm",
"sr_Cyrl_RS": "sr",
"sr_Latn_RS": "sr",
"sk_SK": "sk",
"sl_SI": "sl",
"so_SO": "so",
"es_ES": "es",
"sw_KE": "sw",
"sv_SE": "sv",
"ty_PF": "ty",
"ta_IN": "ta",
"tt_Latn_RU": "tt",
"te_IN": "te",
"th_TH": "th",
"bo_CN": false,
"ti_ET": "ti",
"to_TO": "to",
"tr_TR": "tr",
"uk_UA": "uk",
"ur_PK": "ur",
"ug_Arab_CN": false,
"uz_Latn_UZ": "uz",
"vi_VN": "vi",
"cy_GB": "cy",
"yua_MX": "yua",
"zu_ZA": "zu"
},
"help": [
{
"title": "Niutrans/小牛翻译 - Northeastern University / Niutrans, China",
"url": "https://niutrans.com/trans"
},
{
"title": "[github]translators",
"url": "https://github.com/UlionTse/translators"
}
]
},
{
"key": "qqFanyi_free",
"name": "[Free] QQFanyi / 腾讯翻译君, China",
"type": "translators",
"translator": "qqFanyi",
"support": {
"zh_CN": "zh",
"fr_FR": "fr",
"es_ES": "es",
"it_IT": "it",
"de_DE": "de",
"tr_TR": "tr",
"ru_RU": "ru",
"pt_PT": "pt",
"vi_VN": "vi",
"id_ID": "id",
"th_TH": "th",
"ms_Latn_MY": "ms",
"ar_SA": "ar",
"hi_IN": "hi"
},
"help": [
{
"title": "QQFanyi/腾讯翻译君 - Tencent, China",
"url": "https://fanyi.qq.com/"
},
{
"title": "[github]translators",
"url": "https://github.com/UlionTse/translators"
}
]
},
{
"key": "volcEngine_free",
"name": "[Free] VolcEngine / 火山翻译, China",
"type": "translators",
"translator": "volcEngine",
"support": {
"zh_CN": "zh",
"zh_HK": "zh-Hant",
"zh_TW": "zh-Hant",
"en_US": "en",
"en_GB": "en",
"af_ZA": "af",
"sq_AL": "sq",
"am_ET": "am",
"ar_SA": "ar",
"hy_AM": "hy",
"as_IN": false,
"az_Latn_AZ": "az",
"bn_BD": "bn",
"ba_RU": "ba",
"eu_ES": false,
"bs_Latn_BA": "bs",
"bg_BG": "bg",
"ca_ES": "ca",
"hr_HR": "hr",
"cs_CZ": "cs",
"da_DK": "da",
"prs_AF": false,
"dv_MV": false,
"nl_NL": "nl",
"et_EE": "et",
"fo_FO": false,
"fj_FJ": "fj",
"fil_PH": false,
"fi_FI": "fi",
"fr_FR": "fr",
"fr_CA": "fr",
"gl_ES": "gl",
"ka_GE": "ka",
"de_DE": "de",
"el_GR": "el",
"gu_IN": "gu",
"ht_HT": "ht",
"he_IL": "he",
"hi_IN": "hi",
"mww_Latn_US": false,
"hu_HU": "hu",
"is_IS": false,
"id_ID": "id",
"ikt_CA": false,
"iu_CA": "iu",
"iu_Latn_CA": "iu",
"ga_IE": false,
"it_IT": "it",
"ja_JP": "ja",
"kn_IN": "kn",
"kk_KZ": false,
"km_KH": "km",
"tlh_Latn": false,
"tlh_Piqd": false,
"ko_KR": "ko",
"ku_Arab_IQ": false,
"ku_Latn_TR": "kmr",
"ky_KG": false,
"lo_LA": "lo",
"lv_LV": "lv",
"lt_LT": "lt",
"mk_MK": "mk",
"mg_MG": false,
"ms_Latn_MY": "ms",
"ml_IN": "ml",
"mt_MT": false,
"mi_NZ": false,
"mr_IN": "mr",
"mn_Cyrl_MN": "mn",
"mn_Mong_CN": "mn",
"my_MM": "my",
"ne_NP": false,
"no_NO": "no",
"or_IN": false,
"ps_AF": false,
"fa_IR": "fa",
"pl_PL": "pl",
"pt_BR": "pt",
"pt_PT": "pt",
"pa_Guru_IN": "pa",
"otq_Latn_MX": false,
"ro_RO": "ro",
"ru_RU": "ru",
"sm_Latn_WS": "sm",
"sr_Cyrl_RS": "sr",
"sr_Latn_RS": "sr",
"sk_SK": "sk",
"sl_SI": "sl",
"so_SO": "so",
"es_ES": "es",
"sw_KE": "sw",
"sv_SE": "sv",
"ty_PF": "ty",
"ta_IN": "ta",
"tt_Latn_RU": "tt",
"te_IN": "te",
"th_TH": "th",
"bo_CN": false,
"ti_ET": "ti",
"to_TO": "to",
"tr_TR": "tr",
"uk_UA": "uk",
"ur_PK": "ur",
"ug_Arab_CN": false,
"uz_Latn_UZ": false,
"vi_VN": "vi",
"cy_GB": "cy",
"yua_MX": false,
"zu_ZA": "zu"
},
"help": [
{
"title": "VolcEngine/火山翻译 - Bytedance, China",
"url": "https://translate.volcengine.com/"
},
{
"title": "[github]translators",
"url": "https://github.com/UlionTse/translators"
}
]
},
{
"key": "yeekit_free",
"name": "[Free] Yeekit / 中译语通, China",
"type": "translators",
"translator": "yeekit",
"support": {
"ar_SA": "ar",
"ru_RU": "ru",
"de_DE": "de",
"fr_FR": "fr",
"ko_KR": "ko",
"pt_BR": "pt",
"pt_PT": "pt",
"ja_JP": "ja",
"es_ES": "es",
"en_US": "en",
"zh_CN": "zh"
},
"help": [
{
"title": "Yeekit/中译语通 - CTC, China",
"url": "https://www.yeekit.com/site/translate"
},
{
"title": "[github]translators",
"url": "https://github.com/UlionTse/translators"
}
]
}
]
zh ()
zh-Hant ()
tn
vi
iu
it
id
hi
en
ho
he
es 西
el
uk
ur
tk
tr
ti
ty
tl
to
th
ta
te
sl
sk
ss
eo
sm
sg
st
sv
ja
tw
qu
pt
pa
no
nb
nr
my
bn
mn
mh
mk
ml
mr
ms
lu
ro
lt
lv
lo
kj
hr
kn
ki
cs
ca
nl
ko
ht
gu
ka
kl
km
lg
kg
fi
fj
fr
ru
ng
de
tt
da
ts
cv
fa
bs
pl
bi
nd
ba
bg
az
ar
af
sq
ab
os
ee
et
ay
lzh
am
ckb
cy
gl 西
ha
hy
ig
kmr
ln
nso
ny
om
sn
so
sr
sw
xh
yo
zu

View File

@ -3081,6 +3081,136 @@
"type": "input"
}
]
},
{
"key": "volcengine",
"name": "[ApiKey] VolcEngine / 火山翻译 [2,000,000 chars/month]",
"concurrent": 10,
"support": {
"zh_CN": "zh",
"zh_HK": "zh-Hant",
"zh_TW": "zh-Hant",
"en_US": "en",
"en_GB": "en",
"af_ZA": "af",
"sq_AL": "sq",
"am_ET": "am",
"ar_SA": "ar",
"hy_AM": "hy",
"az_Latn_AZ": "az",
"bn_BD": "bn",
"ba_RU": "ba",
"bs_Latn_BA": "bs",
"bg_BG": "bg",
"ca_ES": "ca",
"hr_HR": "hr",
"cs_CZ": "cs",
"da_DK": "da",
"nl_NL": "nl",
"et_EE": "et",
"fj_FJ": "fj",
"fi_FI": "fi",
"fr_FR": "fr",
"fr_CA": "fr",
"gl_ES": "gl",
"ka_GE": "ka",
"de_DE": "de",
"el_GR": "el",
"gu_IN": "gu",
"ht_HT": "ht",
"he_IL": "he",
"hi_IN": "hi",
"id_ID": "id",
"iu_CA": "iu",
"iu_Latn_CA": "iu",
"it_IT": "it",
"ja_JP": "ja",
"kn_IN": "kn",
"km_KH": "km",
"ko_KR": "ko",
"lo_LA": "lo",
"lv_LV": "lv",
"lt_LT": "lt",
"mk_MK": "mk",
"ms_Latn_MY": "ms",
"ml_IN": "ml",
"mr_IN": "mr",
"mn_Cyrl_MN": "mn",
"mn_Mong_CN": "mn",
"my_MM": "my",
"no_NO": "no",
"fa_IR": "fa",
"pl_PL": "pl",
"pt_BR": "pt",
"pt_PT": "pt",
"pa_Guru_IN": "pa",
"ro_RO": "ro",
"ru_RU": "ru",
"sm_Latn_WS": "sm",
"sr_Cyrl_RS": "sr",
"sr_Latn_RS": "sr",
"sk_SK": "sk",
"sl_SI": "sl",
"so_SO": "so",
"es_ES": "es",
"sw_KE": "sw",
"sv_SE": "sv",
"ty_PF": "ty",
"ta_IN": "ta",
"tt_Latn_RU": "tt",
"te_IN": "te",
"th_TH": "th",
"ti_ET": "ti",
"to_TO": "to",
"tr_TR": "tr",
"uk_UA": "uk",
"ur_PK": "ur",
"vi_VN": "vi",
"cy_GB": "cy",
"zu_ZA": "zu"
},
"help": [
{
"title": "[official] 火山翻译",
"url": "https://www.volcengine.com/docs/4640/130872"
},
{
"title": "【中文】申请教程 by BobTranslate",
"url": "https://bobtranslate.com/service/translate/volcengine.html"
},
{
"title": "【中文】申请教程 by TTime",
"url": "https://ttime.timerecord.cn/pages/5f5d10/"
},
{
"title": "【中文】申请教程 by Pot",
"url": "https://pot.pylogmon.com/docs/tutorial/api/volcengine"
}
],
"config": [
{
"key": "access_key_id",
"title": "Access Key ID",
"type": "input"
},
{
"key": "access_key_secret",
"title": "Secret Access Key",
"type": "input"
},
{
"key": "region",
"title": "Region",
"type": "select",
"default": "cn-north-1",
"options": [
"cn-beijing",
"cn-shanghai",
"cn-guangzhou",
"cn-north-1"
]
}
]
}
]
}