1
0
Fork 0
mirror of https://codeberg.org/forgejo/forgejo.git synced 2025-01-20 16:50:28 -05:00
forgejo/tools/migrate_locales.sh

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