onionshare/docs/check-weblate.py

154 lines
4.0 KiB
Python
Executable File

#!/usr/bin/env python3
import sys
import httpx
import asyncio
import time
api_token = None
languages = {}
app_translations = {}
docs_translations = {}
async def api(path):
url = f"https://hosted.weblate.org{path}"
async with httpx.AsyncClient() as client:
r = await client.get(
url, headers={"Authorization": f"Token {api_token}"}, timeout=30.0
)
if r.status_code == 200:
print(f"GET {url}")
return r.json()
else:
print(f"GET {url} | error {r.status_code}")
return None
async def get_app_translation(lang_code):
global app_translations
obj = await api(f"/api/translations/onionshare/translations/{lang_code}/")
if obj:
app_translations[lang_code] = obj["translated_percent"]
async def get_docs_translation(component, lang_code):
global docs_translations
obj = await api(f"/api/translations/onionshare/{component}/{lang_code}/")
if obj:
if component not in docs_translations:
docs_translations[component] = {}
docs_translations[component][lang_code] = obj["translated_percent"]
async def app_percent_output(percent_min, percent_max=101):
out = []
for lang_code in languages:
if (
app_translations[lang_code] >= percent_min
and app_translations[lang_code] < percent_max
):
out.append(
f"{languages[lang_code]} ({lang_code}), {app_translations[lang_code]}%"
)
out.sort()
print(f"App translations >= {percent_min}%")
print("=======================")
print("\n".join(out))
print("")
async def docs_percent_output(percent_min, exclude=[]):
out = []
for lang_code in languages:
include_language = True
percentages = []
for component in docs_translations:
if lang_code not in docs_translations[component]:
include_language = False
break
percentages.append(docs_translations[component][lang_code])
if docs_translations[component][lang_code] < percent_min:
include_language = False
break
if include_language:
percentages = [f"{p}%" for p in percentages]
percentages = ", ".join(percentages)
out.append(f"{languages[lang_code]} ({lang_code}), {percentages}")
excluded = []
for s in out:
if s not in exclude:
excluded.append(s)
excluded.sort()
print(f"Docs translations >= {percent_min}%")
print("========================")
print("\n".join(excluded))
print("")
return excluded
async def main():
global api_token, languages, app_translations, docs_translations
if len(sys.argv) != 2:
print(f"Usage: {sys.argv[0]} API_KEY")
print(
"You can find your personal API key at: https://hosted.weblate.org/accounts/profile/#api"
)
return
api_token = sys.argv[1]
# Get the list of languages in the OnionShare project
res = await api("/api/projects/onionshare/languages/")
for obj in res:
languages[obj["code"]] = obj["language"]
# Get the app translations for each language
await asyncio.gather(*[get_app_translation(lang_code) for lang_code in languages])
# Get the documentation translations for each component for each language
for component in [
"doc-advanced",
"doc-develop",
"doc-features",
"doc-help",
"doc-index",
"doc-install",
"doc-security",
"doc-sphinx",
"doc-tor",
]:
docs_futures = []
for lang_code in languages:
docs_futures.append(get_docs_translation(component, lang_code))
await asyncio.gather(*docs_futures)
print("")
await app_percent_output(100)
await app_percent_output(90, 100)
await app_percent_output(80, 90)
out100 = await docs_percent_output(100)
out90 = await docs_percent_output(90, out100)
await docs_percent_output(80, out100 + out90)
if __name__ == "__main__":
asyncio.run(main())