diff --git a/bin/compile b/bin/compile index 7ef19351..7e6a4953 100755 --- a/bin/compile +++ b/bin/compile @@ -2,6 +2,63 @@ declare -A CATALOGS=() +git_version=$(git describe --always) + +HEADER_FIXER=$(cat << PYTHON +import sys, re +input = sys.stdin.read() +from datetime import datetime + +m1 = re.match(r'# #-#-#-#-# icinga\.po #-#-#-#-#.*\nmsgid ""', input, re.DOTALL) +if m1: # Consists the header of multiple parts? + author_lines = set(re.findall(r'^# [^\n,]+,(?:(?: \d{4},)|(?: \d{4}.))+$', m1[0], re.MULTILINE)) + + # Collect all unique authors + author_map = {} + for author_line in author_lines: + m2 = re.match(r'# ([^<]+) <([^>]+)>,((?:(?: \d{4},)|(?: \d{4}.)))+', author_line) + if m2[2] not in author_map: + author_map[m2[2]] = { + 'name': m2[1], + 'years': [] + } + + for i in range(3, m2.lastindex + 1): + author_map[m2[2]]['years'].append(m2[i][1:5]) + + # Methods to extract sorting keys + def get_year(kv): + return max(kv[1]['years']) + def get_name(kv): + return kv[1]['name'] + + # Sort and render the authors list + authors = [] + for author, data in sorted(sorted(author_map.items(), key=get_name), key=get_year): + authors.append('# ' + data['name'] + ' <' + author + '>, ' + ', '.join(set(sorted(data['years']))) + '.') + + # The header values, of the first extracted header (Similar to --use-first of msgcat) + header_values = re.search(r'msgid ""\nmsgstr "".*?(("[^#][^"]+"\n)+)', input, re.DOTALL)[1] + + # Edit/fill some header values + header_values = re.sub(r'(Project-Id-Version:)[^"]*', r'\1 ${git_version}\\\n', header_values) + header_values = re.sub(r'(PO-Revision-Date:)[^"]*', + r'\1 {:%Y-%m-%d %H:%M:%z}\\\n'.format(datetime.now().astimezone()), header_values) + + result = re.search(r'(# #-#-#-#-# icinga.po #-#-#-#-#)\n(?!\1)(.*?)# Contributors:', m1[0], re.DOTALL)[2] \ + + "# Contributors:\n" \ + + "\n".join(authors) \ + + "\nmsgid \"\"\n" \ + + "msgstr \"\"\n" \ + + header_values \ + + input[input.index("\n#: "):] +else: + result = input + +sys.stdout.write(result) +PYTHON +) + COMPONENTS=$(find . -mindepth 1 -maxdepth 1 -type d -not -name "sources.d" -printf "%P ") for component_name in $COMPONENTS; do echo "Checking $component_name for catalogs" @@ -15,6 +72,15 @@ done for locale_name in "${!CATALOGS[@]}"; do echo "Compiling catalogs for $locale_name" mkdir -p ../locale/$locale_name/LC_MESSAGES - echo "${CATALOGS[$locale_name]}" | xargs msgcat -o ../locale/$locale_name/LC_MESSAGES/icinga.po --lang $locale_name + + rm ../locale/$locale_name/LC_MESSAGES/icinga.po + touch ../locale/$locale_name/LC_MESSAGES/icinga.po + for catalog in ${CATALOGS[$locale_name]}; do + msgattrib --translated --no-fuzzy --no-obsolete $catalog \ + | msgcat -o ../locale/$locale_name/LC_MESSAGES/icinga.po --lang $locale_name \ + ../locale/$locale_name/LC_MESSAGES/icinga.po - + done + + cat ../locale/$locale_name/LC_MESSAGES/icinga.po | python3 -c "$HEADER_FIXER" > temp; mv temp ../locale/$locale_name/LC_MESSAGES/icinga.po msgfmt -o ../locale/$locale_name/LC_MESSAGES/icinga.mo -c ../locale/$locale_name/LC_MESSAGES/icinga.po done