mirror of
				https://github.com/mealie-recipes/mealie.git
				synced 2025-10-31 02:03:35 -04:00 
			
		
		
		
	* remove dead backup code * implmenet own base model * refactor to use MealieModel instead of CamelModel * cleanup deps
		
			
				
	
	
		
			145 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import pathlib
 | ||
| 
 | ||
| import _static
 | ||
| import dotenv
 | ||
| import requests
 | ||
| from jinja2 import Template
 | ||
| from requests import Response
 | ||
| from rich import print
 | ||
| 
 | ||
| from mealie.schema._mealie import MealieModel
 | ||
| 
 | ||
| BASE = pathlib.Path(__file__).parent.parent.parent
 | ||
| 
 | ||
| API_KEY = dotenv.get_key(BASE / ".env", "CROWDIN_API_KEY")
 | ||
| 
 | ||
| NAMES = {
 | ||
|     "en-US": "American English",
 | ||
|     "en-GB": "British English",
 | ||
|     "af-ZA": "Afrikaans (Afrikaans)",
 | ||
|     "ar-SA": "العربية (Arabic)",
 | ||
|     "ca-ES": "Català (Catalan)",
 | ||
|     "cs-CZ": "Čeština (Czech)",
 | ||
|     "da-DK": "Dansk (Danish)",
 | ||
|     "de-DE": "Deutsch (German)",
 | ||
|     "el-GR": "Ελληνικά (Greek)",
 | ||
|     "es-ES": "Español (Spanish)",
 | ||
|     "fi-FI": "Suomi (Finnish)",
 | ||
|     "fr-FR": "Français (French)",
 | ||
|     "he-IL": "עברית (Hebrew)",
 | ||
|     "hu-HU": "Magyar (Hungarian)",
 | ||
|     "it-IT": "Italiano (Italian)",
 | ||
|     "ja-JP": "日本語 (Japanese)",
 | ||
|     "ko-KR": "한국어 (Korean)",
 | ||
|     "no-NO": "Norsk (Norwegian)",
 | ||
|     "nl-NL": "Nederlands (Dutch)",
 | ||
|     "pl-PL": "Polski (Polish)",
 | ||
|     "pt-BR": "Português do Brasil (Brazilian Portuguese)",
 | ||
|     "pt-PT": "Português (Portugese)",
 | ||
|     "ro-RO": "Română (Romanian)",
 | ||
|     "ru-RU": "Pусский (Russian)",
 | ||
|     "sr-SP": "српски (Serbian)",
 | ||
|     "sv-SE": "Svenska (Swedish)",
 | ||
|     "tr-TR": "Türkçe (Turkish)",
 | ||
|     "uk-UA": "Українська (Ukrainian)",
 | ||
|     "vi-VN": "Tiếng Việt (Vietnamese)",
 | ||
|     "zh-CN": "简体中文 (Chinese simplified)",
 | ||
|     "zh-TW": "繁體中文 (Chinese traditional)",
 | ||
| }
 | ||
| 
 | ||
| LOCALE_TEMPLATE = """// This Code is auto generated by gen_global_components.py
 | ||
| export const LOCALES = [{% for locale in locales %}
 | ||
|   {
 | ||
|     name: "{{ locale.name }}",
 | ||
|     value: "{{ locale.locale }}",
 | ||
|     progress: {{ locale.progress }},
 | ||
|   },{% endfor %}
 | ||
| ]
 | ||
| """
 | ||
| 
 | ||
| 
 | ||
| class TargetLanguage(MealieModel):
 | ||
|     id: str
 | ||
|     name: str
 | ||
|     locale: str
 | ||
|     threeLettersCode: str
 | ||
|     twoLettersCode: str
 | ||
|     progress: float = 0.0
 | ||
| 
 | ||
| 
 | ||
| class CrowdinApi:
 | ||
|     project_name = "Mealie"
 | ||
|     project_id = "451976"
 | ||
|     api_key = API_KEY
 | ||
| 
 | ||
|     def __init__(self, api_key: str):
 | ||
|         api_key = api_key
 | ||
| 
 | ||
|     @property
 | ||
|     def headers(self) -> dict:
 | ||
|         return {
 | ||
|             "Content-Type": "application/json",
 | ||
|             "Authorization": f"Bearer {self.api_key}",
 | ||
|         }
 | ||
| 
 | ||
|     def get_projects(self) -> Response:
 | ||
|         return requests.get("https://api.crowdin.com/api/v2/projects", headers=self.headers)
 | ||
| 
 | ||
|     def get_project(self) -> Response:
 | ||
|         return requests.get(f"https://api.crowdin.com/api/v2/projects/{self.project_id}", headers=self.headers)
 | ||
| 
 | ||
|     def get_languages(self) -> list[TargetLanguage]:
 | ||
|         response = self.get_project()
 | ||
|         tls = response.json()["data"]["targetLanguages"]
 | ||
| 
 | ||
|         models = [TargetLanguage(**t) for t in tls]
 | ||
| 
 | ||
|         models.insert(
 | ||
|             0,
 | ||
|             TargetLanguage(
 | ||
|                 id="en-US", name="English", locale="en-US", threeLettersCode="en", twoLettersCode="en", progress=100
 | ||
|             ),
 | ||
|         )
 | ||
| 
 | ||
|         progress: list[dict] = self.get_progress()["data"]
 | ||
| 
 | ||
|         for model in models:
 | ||
|             if model.locale in NAMES:
 | ||
|                 model.name = NAMES[model.locale]
 | ||
| 
 | ||
|             for p in progress:
 | ||
|                 if p["data"]["languageId"] == model.id:
 | ||
|                     model.progress = p["data"]["translationProgress"]
 | ||
| 
 | ||
|         models.sort(key=lambda x: x.locale, reverse=True)
 | ||
|         return models
 | ||
| 
 | ||
|     def get_progress(self) -> dict:
 | ||
|         response = requests.get(
 | ||
|             f"https://api.crowdin.com/api/v2/projects/{self.project_id}/languages/progress?limit=500",
 | ||
|             headers=self.headers,
 | ||
|         )
 | ||
|         return response.json()
 | ||
| 
 | ||
| 
 | ||
| def main():
 | ||
|     print("Starting...")  # noqa
 | ||
| 
 | ||
|     if API_KEY is None:
 | ||
|         print("CROWDIN_API_KEY is not set")  # noqa
 | ||
|         return
 | ||
| 
 | ||
|     api = CrowdinApi("")
 | ||
|     models = api.get_languages()
 | ||
|     tmpl = Template(LOCALE_TEMPLATE)
 | ||
|     rendered = tmpl.render(locales=models)
 | ||
| 
 | ||
|     with open(_static.CodeDest.use_locales, "w") as f:
 | ||
|         f.write(rendered)  # type:ignore
 | ||
| 
 | ||
|     print("Finished...")  # noqa
 | ||
| 
 | ||
| 
 | ||
| if __name__ == "__main__":
 | ||
|     main()
 |