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.
		
		
		
		
			
				
					63 lines
				
				2.4 KiB
			
		
		
			
		
	
	
					63 lines
				
				2.4 KiB
			| 
								 
											8 months ago
										 
									 | 
							
								#!/usr/bin/env python3
							 | 
						||
| 
								 | 
							
								import json
							 | 
						||
| 
								 | 
							
								import os
							 | 
						||
| 
								 | 
							
								import requests
							 | 
						||
| 
								 | 
							
								import xml.etree.ElementTree as ET
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from openpilot.common.basedir import BASEDIR
							 | 
						||
| 
								 | 
							
								from openpilot.selfdrive.ui.tests.test_translations import UNFINISHED_TRANSLATION_TAG
							 | 
						||
| 
								 | 
							
								from openpilot.selfdrive.ui.update_translations import LANGUAGES_FILE, TRANSLATIONS_DIR
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TRANSLATION_TAG = "<translation"
							 | 
						||
| 
								 | 
							
								BADGE_HEIGHT = 20 + 8
							 | 
						||
| 
								 | 
							
								SHIELDS_URL = "https://img.shields.io/badge"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if __name__ == "__main__":
							 | 
						||
| 
								 | 
							
								  with open(LANGUAGES_FILE) as f:
							 | 
						||
| 
								 | 
							
								    translation_files = json.load(f)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  badge_svg = []
							 | 
						||
| 
								 | 
							
								  max_badge_width = 0  # keep track of max width to set parent element
							 | 
						||
| 
								 | 
							
								  for idx, (name, file) in enumerate(translation_files.items()):
							 | 
						||
| 
								 | 
							
								    with open(os.path.join(TRANSLATIONS_DIR, f"{file}.ts")) as tr_f:
							 | 
						||
| 
								 | 
							
								      tr_file = tr_f.read()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    total_translations = 0
							 | 
						||
| 
								 | 
							
								    unfinished_translations = 0
							 | 
						||
| 
								 | 
							
								    for line in tr_file.splitlines():
							 | 
						||
| 
								 | 
							
								      if TRANSLATION_TAG in line:
							 | 
						||
| 
								 | 
							
								        total_translations += 1
							 | 
						||
| 
								 | 
							
								      if UNFINISHED_TRANSLATION_TAG in line:
							 | 
						||
| 
								 | 
							
								        unfinished_translations += 1
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    percent_finished = int(100 - (unfinished_translations / total_translations * 100.))
							 | 
						||
| 
								 | 
							
								    color = f"rgb{(94, 188, 0) if percent_finished == 100 else (248, 255, 50) if percent_finished > 90 else (204, 55, 27)}"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Download badge
							 | 
						||
| 
								 | 
							
								    badge_label = f"LANGUAGE {name}"
							 | 
						||
| 
								 | 
							
								    badge_message = f"{percent_finished}% complete"
							 | 
						||
| 
								 | 
							
								    if unfinished_translations != 0:
							 | 
						||
| 
								 | 
							
								      badge_message += f" ({unfinished_translations} unfinished)"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    r = requests.get(f"{SHIELDS_URL}/{badge_label}-{badge_message}-{color}", timeout=10)
							 | 
						||
| 
								 | 
							
								    assert r.status_code == 200, "Error downloading badge"
							 | 
						||
| 
								 | 
							
								    content_svg = r.content.decode("utf-8")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    xml = ET.fromstring(content_svg)
							 | 
						||
| 
								 | 
							
								    assert "width" in xml.attrib
							 | 
						||
| 
								 | 
							
								    max_badge_width = max(max_badge_width, int(xml.attrib["width"]))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Make tag ids in each badge unique to combine them into one svg
							 | 
						||
| 
								 | 
							
								    for tag in ("r", "s"):
							 | 
						||
| 
								 | 
							
								      content_svg = content_svg.replace(f'id="{tag}"', f'id="{tag}{idx}"')
							 | 
						||
| 
								 | 
							
								      content_svg = content_svg.replace(f'"url(#{tag})"', f'"url(#{tag}{idx})"')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    badge_svg.extend([f'<g transform="translate(0, {idx * BADGE_HEIGHT})">', content_svg, "</g>"])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  badge_svg.insert(0, '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" ' +
							 | 
						||
| 
								 | 
							
								                   f'height="{len(translation_files) * BADGE_HEIGHT}" width="{max_badge_width}">')
							 | 
						||
| 
								 | 
							
								  badge_svg.append("</svg>")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  with open(os.path.join(BASEDIR, "translation_badge.svg"), "w") as badge_f:
							 | 
						||
| 
								 | 
							
								    badge_f.write("\n".join(badge_svg))
							 |