sh 将stdin转换为其他语言并将其保存为输出路径为.json文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sh 将stdin转换为其他语言并将其保存为输出路径为.json文件相关的知识,希望对你有一定的参考价值。
#!/bin/bash
declare -a List=(en it de es pt fr et fi)
USAGE=$(cat <<-EOM
Usage: ${0##*/} [OPTION]... [FILE]...
EOM
)
INFO=$(cat <<-EOM
Example:
${0} -t -a -o App_Data/Localization/client --template mustashe Content/scripts/**/*.js
Translates stdin in ${List[*]} languages and saves to output path as .json file:
{
"{prefix}:{tag}": {
"{lang}": "{translated text}"
}
}
for future convertion with https://github.com/mikeedwards/po2json
EOM
)
save=0
debug=0
translate=0
prefix=""
output=""
template="mustashe"
files=()
KEY=""
for i in "$@" ; do
case "$i" in
--template ) shift ; template=$1 ; shift ;; # use template [ mustashe | csharp ]
-o|--output ) shift ; output=$1 ; shift ;; # Output path for {prefix}.json files
-k|--key ) shift ; KEY=$1 ; shift ;; # Yandex API key
-p|--prefix ) shift ; prefix=$1 ; shift ;; # Replace prefix for tag
-t|--translate ) shift ; translate=1 ;; # Requests translation of the text for each language
-d|--debug ) shift ; debug=1 ;; # Switch to debug mode
-a|--apply ) shift ; save=1 ;; # Replace in affected files
-h ) echo "$USAGE" ; fgrep -h ')'' ' $0 | awk -F')'' | #'' ' '{printf "%-40s %s\n", $1, $3}' ; echo "$INFO" ; exit ; # Print this line
esac
done
if [ $debug -eq 1 ] ; then
echo "DEBUG MODE IS ENABLED"
echo "args: $@"
fi
# найти текстовые строки | trim | uniq | сортировать
TEXT=$(grep -hroP '([А-Яа-яЁё]+[\s\-\,\.\!\?\:«»\d\w\(\)]*)*' $@ | sed 's/^[ \t]*//gim' | uniq | awk '{ print length, $0 }' | sort -n -s -r | cut -d" " -f2- | grep -v '^$')
if [ $debug -eq 1 ] ; then
echo "TEXT: $TEXT"
echo "template: $template"
echo "output: $output"
echo "prefix: $prefix"
echo "translate: $translate"
echo "debug: $debug"
echo "apply: $save"
fi
if [ -z "$TEXT" ] ; then
echo "No text input found"
exit;
fi
while IFS= read -r LINE ; do
if [ ${#LINE} -lt 3 ] ; then
break;
fi
if [ $debug -eq 1 ] ; then
echo -e "LINE: $LINE"
fi
path=$(grep -rl "$LINE" $@ | awk -F: '{ print $1 }')
basename="${path##*/}"
filename="${basename%.*}"
if [ -z "$prefix" ] ; then
prefix="$filename"
fi
outfile="$output/$prefix.json"
files=("${files[@]}" "$outfile")
affected=$(grep -re "$LINE" $@ -l)
if [ $debug -eq 1 ] ; then
echo "path: $path"
echo "basename: $basename"
echo "filename: $filename"
echo "Affected files: $affected"
tag="..."
if [ $template = "mustashe" ] ; then
echo "$LINE {{$prefix:$tag}}"
elif [ $template = "csharp" ] ; then
echo "$LINE @L10n.Get(\"$prefix:$tag\")"
fi
fi
out=""
for lang in "${List[@]}"; do
if [ $translate -eq 1 ] ; then
translated=$(curl -s --data-urlencode "text=$LINE" "https://translate.yandex.net/api/v1.5/tr.json/translate?key=$KEY&lang=ru-$lang&format=plain" | python3 -c "import sys, json; print(json.load(sys.stdin)['text'][0])")
fi
if [ $lang = "en" ] ; then
tag="..."
if [ ! -e $outfile ] ; then
touch $outfile;
out+="{\n";
else
out+=",\n";
fi
if [ $translate -eq 1 ] ; then
tag=$(echo "$translated" | sed 's/\W//g')
fi
out+="\"$prefix:$tag\": {\n"
out+=" \"ru\": \"$LINE\",\n"
if [ $save -eq 1 ] ; then
if [ $template = "mustashe" ] ; then
sed -i "s/$LINE/{{$prefix:$tag}}/gm" $affected
elif [ $template = "csharp" ] ; then
sed -i "s/$LINE/@L10n.Get(\"$prefix:$tag\")/gm" $affected
fi
fi
fi
out+=" \"$lang\": \"$translated\""
if [ $lang != "fi" ] ; then
out+=","
fi
out+="\n"
done
out+="}"
if [ $debug -eq 0 ] ; then
printf "$out" >> $outfile
else
echo "outfile: $outfile"
fi
done <<< "$(printf '%s\n' "$TEXT")";
while read outfile ; do
if [ $debug -eq 0 ] ; then
printf "}\n" >> $outfile
fi
done <<< "$(echo -e $files)"
以上是关于sh 将stdin转换为其他语言并将其保存为输出路径为.json文件的主要内容,如果未能解决你的问题,请参考以下文章
在 php 中将 XML 文档转换为数组时,有没有办法将其转换回来并将其保存为属性为元素的 XML 文件?
如何将base64图像转换为图像并将其保存到文件系统[重复]
PLCrashReporter - 如何直接从 Xcode 本身将 .plcrash 转换为 .crash 并将其保存在本地