#!/bin/bash set -xe SOURCE_REPOSITORIES=( ipl-web ipl-validator icingaweb2 icingaweb2-module-director icingaweb2-module-vspheredb icingadb-web icingaweb2-module-reporting icingaweb2-module-graphite icingaweb2-module-cube #icingaweb2-module-idoreports icingaweb2-module-aws icingaweb2-module-businessprocess #icingaweb2-module-doc #icingaweb2-module-fileshipper #icingaweb2-module-jira #icingaweb2-module-nagvis icingaweb2-module-pdfexport #icingaweb2-module-pnp #icingaweb2-module-puppetdb #icingaweb2-module-test #icingaweb2-module-vsphere icingaweb2-module-x509 #icingaweb2-module-toplevelview icingaweb2-module-audit icingaweb2-module-elasticsearch #icingaweb2-module-eventdb #icingaweb2-module-generictts #icingaweb2-module-lynxtechnik ) # Fetch repositories which do not exist yet in the directory FETCHED_REPOS=(); for repo_name in "${SOURCE_REPOSITORIES[@]}"; do if [ ! -d "sources.d/$repo_name" ]; then FETCHED_REPOS+=( $repo_name ); wget -q -O - https://github.com/Icinga/$repo_name/archive/master.tar.gz | tar xz mv $repo_name-master/ sources.d/$repo_name fi done # Create a list of files xgettext should scan find -L sources.d -regex ".*\.\(php\|phtml\)" ! -path "*/vendor/*" ! -path "*/test/*" > catalog.txt xgettext --language=PHP \ --keyword=translate \ --keyword=translate:1,2c \ --keyword=translatePlural:1,2 \ --keyword=translatePlural:1,2,4c \ --keyword=mt:2 \ --keyword=mt:2,3c \ --keyword=mtp:2,3 \ --keyword=mtp:2,3,5c \ --keyword=t \ --keyword=t:1,2c \ --keyword=tp:1,2 \ --keyword=tp:1,2,4c \ --keyword=N_ \ --from-code=utf-8 \ --files-from=catalog.txt \ --sort-by-file \ --copyright-holder="Icinga GmbH" \ --package-name="Icinga L10n" \ --package-version=$(git describe --always) \ --msgid-bugs-address=https://github.com/Icinga/L10n/issues \ --default-domain=icinga \ --output=icinga.pot # Re-add the PoEdit header extensions REPLACE_CODE=$(cat << PYTHON import sys, re result = re.sub( r'msgid \"\"\nmsgstr \"\"(\n\".*\")+', '\g<0>\n' + '\"X-Poedit-Basepath: ../../../src\\\\\\\\n\"\n' + '\"X-Poedit-SearchPath-0: sources.d\\\\\\\\n\"', sys.stdin.read() ) from datetime import date result = result.replace( '# Copyright (C) YEAR Icinga GmbH', '# Copyright (C) {0} Icinga GmbH'.format(date.today().year), 1 ) sys.stdout.write(result) PYTHON ) cat icinga.pot | python -c "$REPLACE_CODE" > temp; mv temp icinga.pot # Cleanup created files and directories rm catalog.txt for repo_name in "${FETCHED_REPOS[@]}"; do rm -rf sources.d/$repo_name done # Check for changes (new messages) that need to be committed CHANGES=1 git diff -U0 \ | grep -Pe '^[+-]{1}(?!#:)[^+-]+' \ | grep -qv -e '."Project-Id-Version:' -e '."POT-Creation-Date:' \ || CHANGES=0 if [ $CHANGES -eq 0 ]; then echo "No new messages found."; git checkout icinga.pot; else STATS="" # Update intermediate (in-progress) catalogs LOCALES=$(find . -mindepth 1 -maxdepth 1 -type d -regextype grep -regex '\./[a-z]\{2\}_[A-Z]\{2\}' -printf "%P ") for locale_name in $LOCALES; do msgmerge --update --backup=none --lang=$locale_name --sort-by-file $locale_name/LC_MESSAGES/icinga.po icinga.pot STATS_OUT=$(LC_ALL=C msgfmt --statistics $locale_name/LC_MESSAGES/icinga.po 2>&1 >/dev/null) if [ -f "messages.mo" ]; then rm "messages.mo" fi # TODO: Make this a function? (is also used in bin/validate) TRANSLATED=0 UNTRANSLATED=0 FUZZY=0 RE="[0-9]+" LAST_LINE=$(echo "$STATS_OUT" | tail -1) for chars in $LAST_LINE; do if [[ "$chars" =~ $RE ]] && [[ ${BASH_REMATCH[0]} ]]; then LAST_CNT="${BASH_REMATCH[0]}" else case $chars in "translated") TRANSLATED=$LAST_CNT ;; "fuzzy") FUZZY=$LAST_CNT ;; "untranslated") UNTRANSLATED=$LAST_CNT ;; esac fi done PROGRESS=$(python -c "print (int(round(($TRANSLATED.0 / ($TRANSLATED + $UNTRANSLATED + $FUZZY)) * 100)))") STATS+=" $locale_name:$PROGRESS%" done # Update locale statistics python -c "import json; \ print ( \ json.dumps({k: v for k, v in (kv for kv in (s.split(':') for s in '$STATS'.strip().split()))}) \ ) \ " > ../.github/stats.json echo "New messages found!"; # Working tree is left dirty as the following step creates a new pull request fi