build: update build/i18n-* tools

modify i18n-add-language.sh so it can:
- be run from any path
- bootstrap any (or all) po folder(s) with existing language(s)
- (partially) update luci.mk with new languages

deprecate build/i18n-init.sh

Signed-off-by: Paul Donald <newtwen@gmail.com>
This commit is contained in:
Paul Donald 2024-01-03 13:14:06 +00:00
parent c487c4f184
commit b98d8c526e
7 changed files with 90 additions and 37 deletions

View File

@ -1,37 +1,71 @@
#!/usr/bin/env bash
LANG=$1
LANGS=$@
if [ "$#" -eq 0 ]; then
echo $0 "adds i18n catalogue(s) in po/ folders (luci-app-*, luci-mod-*, etc) for each LUCI_LANG.* in luci.mk"
echo "Hint: run in the root of the luci repo or in your luci-app-* folder."
case "$LANG" in
[a-z][a-z]|[a-z][a-z][_-][A-Za-z][A-Za-z]*) : ;;
*)
echo "Usage: $0 <ISO_CODE>\n" >&2
exit 1
;;
esac
# get existing language codes from luci.mk
language_codes=$(grep -o 'LUCI_LANG\.[a-zA-Z]*' $(dirname "$0")/../luci.mk | cut -d '.' -f 2 | sort -u)
LANGS=$language_codes
ADDED=0
else
for LANG in $LANGS; do
case "$LANG" in
[a-z][a-z]|[a-z][a-z][_-][A-Za-z][A-Za-z]*) : ;;
*)
echo $0 "adds i18n catalogues in each folder (luci-app-*, luci-mod-*, etc)."
echo "Usage: $0 <ISO_CODE> [<ISO_CODE> <ISO_CODE> ...]" >&2
exit 1
;;
esac
done
fi
for podir in ./*/*/po; do
ADDED=false
for podir in $(find . -type d -name "po"); do
[ -d "$podir/templates" ] || continue
mkdir "$podir/$LANG"
for catalog in $(cd "$podir/templates"; echo *.pot); do
if [ -f "$podir/templates/$catalog" -a ! -f "$podir/$LANG/${catalog%.pot}.po" ]; then
msginit --no-translator -l "$LANG" -i "$podir/templates/$catalog" -o "$podir/$LANG/${catalog%.pot}.po"
git add "$podir/$LANG/${catalog%.pot}.po"
ADDED=$((ADDED + 1))
fi
for LANG in $LANGS; do
# if "$podir/$LANG" doesn't exist, mkdir
[ -d "$podir/$LANG" ] || mkdir "$podir/$LANG"
for catalog in $(cd "$podir/templates"; echo *.pot); do
if [ -f "$podir/templates/$catalog" -a ! -f "$podir/$LANG/${catalog%.pot}.po" ]; then
msginit --no-translator -l "$LANG" -i "$podir/templates/$catalog" -o "$podir/$LANG/${catalog%.pot}.po"
git add "$podir/$LANG/${catalog%.pot}.po"
ADDED=true
fi
done
done
done
if [ $ADDED -gt 0 ]; then
echo ""
echo "Added $ADDED new translation catalogs for language '$LANG'."
echo "Please also edit 'luci.mk' and add"
echo ""
echo " LUCI_LANG.$LANG=Native Language Name"
echo ""
echo "to properly package the translation files."
echo ""
start_marker="^#LUCI_LANG_START$"
end_marker="^#LUCI_LANG_END$"
if [ $ADDED ]; then
for LANG in $LANGS; do
if [[ $language_codes != *"$LANG"* ]]; then
# Read the contents of the luci.mk file
file_content=$(cat "$(dirname "$0")/../luci.mk")
# Extract the section between start and end markers
section=$(awk -v start="$start_marker" -v end="$end_marker" '
$0 ~ start {RS="\n"; printf ""; flag=1; next}
$0 ~ end {flag=0} flag' <<< "$file_content")
# Add the new language code to the section
section+="\nLUCI_LANG.$LANG=New language"
# Sort the section and remove duplicates
updated_content=$(echo -e "$section" | sort -u | sed -E "/$start_marker/,/$end_marker/{ /$start_marker/{p; r /dev/stdin
}; /$end_marker/p; d
}" $(dirname "$0")/../luci.mk)
# Write the updated content back to the .mk file
echo "$updated_content" > $(dirname "$0")/../luci.mk
echo "Be sure to update the new language name in $(dirname "$0")/../luci.mk"
fi
done
fi

View File

@ -3,6 +3,10 @@
PATTERN=$1
SCM=
echo $0 "initialises po/ i18n catalogues in empty language sub-folders."
echo $0 "is deprecated and may be removed in the future."
echo "Hint: run i18n-add-language.sh instead."
[ -d .svn ] && SCM="svn"
git=$( command -v git 2>/dev/null )
[ "$git" ] && "$git" status >/dev/null && SCM="git"

View File

@ -294,7 +294,7 @@ waitpid $msguniq_pid, 0;
while (@pot > 0) {
my $line = shift @pot;
# Reorder the location comments in a detemrinistic way to
# Reorder the location comments in a deterministic way to
# reduce SCM noise when frequently updating templates.
if ($line =~ m!^#: !) {
my @locs = ($line);

View File

@ -52,7 +52,7 @@ my @dirs;
if( ! $source )
{
@dirs = glob("./*/*/po/");
@dirs = glob("./*/*/po");
}
else
{

View File

@ -8,9 +8,9 @@
echo -n "Updating modules/luci-base/po/templates/base.pot ... "
./build/i18n-scan.pl \
modules/luci-base/ modules/luci-compat/ modules/luci-lua-runtime/ \
modules/luci-mod-network modules/luci-mod-status modules/luci-mod-system/ \
protocols/ themes/ \
modules/luci-base modules/luci-compat modules/luci-lua-runtime \
modules/luci-mod-network modules/luci-mod-status modules/luci-mod-system \
protocols themes \
> modules/luci-base/po/templates/base.pot
echo "done"

View File

@ -59,6 +59,20 @@ The actual translation files can be found at `po/[lang]/[package].po`.
In order to use the commands below you need to have the `gettext` utilities (`msgcat`, `msgfmt`, `msgmerge`) installed on your system.
On Debian/Ubuntu you can install with `sudo apt install gettext`.
### Initialize po files
When you add or update an app, simply run from your app folder:
../../build/i18n-add-language.sh
This creates the skeleton po files for all existing languages open for translation for your app.
Or from the luci repo root:
./build/i18n-add-language.sh
This creates the skeleton po files for all existing languages open for translation for all sub-folders.
### Rebuild po files
If you want to rebuild the translations after you made changes to a package this is an easy way:

11
luci.mk
View File

@ -18,7 +18,7 @@ LUCI_MINIFY_LUA?=1
LUCI_MINIFY_CSS?=1
LUCI_MINIFY_JS?=1
# Language code titles
#LUCI_LANG_START
LUCI_LANG.ar=العربية (Arabic)
LUCI_LANG.bg=български (Bulgarian)
LUCI_LANG.bn_BD=বাংলা (Bengali)
@ -42,8 +42,8 @@ LUCI_LANG.ms=Bahasa Melayu (Malay)
LUCI_LANG.nb_NO=Norsk (Norwegian)
LUCI_LANG.nl=Nederlands (Dutch)
LUCI_LANG.pl=Polski (Polish)
LUCI_LANG.pt_BR=Português do Brasil (Brazilian Portuguese)
LUCI_LANG.pt=Português (Portuguese)
LUCI_LANG.pt_BR=Português do Brasil (Brazilian Portuguese)
LUCI_LANG.ro=Română (Romanian)
LUCI_LANG.ru=Русский (Russian)
LUCI_LANG.sk=Slovenčina (Slovak)
@ -53,6 +53,7 @@ LUCI_LANG.uk=Українська (Ukrainian)
LUCI_LANG.vi=Tiếng Việt (Vietnamese)
LUCI_LANG.zh_Hans=简体中文 (Chinese Simplified)
LUCI_LANG.zh_Hant=繁體中文 (Chinese Traditional)
#LUCI_LANG_END
# Submenu titles
LUCI_MENU.col=1. Collections
@ -130,10 +131,10 @@ include $(INCLUDE_DIR)/package.mk
# LUCI_SUBMENU: the submenu-item below the LuCI top-level menu inside OpenWrt menuconfig
# usually one of the LUCI_MENU.* definitions
# LUCI_SUBMENU_DEFAULT: the regular SUBMENU defined by LUCI_TYPE or derrived from the packagename
# LUCI_SUBMENU_FORCED: manually forced value SUBMENU to set to by explicit definiton
# LUCI_SUBMENU_DEFAULT: the regular SUBMENU defined by LUCI_TYPE or derived from the packagename
# LUCI_SUBMENU_FORCED: manually forced value SUBMENU to set to by explicit definition
# can be any string, "none" disables the creation of a submenu
# most usefull in combination with LUCI_CATEGORY, to make the package appear
# most useful in combination with LUCI_CATEGORY, to make the package appear
# anywhere in the menu structure
LUCI_SUBMENU_DEFAULT=$(if $(LUCI_MENU.$(LUCI_TYPE)),$(LUCI_MENU.$(LUCI_TYPE)),$(LUCI_MENU.app))
LUCI_SUBMENU=$(if $(LUCI_SUBMENU_FORCED),$(LUCI_SUBMENU_FORCED),$(LUCI_SUBMENU_DEFAULT))