onionshare/docs/check-weblate.py
2023-09-04 20:16:44 -07:00

148 lines
3.9 KiB
Python
Executable File

#!/usr/bin/env python3
import sys
import httpx
import asyncio
api_token = None
languages = {}
app_translations = {}
docs_translations = {}
async def api(path):
url = f"https://hosted.weblate.org{path}"
# Wait a bit before each API call, to avoid hammering the server and
# getting temporarily blocked
await asyncio.sleep(1)
async with httpx.AsyncClient() as client:
r = await client.get(
url, headers={"Authorization": f"Token {api_token}"}, timeout=60
)
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 (
lang_code in app_translations
and 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, percent_max=101):
out = []
for lang_code in languages:
percentages = []
for component in docs_translations:
if lang_code in docs_translations[component]:
percentages.append(docs_translations[component][lang_code])
else:
percentages.append(0)
average_percentage = int(sum(percentages) / len(percentages))
if (
average_percentage != 0
and average_percentage >= percent_min
and average_percentage < percent_max
):
out.append(f"{languages[lang_code]} ({lang_code}), {average_percentage}%")
out.sort()
print(f"Docs translations >= {percent_min}%")
print("========================")
print("\n".join(out))
print("")
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["name"]
# Get the app translations for each language
for lang_code in languages:
await get_app_translation(lang_code)
# 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",
]:
for lang_code in languages:
await get_docs_translation(component, lang_code)
print("")
await app_percent_output(90, 101)
await app_percent_output(50, 90)
await app_percent_output(0, 50)
await docs_percent_output(90, 101)
await docs_percent_output(50, 90)
await docs_percent_output(0, 50)
if __name__ == "__main__":
asyncio.run(main())