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:
parent
c487c4f184
commit
b98d8c526e
7 changed files with 90 additions and 37 deletions
|
@ -1,37 +1,71 @@
|
||||||
#!/usr/bin/env bash
|
#!/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."
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
else
|
||||||
|
for LANG in $LANGS; do
|
||||||
case "$LANG" in
|
case "$LANG" in
|
||||||
[a-z][a-z]|[a-z][a-z][_-][A-Za-z][A-Za-z]*) : ;;
|
[a-z][a-z]|[a-z][a-z][_-][A-Za-z][A-Za-z]*) : ;;
|
||||||
*)
|
*)
|
||||||
echo "Usage: $0 <ISO_CODE>\n" >&2
|
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
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
ADDED=0
|
ADDED=false
|
||||||
|
|
||||||
for podir in ./*/*/po; do
|
for podir in $(find . -type d -name "po"); do
|
||||||
[ -d "$podir/templates" ] || continue
|
[ -d "$podir/templates" ] || continue
|
||||||
|
for LANG in $LANGS; do
|
||||||
mkdir "$podir/$LANG"
|
# if "$podir/$LANG" doesn't exist, mkdir
|
||||||
|
[ -d "$podir/$LANG" ] || mkdir "$podir/$LANG"
|
||||||
for catalog in $(cd "$podir/templates"; echo *.pot); do
|
for catalog in $(cd "$podir/templates"; echo *.pot); do
|
||||||
if [ -f "$podir/templates/$catalog" -a ! -f "$podir/$LANG/${catalog%.pot}.po" ]; then
|
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"
|
msginit --no-translator -l "$LANG" -i "$podir/templates/$catalog" -o "$podir/$LANG/${catalog%.pot}.po"
|
||||||
git add "$podir/$LANG/${catalog%.pot}.po"
|
git add "$podir/$LANG/${catalog%.pot}.po"
|
||||||
ADDED=$((ADDED + 1))
|
ADDED=true
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
done
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
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"
|
||||||
|
|
||||||
if [ $ADDED -gt 0 ]; then
|
fi
|
||||||
echo ""
|
done
|
||||||
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 ""
|
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -3,6 +3,10 @@
|
||||||
PATTERN=$1
|
PATTERN=$1
|
||||||
SCM=
|
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"
|
[ -d .svn ] && SCM="svn"
|
||||||
git=$( command -v git 2>/dev/null )
|
git=$( command -v git 2>/dev/null )
|
||||||
[ "$git" ] && "$git" status >/dev/null && SCM="git"
|
[ "$git" ] && "$git" status >/dev/null && SCM="git"
|
||||||
|
|
|
@ -294,7 +294,7 @@ waitpid $msguniq_pid, 0;
|
||||||
while (@pot > 0) {
|
while (@pot > 0) {
|
||||||
my $line = shift @pot;
|
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.
|
# reduce SCM noise when frequently updating templates.
|
||||||
if ($line =~ m!^#: !) {
|
if ($line =~ m!^#: !) {
|
||||||
my @locs = ($line);
|
my @locs = ($line);
|
||||||
|
|
|
@ -52,7 +52,7 @@ my @dirs;
|
||||||
|
|
||||||
if( ! $source )
|
if( ! $source )
|
||||||
{
|
{
|
||||||
@dirs = glob("./*/*/po/");
|
@dirs = glob("./*/*/po");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -8,9 +8,9 @@
|
||||||
echo -n "Updating modules/luci-base/po/templates/base.pot ... "
|
echo -n "Updating modules/luci-base/po/templates/base.pot ... "
|
||||||
|
|
||||||
./build/i18n-scan.pl \
|
./build/i18n-scan.pl \
|
||||||
modules/luci-base/ modules/luci-compat/ modules/luci-lua-runtime/ \
|
modules/luci-base modules/luci-compat modules/luci-lua-runtime \
|
||||||
modules/luci-mod-network modules/luci-mod-status modules/luci-mod-system/ \
|
modules/luci-mod-network modules/luci-mod-status modules/luci-mod-system \
|
||||||
protocols/ themes/ \
|
protocols themes \
|
||||||
> modules/luci-base/po/templates/base.pot
|
> modules/luci-base/po/templates/base.pot
|
||||||
|
|
||||||
echo "done"
|
echo "done"
|
||||||
|
|
14
docs/i18n.md
14
docs/i18n.md
|
@ -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.
|
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`.
|
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
|
### Rebuild po files
|
||||||
If you want to rebuild the translations after you made changes to a package this is an easy way:
|
If you want to rebuild the translations after you made changes to a package this is an easy way:
|
||||||
|
|
||||||
|
|
11
luci.mk
11
luci.mk
|
@ -18,7 +18,7 @@ LUCI_MINIFY_LUA?=1
|
||||||
LUCI_MINIFY_CSS?=1
|
LUCI_MINIFY_CSS?=1
|
||||||
LUCI_MINIFY_JS?=1
|
LUCI_MINIFY_JS?=1
|
||||||
|
|
||||||
# Language code titles
|
#LUCI_LANG_START
|
||||||
LUCI_LANG.ar=العربية (Arabic)
|
LUCI_LANG.ar=العربية (Arabic)
|
||||||
LUCI_LANG.bg=български (Bulgarian)
|
LUCI_LANG.bg=български (Bulgarian)
|
||||||
LUCI_LANG.bn_BD=বাংলা (Bengali)
|
LUCI_LANG.bn_BD=বাংলা (Bengali)
|
||||||
|
@ -42,8 +42,8 @@ LUCI_LANG.ms=Bahasa Melayu (Malay)
|
||||||
LUCI_LANG.nb_NO=Norsk (Norwegian)
|
LUCI_LANG.nb_NO=Norsk (Norwegian)
|
||||||
LUCI_LANG.nl=Nederlands (Dutch)
|
LUCI_LANG.nl=Nederlands (Dutch)
|
||||||
LUCI_LANG.pl=Polski (Polish)
|
LUCI_LANG.pl=Polski (Polish)
|
||||||
LUCI_LANG.pt_BR=Português do Brasil (Brazilian Portuguese)
|
|
||||||
LUCI_LANG.pt=Português (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.ro=Română (Romanian)
|
||||||
LUCI_LANG.ru=Русский (Russian)
|
LUCI_LANG.ru=Русский (Russian)
|
||||||
LUCI_LANG.sk=Slovenčina (Slovak)
|
LUCI_LANG.sk=Slovenčina (Slovak)
|
||||||
|
@ -53,6 +53,7 @@ LUCI_LANG.uk=Українська (Ukrainian)
|
||||||
LUCI_LANG.vi=Tiếng Việt (Vietnamese)
|
LUCI_LANG.vi=Tiếng Việt (Vietnamese)
|
||||||
LUCI_LANG.zh_Hans=简体中文 (Chinese Simplified)
|
LUCI_LANG.zh_Hans=简体中文 (Chinese Simplified)
|
||||||
LUCI_LANG.zh_Hant=繁體中文 (Chinese Traditional)
|
LUCI_LANG.zh_Hant=繁體中文 (Chinese Traditional)
|
||||||
|
#LUCI_LANG_END
|
||||||
|
|
||||||
# Submenu titles
|
# Submenu titles
|
||||||
LUCI_MENU.col=1. Collections
|
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
|
# LUCI_SUBMENU: the submenu-item below the LuCI top-level menu inside OpenWrt menuconfig
|
||||||
# usually one of the LUCI_MENU.* definitions
|
# usually one of the LUCI_MENU.* definitions
|
||||||
# LUCI_SUBMENU_DEFAULT: the regular SUBMENU defined by LUCI_TYPE or derrived from the packagename
|
# 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 definiton
|
# LUCI_SUBMENU_FORCED: manually forced value SUBMENU to set to by explicit definition
|
||||||
# can be any string, "none" disables the creation of a submenu
|
# 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
|
# anywhere in the menu structure
|
||||||
LUCI_SUBMENU_DEFAULT=$(if $(LUCI_MENU.$(LUCI_TYPE)),$(LUCI_MENU.$(LUCI_TYPE)),$(LUCI_MENU.app))
|
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))
|
LUCI_SUBMENU=$(if $(LUCI_SUBMENU_FORCED),$(LUCI_SUBMENU_FORCED),$(LUCI_SUBMENU_DEFAULT))
|
||||||
|
|
Loading…
Reference in a new issue