mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-01-20 16:50:28 -05:00
145 lines
3 KiB
Bash
Executable file
145 lines
3 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
# Copyright 2024 The Forgejo Authors. All rights reserved.
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
if [ -z "$1" ] || [ -z "$2" ]
|
|
then
|
|
echo "USAGE: $0 section key [key1 [keyN]]"
|
|
exit 1
|
|
fi
|
|
|
|
if ! [ -d ../options/locale_next ]
|
|
then
|
|
echo 'Call this script from the `tools` directory.'
|
|
exit 1
|
|
fi
|
|
|
|
destsection="$1"
|
|
keyJSON="$destsection.$2"
|
|
key1=""
|
|
keyN=""
|
|
if [ -n "$3" ]
|
|
then
|
|
key1="$3"
|
|
else
|
|
key1="$2"
|
|
fi
|
|
if [ -n "$4" ]
|
|
then
|
|
keyN="$4"
|
|
fi
|
|
|
|
cd ../options/locale
|
|
|
|
# Migrate the string in one file.
|
|
function process() {
|
|
file="$1"
|
|
exec 3<$file
|
|
|
|
val1=""
|
|
valN=""
|
|
cursection=""
|
|
line1=0
|
|
lineN=0
|
|
lineNumber=0
|
|
|
|
# Parse the file
|
|
while read -u 3 line
|
|
do
|
|
((++lineNumber))
|
|
if [[ $line =~ ^\[[-._a-zA-Z0-9]+\]$ ]]
|
|
then
|
|
cursection="${line#[}"
|
|
cursection="${cursection%]}"
|
|
elif [ "$cursection" = "$destsection" ]
|
|
then
|
|
key="${line%%=*}"
|
|
value="${line#*=}"
|
|
key="$(echo $key)" # Trim leading/trailing whitespace
|
|
value="$(echo $value)"
|
|
|
|
if [ "$key" = "$key1" ]
|
|
then
|
|
val1="$value"
|
|
line1=$lineNumber
|
|
fi
|
|
if [ -n "$keyN" ] && [ "$key" = "$keyN" ]
|
|
then
|
|
valN="$value"
|
|
lineN=$lineNumber
|
|
fi
|
|
|
|
if [ -n "$val1" ] && ( [ -n "$valN" ] || [ -z "$keyN" ] )
|
|
then
|
|
# Found all desired strings
|
|
break
|
|
fi
|
|
fi
|
|
done
|
|
|
|
if [ -n "$val1" ] || [ -n "$valN" ]
|
|
then
|
|
localename="${file#locale_}"
|
|
localename="${localename%.ini}"
|
|
localename="${localename%-*}"
|
|
|
|
if [ "$file" = "locale_en-US.ini" ]
|
|
then
|
|
# Delete migrated string from source file
|
|
if [ $line1 -gt 0 ] && [ $lineN -gt 0 ] && [ $lineN -ne $line1 ]
|
|
then
|
|
sed -i "${line1}d;${lineN}d" "$file"
|
|
elif [ $line1 -gt 0 ]
|
|
then
|
|
sed -i "${line1}d" "$file"
|
|
elif [ $lineN -gt 0 ]
|
|
then
|
|
sed -i "${lineN}d" "$file"
|
|
fi
|
|
fi
|
|
|
|
# Write JSON
|
|
jsonfile="../locale_next/${file/.ini/.json}"
|
|
|
|
pluralform="other"
|
|
oneform="one"
|
|
case $localename in
|
|
"be" | "bs" | "cnr" | "csb" | "hr" | "lt" | "pl" | "ru" | "sr" | "szl" | "uk" | "wen")
|
|
# These languages have no "other" form and use "many" instead.
|
|
pluralform="many"
|
|
;;
|
|
"ace" | "ay" | "bm" | "bo" | "cdo" | "cpx" | "crh" | "dz" | "gan" | "hak" | "hnj" | "hsn" | "id" | "ig" | "ii" | "ja" | "jbo" | "jv" | "kde" | "kea" | "km" | "ko" | "kos" | "lkt" | "lo" | "lzh" | "ms" | "my" | "nan" | "nqo" | "osa" | "sah" | "ses" | "sg" | "son" | "su" | "th" | "tlh" | "to" | "tok" | "tpi" | "tt" | "vi" | "wo" | "wuu" | "yo" | "yue" | "zh")
|
|
# These languages have no singular form.
|
|
oneform=""
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
|
|
content=""
|
|
if [ -z "$keyN" ]
|
|
then
|
|
content="$(jq --arg val "$val1" ".$keyJSON = \$val" < "$jsonfile")"
|
|
else
|
|
object='{}'
|
|
if [ -n "$val1" ] && [ -n "$oneform" ]
|
|
then
|
|
object=$(jq --arg val "$val1" ".$oneform = \$val" <<< "$object")
|
|
fi
|
|
if [ -n "$valN" ]
|
|
then
|
|
object=$(jq --arg val "$valN" ".$pluralform = \$val" <<< "$object")
|
|
fi
|
|
content="$(jq --argjson val "$object" ".$keyJSON = \$val" < "$jsonfile")"
|
|
fi
|
|
jq . <<< "$content" > "$jsonfile"
|
|
fi
|
|
}
|
|
|
|
for file in *.ini
|
|
do
|
|
process "$file" &
|
|
done
|
|
wait
|
|
|