app-starlock/translation.sh

264 lines
7.6 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
#主语言包
MAIN_LANGUAGE_PATH="lan_en.json"
#语言包存储前缀路径
BASE_PATH="./lan"
#原语言
SOURCE_LANGUAGE="en"
#项目语言常量
#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" # 丹麦语
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" # 丹麦语
)
#===============以下代码请勿改动,除非知道怎么修复=============================
#阿里云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'
# 执行自动翻译
autoTranslate() {
local en_us_path="$BASE_PATH/$MAIN_LANGUAGE_PATH"
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"
# 循环遍历列表中的每种语言
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
}
# 阿里云生成签名
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