build: update build/i18n-* tools
authorPaul Donald <newtwen@gmail.com>
Wed, 3 Jan 2024 13:14:06 +0000 (13:14 +0000)
committerPaul Donald <newtwen@gmail.com>
Wed, 3 Jan 2024 13:14:06 +0000 (13:14 +0000)
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>
build/i18n-add-language.sh
build/i18n-init.sh
build/i18n-scan.pl
build/i18n-update.pl
build/mkbasepot.sh
docs/i18n.md
luci.mk

index b4a852efb72f5c32fc4e9a64ea7e14c5bc6cfc87..94568000e11c2e54896820cd944c37b1f859a2b7 100755 (executable)
@@ -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
-       [ -d "$podir/templates" ] || continue
+ADDED=false
 
-       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 podir in $(find . -type d -name "po"); do
+       [ -d "$podir/templates" ] || continue
+       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
index 94abdfcd568eecb5efc195b7e03dfb203d01887e..de8626163d0677366355387ef2c3586bd25fc013 100755 (executable)
@@ -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"
index f824e60943913e205520a9ed31b68490a828a381..6727e70cab906e2d59b71dcb3eb74836adcc297d 100755 (executable)
@@ -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);
index c82b4fe3dd610b53dcd5160400faa8fd1d915c3e..e97e3d2f350d1ba89eebe5cc020b3905d9010059 100755 (executable)
@@ -52,7 +52,7 @@ my @dirs;
 
 if( ! $source )
 {
-       @dirs = glob("./*/*/po/");
+       @dirs = glob("./*/*/po");
 }
 else
 {
index d59a151d6a08760d479cc97010c10444c6d45466..6a8e94becc62d8c8fac072440325d8b562e32443 100755 (executable)
@@ -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"
index 442ec2d0dd9338cc2a4f6bfab5baefba6682db31..471eb88f1eb72ec1648397a9e2454bf3a096afc9 100644 (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:
 
diff --git a/luci.mk b/luci.mk
index 53c5130681cc9d1642075387f4711948f8cae0e2..f348721fff7863ea7b3e7acdfe14660e7817b596 100644 (file)
--- a/luci.mk
+++ b/luci.mk
@@ -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))