#!/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