You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
4.4 KiB
132 lines
4.4 KiB
#!/usr/bin/env python3
|
|
|
|
# this script takes one po file from the repo and compares it to the new file
|
|
# generated by lektor to see if there are new strings to add.
|
|
# written by emmapeel, sponsored by the Tor Project.
|
|
# this script is published under the GPL v3 license.
|
|
# requires debian packages: python3-polib, gettext
|
|
'''
|
|
This script checks a directory with .po files for errors with links.
|
|
Translation errors with links are the most common errors on the
|
|
Tor Project websites.
|
|
|
|
Usage:
|
|
|
|
./check_po_status.py [BRANCHNAME] [CONFIGS_INIT_FILE]
|
|
|
|
Where branchname is the name of the translation branch and transifex component,
|
|
and [CONFIGS_INIT_FILE] the name of a language file different from
|
|
the one at `configs/i18n.ini`
|
|
|
|
'''
|
|
import sys
|
|
import os
|
|
import requests
|
|
import logging
|
|
|
|
try:
|
|
import polib
|
|
except ImportError:
|
|
logging.warning("You need to install python3-polib to use this program.")
|
|
sys.exit()
|
|
|
|
try:
|
|
BRANCHNAME = sys.argv[1]
|
|
except IndexError:
|
|
logging.warning("Please run me with a lektor-based translation branch, i.e. `../check_po_status.py 'communitytpo-contentspot'`")
|
|
logging.warning("the available branches are: communitytpo-contentspot, support-portal, tbmanual-contentspot, tpo-web, or gettor-website-contentspot")
|
|
sys.exit()
|
|
|
|
|
|
try:
|
|
CONFIG_FILE = sys.argv[2]
|
|
except IndexError:
|
|
CONFIG_FILE = 'configs/i18n.ini'
|
|
|
|
def get_langs():
|
|
'''gets a list of all locales configured on this website'''
|
|
mylangs = []
|
|
with open (CONFIG_FILE, 'rt') as config_file:
|
|
for config_option in config_file.readlines():
|
|
if config_option.startswith('translations'):
|
|
mylangs = [name.strip() for name in config_option.split('=')[1].split(',')]
|
|
print('configured languages: ' + str(mylangs))
|
|
return mylangs
|
|
|
|
def check_po_completion():
|
|
"looks on the enabled languages and counts translated strings"
|
|
"for each of them"
|
|
mylangs = get_langs()
|
|
for onelang in mylangs:
|
|
try:
|
|
pofile = polib.pofile('i18n/contents+' + onelang + '.po')
|
|
print(' locale ' + onelang + ' : ' + str(pofile.percent_translated()) + ' %')
|
|
except OSError:
|
|
print(f"even less translations for {onelang}")
|
|
|
|
|
|
def get_remote_po():
|
|
'''
|
|
we download a .po file from our translation repo so we can compare it to
|
|
the new file we have generated after building the website
|
|
'''
|
|
po_link = f'https://lab.encryptionin.space/Queerscriptors/weblate-website/raw/branch/{ BRANCHNAME }/contents+fr.po'
|
|
r = requests.get(po_link, allow_redirects=True)
|
|
try:
|
|
open('oldcontents+fr.po', 'wb').write(r.content)
|
|
pofile = polib.pofile('oldcontents+fr.po')
|
|
except OSError:
|
|
print("Please run me with a lektor-based translation branch, i.e. `../check_po_status.py 'communitytpo-contentspot'`")
|
|
print("the available branches are: communitytpo-contentspot, support-portal, tbmanual-contentspot, tpo-web, or gettor-website-contentspot")
|
|
sys.exit()
|
|
return pofile
|
|
|
|
def get_local_po():
|
|
''' this is the local file that may have been modified by the build'''
|
|
try:
|
|
pofile = polib.pofile('i18n/contents+fr.po')
|
|
except OSError:
|
|
sys.exit("Please run me after building lektor at least once")
|
|
return pofile
|
|
|
|
|
|
def compare_pos(oldpo, newpo):
|
|
''' we compare both .po files to see if there are changes'''
|
|
newstrings, stalestrings = [], []
|
|
for entry in newpo:
|
|
if entry not in oldpo:
|
|
print(F'new string: {entry.msgid}')
|
|
newstrings.append(entry.msgid)
|
|
|
|
for entry in oldpo:
|
|
if entry not in newpo:
|
|
print(F'stale string: {entry.msgid}')
|
|
stalestrings.append(entry.msgid)
|
|
|
|
return newstrings, stalestrings
|
|
|
|
# first we check how complete the enabled languages are
|
|
|
|
check_po_completion()
|
|
|
|
# now we look if there are any strings
|
|
# that are not available in transifex
|
|
# or any strings in transifex that are
|
|
# not needed anymore here
|
|
newstrings, stalestrings = compare_pos(get_remote_po(), get_local_po())
|
|
|
|
if newstrings != []:
|
|
logging.warning(F'There are {len(newstrings)} new strings that are not in Transifex')
|
|
|
|
if stalestrings != []:
|
|
logging.warning(F'There are {len(stalestrings)} strings in Transifex that are not needed anymore')
|
|
|
|
|
|
os.remove('oldcontents+fr.po')
|
|
|
|
if newstrings != [] or stalestrings != []:
|
|
sys.exit(1)
|
|
|
|
if newstrings == [] and stalestrings == []:
|
|
print('strings are synced!')
|