2828import collections
2929import datetime
3030import importlib
31+ import io
3132import itertools
3233import json
3334import operator
3637import re
3738import shutil
3839import sys
40+ import tarfile
3941import time
4042import typing
4143
@@ -74,17 +76,16 @@ def current_year(context: dict) -> dict:
7476 return context
7577
7678 @staticmethod
77- def navbar_add_info (context : dict , skip : bool = True ) -> dict :
79+ def navbar_add_info (context : dict ) -> dict :
7880 """
7981 Items in the main navigation bar can be direct links, or dropdowns with
8082 subitems. This context preprocessor adds a boolean field
8183 ``has_subitems`` that tells which one of them every element is. It
8284 also adds a ``slug`` field to be used as a CSS id.
8385 """
84- ignore = context ["translations" ]["ignore" ]
85- for language in context ["languages" ]:
86+ for language in context ["translations" ]["languages" ]:
8687 for i , item in enumerate (context ["navbar" ][language ]):
87- if item [ "target" ] in ignore :
88+ if not item . get ( "translated" , True ) :
8889 item ["target" ] = f"../{ item ['target' ]} "
8990
9091 context ["navbar" ][language ][i ] = dict (
@@ -391,9 +392,7 @@ def get_callable(obj_as_str: str) -> object:
391392 return obj
392393
393394
394- def get_context (
395- config_fname : str , navbar_fname : str , languages : list [str ], ** kwargs : dict
396- ) -> dict :
395+ def get_context (config_fname : str , navbar_fname : str , ** kwargs : dict ) -> dict :
397396 """
398397 Load the config yaml as the base context, and enrich it with the
399398 information added by the context preprocessors defined in the file.
@@ -403,19 +402,19 @@ def get_context(
403402
404403 context ["source_path" ] = os .path .dirname (config_fname )
405404
406- navbar = {}
407- context ["languages" ] = languages
408405 default_language = context ["translations" ]["default_language" ]
409406 default_prefix = context ["translations" ]["default_prefix" ]
410- for language in languages :
407+ translated_languages = context ["translations" ]["languages" ].copy ()
408+ translated_languages .pop (default_language )
409+ context ["translated_languages" ] = translated_languages
410+ download_and_extract_translations (context )
411+ navbar = {}
412+ for language in context ["translations" ]["languages" ]:
411413 prefix = default_prefix if language == default_language else language
412414 navbar_path = os .path .join (context ["source_path" ], prefix , navbar_fname )
413-
414415 with open (navbar_path , encoding = "utf-8" ) as f :
415416 navbar_lang = yaml .safe_load (f )
416-
417417 navbar [language ] = navbar_lang ["navbar" ]
418-
419418 context ["navbar" ] = navbar
420419
421420 context .update (kwargs )
@@ -453,6 +452,28 @@ def extend_base_template(content: str, base_template: str) -> str:
453452 return result
454453
455454
455+ def download_and_extract_translations (context : dict ) -> None :
456+ """
457+ Download the translations from the GitHub repository and extract them.
458+ """
459+ base_folder = os .path .dirname (__file__ )
460+ extract_path = os .path .join (base_folder , context ["translations" ]["folder" ])
461+ shutil .rmtree (extract_path , ignore_errors = True )
462+ response = requests .get (context ["translations" ]["url" ])
463+ if response .status_code == 200 :
464+ doc = io .BytesIO (response .content )
465+ with tarfile .open (None , "r:gz" , doc ) as tar :
466+ tar .extractall (os .path .join (base_folder , context ["translations" ]["folder" ]))
467+ else :
468+ raise Exception (f"Failed to download translations: { response .status_code } " )
469+ for lang in context ["translated_languages" ]:
470+ shutil .rmtree (os .path .join (context ["source_path" ], lang ), ignore_errors = True )
471+ shutil .move (
472+ os .path .join (extract_path , context ["translations" ]["source_path" ], lang ),
473+ os .path .join (base_folder , "pandas" , lang ),
474+ )
475+
476+
456477def main (
457478 source_path : str ,
458479 target_path : str ,
@@ -463,24 +484,14 @@ def main(
463484 For ``.md`` and ``.html`` files, render them with the context
464485 before copying them. ``.md`` files are transformed to HTML.
465486 """
466- base_folder = os .path .dirname (__file__ )
467-
468487 shutil .rmtree (target_path , ignore_errors = True )
469488 os .makedirs (target_path , exist_ok = True )
470489
471- # Handle translations
472- sys .path .append (base_folder )
473- trans = importlib .import_module ("pandas_translations" )
474- translated_languages , languages = trans .process_translations (
475- "config.yml" , source_path
476- )
477-
478490 sys .stderr .write ("Generating context...\n " )
479491 context = get_context (
480492 os .path .join (source_path , "config.yml" ),
481493 navbar_fname = "navbar.yml" ,
482494 target_path = target_path ,
483- languages = languages ,
484495 )
485496 sys .stderr .write ("Context generated\n " )
486497
@@ -490,7 +501,9 @@ def main(
490501 default_language = context ["translations" ]["default_language" ]
491502 for fname in get_source_files (source_path ):
492503 selected_language = context ["translations" ]["default_language" ]
493- for language in translated_languages :
504+ translated_languages = list (context ["translations" ]["languages" ].keys ())
505+ translated_languages .remove (default_language )
506+ for language in context ["translated_languages" ]:
494507 if fname .startswith (language + "/" ):
495508 selected_language = language
496509 break
0 commit comments