#!/usr/bin/env bash # Copyright (c) 2021-2022 darkmaster @grm34 Neternels Team # # Permission is hereby granted, free of charge, to any person # obtaining a copy of this software and associated documentation # files (the "Software"), to deal in the Software without restriction, # including without limitation the rights to use, copy, modify, merge, # publish, distribute, sublicense, and/or sell copies of the Software, # and to permit persons to whom the Software is furnished to do so, # subject to the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # [!] ZMB Translate... # ------------------------------------------------------------------- # This script automatically translates base language strings and adds # them into the various translations (original will be used on error). # It also removes duplicate strings and rearranges them alphabetically. # ------------------------------------------------------------------- # Shell options shopt -s progcomp shopt -u dirspell progcomp_alias _sort_strings() { # RM duplicate strings from an array and sorts them alphabetically # Usage: _sort_strings "$@" (array of strings) # Returns: $sorted_strings (array) local string strings declare -A strings for string in "${@}"; do [[ $string ]] && IFS=" " strings["${string:- }"]=1 done # shellcheck disable=SC2207 IFS=$'\n' sorted_strings=($(sort <<< "${!strings[*]}")) unset IFS } _clean_cfg_files() { # RM duplicates lines and sorts them alphabetically # Usage: _clean_cfg_files "$@" (array of files) local file for file in "$@"; do mapfile -t strings < "$file" _sort_strings "${strings[@]}" printf "%s\n" "${sorted_strings[@]}" > "$file" done } _get_strings_from_cfg() { # Grabs strings from CFG files # Usage: _get_strings_from_cfg "$@" (array of files) # Returns: $_strings $cfg_list (arrays) local file name for file in "$@"; do name=${file##*/}; name="${name/.cfg/_strings}" mapfile -t "$name" < "$file" [[ $name != en_strings ]] && cfg_list+=("$name") done } _get_string_data() { # Grabs string name and string value # Returns: $data (array) IFS=$'\n' read -d "" -ra data <<< "${1//=/$'\n'}" data[1]=${data[1]//\"} unset IFS } _translate_string() { # Usage: _translate_string "string" "language code" # Returns: $translated (string) translated="$(curl -s https://api-free.deepl.com/v2/translate \ -d auth_key=f1414922-db81-5454-67bd-9608cdca44b3:fx \ -d "text=$1" -d "target_lang=${2^^}" \ | grep -o '"text":"[^"]*' | grep -o '[^"]*$')" } _translate_and_add_missing_strings_into_cfg() { # Translates then write missing strings from base language # into the various translation files (from $cfg_list) local line language trad_strings for line in "${en_strings[@]:?}"; do _get_string_data "$line" for language in "${cfg_list[@]}"; do declare -n trad_strings="$language" if [[ "${trad_strings[*]}" != *"${data[0]}="* ]]; then _translate_string "${data[1]}" "${language/_strings}" [[ -n $translated ]] && line="${data[0]}=\"${translated}\"" [[ -n $translated ]] && note="translated" || note="original" trad_strings+=("$line"); file="${language/_strings/.cfg}" printf "%s\n" "${trad_strings[@]}" > "lang/$file" echo "=> ${data[0]} (${note}) added into $file" fi done done } # Run ZMB Translate if [[ $1 == zmb ]]; then echo "Running ZMB translate (this could take a while)..." _clean_cfg_files lang/*.cfg _get_strings_from_cfg lang/*.cfg _translate_and_add_missing_strings_into_cfg _clean_cfg_files lang/*.cfg [[ $note ]] && echo "==> done" || echo "==> nothing to translate" else echo "ERROR: you must specify 'zmb' as argument" fi