app-starlock/translation.sh

264 lines
7.6 KiB
Bash
Raw Permalink Normal View History

2024-07-25 10:47:09 +08:00
#!/bin/bash
#主语言包
2024-07-25 11:27:52 +08:00
MAIN_LANGUAGE_PATH="lan_en.json"
#语言包存储前缀路径
BASE_PATH="./lan"
2024-07-25 10:47:09 +08:00
#原语言
SOURCE_LANGUAGE="en"
2024-07-25 11:27:52 +08:00
#项目语言常量
#LAN_ZH_CN="zh_CN"
#LAN_ZH_TW="zh_TW"
#LAN_EN_US="en_US"
LAN_ZH_CN="zh" # 简体中文
LAN_EN_US="en" # 英文
LAN_ZH_TW="tw" # 繁体中文
LAN_Fr_FR="fr" # 法语
LAN_RU_RU="ru" # 俄语
LAN_DE_DE="de" # 德语
LAN_ZH_JA="ja" # 日语
LAN_ZH_KO="ko" # 韩语
LAN_ZH_IT="it" # 意大利语
#LAN_ZH_TW="tw" # 乌克兰语
LAN_ZH_PT="pt" # 葡萄牙语
LAN_ZH_ES="es" # 西班牙语
LAN_ZH_AR="ar" # 阿拉伯语
LAN_ZH_vi="vi" # 越南语
LAN_ZH_MS="ms" # 马莱语
LAN_ZH_NL="nl" # 荷兰语
LAN_ZH_RO="ro" # 罗马尼亚语
LAN_ZH_LT="lt" # 立陶宛语
LAN_ZH_SV="sv" # 瑞典语
LAN_ZH_ET="et" # 爱沙尼亚语
LAN_ZH_PL="pl" # 波兰语
LAN_ZH_SK="sk" # 斯洛伐克语
LAN_ZH_CS="cs" # 捷克语
LAN_ZH_EL="el" # 希腊语
LAN_ZH_HE="he" # 希伯来语
#LAN_ZH_TW="tw" # 塞尔维亚文
LAN_ZH_TR="tr" # 土耳其语
LAN_ZH_HU="hu" # 匈牙利语
LAN_ZH_BG="bg" # 保加利亚语
LAN_ZH_KK="kk" # 哈萨克斯坦语 === 哈萨克语
LAN_ZH_BN="bn" # 孟加拉语
LAN_ZH_HBS="hbs" # 克罗地亚语
LAN_ZH_TH="th" # 泰语
LAN_ZH_ID="id" # 印度尼西亚语
LAN_ZH_FI="fi" # 芬兰语
LAN_ZH_DA="da" # 丹麦语
2024-07-25 11:27:52 +08:00
declare -A LANG_LIST=(
["$LAN_ZH_CN"]="简体中文"
["$LAN_ZH_TW"]="繁体中文"
["$LAN_EN_US"]="英文"
)
# 项目语言映射到阿里云 阿里云API语言代码请看https://help.aliyun.com/zh/machine-translation/support/supported-languages-and-codes?spm=a2c4g.11186623.0.0.42484f4fJXlVRF
declare -A ALIYUN_LANG_MAP=(
["$LAN_ZH_CN"]="zh"
["$LAN_ZH_TW"]="zh-tw"
["$LAN_EN_US"]="en"
# ["$LAN_ZH_CN"]="zh" # 简体中文
# ["$LAN_EN_US"]="en" # 英文
# ["$LAN_ZH_TW"]="tw" # 繁体中文
["$LAN_Fr_FR"]="fr" # 法语
["$LAN_RU_RU"]="ru" # 俄语
["$LAN_DE_DE"]="de" # 德语
["$LAN_ZH_JA"]="ja" # 日语
["$LAN_ZH_KO"]="ko" # 韩语
["$LAN_ZH_IT"]="it" # 意大利语
#LAN_ZH_TW="tw" # 乌克兰语
["$LAN_ZH_PT"]="pt" # 葡萄牙语
["$LAN_ZH_ES"]="es" # 西班牙语
["$LAN_ZH_AR"]="ar" # 阿拉伯语
["$LAN_ZH_vi"]="vi" # 越南语
["$LAN_ZH_MS"]="ms" # 马莱语
["$LAN_ZH_NL"]="nl" # 荷兰语
["$LAN_ZH_RO"]="ro" # 罗马尼亚语
["$LAN_ZH_LT"]="lt" # 立陶宛语
["$LAN_ZH_SV"]="sv" # 瑞典语
["$LAN_ZH_ET"]="et" # 爱沙尼亚语
["$LAN_ZH_PL"]="pl" # 波兰语
["$LAN_ZH_SK"]="sk" # 斯洛伐克语
["$LAN_ZH_CS"]="cs" # 捷克语
["$LAN_ZH_EL"]="el" # 希腊语
["$LAN_ZH_HE"]="he" # 希伯来语
#LAN_ZH_TW="tw" # 塞尔维亚文
["$LAN_ZH_TR"]="tr" # 土耳其语
["$LAN_ZH_HU"]="hu" # 匈牙利语
["$LAN_ZH_BG"]="bg" # 保加利亚语
["$LAN_ZH_KK"]="kk" # 哈萨克斯坦语 === 哈萨克语
["$LAN_ZH_BN"]="bn" # 孟加拉语
["$LAN_ZH_HBS"]="hbs" # 克罗地亚语
["$LAN_ZH_TH"]="th" # 泰语
["$LAN_ZH_ID"]="id" # 印度尼西亚语
["$LAN_ZH_FI"]="fi" # 芬兰语
["$LAN_ZH_DA"]="da" # 丹麦语
2024-07-25 11:27:52 +08:00
)
2024-07-25 10:47:09 +08:00
#===============以下代码请勿改动,除非知道怎么修复=============================
#阿里云KEYID
ACCESS_KEY_ID="LTAI5tFke4yGaY94ondXkmHn"
#阿里云KEYSECRET
ACCESS_KEY_SECRET="08zPw8BoRqfqlKDTMX65k7gfeER33x"
DOMAIN='mt.cn-hangzhou.aliyuncs.com/api/translate/web/ecommerce'
VERSION='2018-10-12'
ACTION='TranslateGeneral'
FORMAT='JSON'
SIGNATURE_METHOD='HMAC-SHA1'
SIGNATURE_VERSION='1.0'
2024-07-25 11:27:52 +08:00
2024-07-25 10:47:09 +08:00
# 执行自动翻译
autoTranslate() {
2024-07-25 11:27:52 +08:00
local en_us_path="$BASE_PATH/$MAIN_LANGUAGE_PATH"
2024-07-25 10:47:09 +08:00
local en_us_data=$(cat "$en_us_path" | jq -c '.')
# 创建临时文件
local tmpfile=$(mktemp)
# 将JSON数据写入临时文件
echo "$en_us_data" | jq -r 'to_entries | .[] | "\(.key) \(.value)"' > "$tmpfile"
2024-07-25 11:27:52 +08:00
# 循环遍历列表中的每种语言
for lang in "${!LANG_LIST[@]}"; do
# 过滤特定的语言
if [ "$lang" == "en_US" ]; then
continue
fi
local path="$BASE_PATH/lan_${ALIYUN_LANG_MAP[$lang]}.json"
# 如果文件不存在则跳过即创建并且默认写入json
if [ ! -f "$path" ]; then
echo "{}" > "$path"
fi
local data=$(cat "$path" | jq -c '.')
local total=$(echo "$en_us_data" | jq 'length')
local current=0
# 遍历JSON中的每个键值对
while read -r key value; do
current=$((current + 1))
echo "Processing item $current/$total)"
# 如果翻译已经存在,则跳过
if echo "$data" | jq -e --arg key "$key" '.[$key]' > /dev/null; then
continue
fi
# 尝试翻译这个值
translation=$(translate "$SOURCE_LANGUAGE" "${ALIYUN_LANG_MAP[$lang]}" "$value" )
#检测返回值是否ERROR
if [[ "$translation" == "ERROR" ]]; then
echo "Failed to translate: $key"
continue
fi
if [ -n "$translation" ]; then
#向data中添加key-value
data=$(echo "$data" | jq --arg key "$key" --arg translation "$translation" '. + {($key): $translation}')
fi
done < "$tmpfile" #读取临时文件
#将更新后的翻译写回文件
echo "$data" | jq '.' > "$path"
done
2024-07-25 10:47:09 +08:00
}
# 阿里云生成签名
generate_signature() {
local stringToSign=$1
local secret="$2&"
local signature=$(echo -n "$stringToSign" | openssl dgst -sha1 -binary -hmac "$secret" | base64)
echo $(urlencode "$signature")
}
# 阿里云发出API请求
translate() {
local accessKeyId=$ACCESS_KEY_ID
local accessKeySecret=$ACCESS_KEY_SECRET
local sourceLanguage=$1
local targetLanguage=$2
local sourceText=$3
local method='POST'
local timestamp=$(date -u "+%Y-%m-%dT%H:%M:%SZ")
local signatureNonce=$(date -u "+%Y-%m-%dT%H:%M:%SZ")
# Prepare API parameters
declare -A apiParams
apiParams=(
["Action"]=$ACTION
["Version"]=$VERSION
["FormatType"]="text"
["SourceLanguage"]=$sourceLanguage
["TargetLanguage"]=$targetLanguage
["SourceText"]=$sourceText
["Ccene"]="general"
["SignatureMethod"]=$SIGNATURE_METHOD
["SignatureNonce"]=$signatureNonce
["SignatureVersion"]=$SIGNATURE_VERSION
["AccessKeyId"]=$accessKeyId
["Timestamp"]=$timestamp
["Format"]=$FORMAT
)
# Sort parameters
sortedKeys=$(printf "%s\n" "${!apiParams[@]}" | sort)
sortedQueryString=""
for key in $sortedKeys; do
encodedKey=$(urlencode "$key")
encodedValue=$(urlencode "${apiParams[$key]}")
sortedQueryString="${sortedQueryString}&${encodedKey}=${encodedValue}"
done
sortedQueryString="${sortedQueryString:1}"
# Create the string to sign
stringToSign="${method}&%2F&$(urlencode "$sortedQueryString")"
# Generate the signature
signature=$(generate_signature "$stringToSign" "$accessKeySecret")
# Build the request URL
requestUrl="https://${DOMAIN}/?Signature=${signature}&${sortedQueryString}"
# Make the API request using curl
response=$(curl -s -X "$method" "$requestUrl" \
-H "x-sdk-client: bash/1.0.0")
# Handle the response
responseCode=$(echo "$response" | jq -r '.Code')
if [[ "$responseCode" == "200" ]]; then
echo $(echo "$response" | jq -r '.Data.Translated')
else
echo "ERROR"
fi
}
urlencode() {
local length="${#1}"
for ((i = 0; i < length; i++)); do
local c="${1:i:1}"
case $c in
[a-zA-Z0-9.~_-]) printf "$c" ;;
*) printf '%%%02X' "'$c" ;;
esac
done
}
# Run
autoTranslate