264 lines
7.6 KiB
Bash
264 lines
7.6 KiB
Bash
#!/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 |