From 8008e0291eaf3406037692928a5bfa5663fbcfb8 Mon Sep 17 00:00:00 2001 From: Tykayn Date: Thu, 4 Sep 2025 00:54:24 +0200 Subject: [PATCH] up translated pages --- translations.json | 26 +++++++++- .../__pycache__/wiki_compare.cpython-313.pyc | Bin 46198 -> 46843 bytes wiki_compare/wiki_compare.py | 23 +++++++-- wiki_compare/wiki_translate.py | 48 +++++++++++++++--- 4 files changed, 85 insertions(+), 12 deletions(-) diff --git a/translations.json b/translations.json index 04b80cc..96fd269 100644 --- a/translations.json +++ b/translations.json @@ -11,7 +11,31 @@ "translated_at": "2025-09-03T23:53:20.570915", "model": "mistral:7b", "is_specific_page": true + }, + "type": { + "key": "type", + "en_page": { + "url": "https://wiki.openstreetmap.org/wiki/Key:type", + "last_modified": "2025-05-13", + "word_count": 911 + }, + "translated_content": " v\n·\nd\n·\ne\ntype\nDescription\nType de relation.\nGroupe :\npropriétés\nUtilisé sur ces\néléments\nValeurs documentées :\n20\nVoir aussi\n*:type\n=*\nStatut :\nde facto\ntype\n=\n*\nPlus de détails à la balise\ninfo\nOutils pour cette balise\ntaginfo\n·\nAD\n·\nAT\n·\nBR\n·\nBY\n·\nCH\n·\nCN\n·\nCZ\n·\nDE\n·\nDK\n·\nFI\n·\nFR\n·\nGB\n·\nGR\n·\nHU\n·\nIN\n·\nIR\n·\nIT\n·\nLI\n·\nLU\n·\nJP\n·\nKP\n·\nKR\n·\nNL\n·\nPL\n·\nPT\n·\nRU\n·\nES\n·\nAR\n·\nMX\n·\nCO\n·\nBO\n·\nCL\n·\nEC\n·\nPY\n·\nPE\n·\nUY\n·\nVE\n·\nTW\n·\nUA\n·\nUS\n·\nVN\noverpass-turbo\nHistorique des balises OSM de type\ntype\n=*\nsur un objet relation indique son type et les interactions parmi ses membres. Les types de relations établis et proposés sont listés ci-dessous.\ntype\na été également occasionnellement utilisé comme une étiquette supplémentaire pour spécifier une \"variante\" d'une catégorie de fonctionnalité sur les voies et points. Cette approche est en conflit avec son utilisation dans des relations et doit être évitée.\n\nEn outre, pour les éléments ayant plusieurs étiquettes, il n'est pas clair à qui l'étiquette type s'applique. Au lieu de cela, utiliser une approche basée sur un suffixe ou sous-étiquette, comme décrit dans\n*:type\n=*\n.\nRelations établies\nType\nStatut\nMembres\nCommentaires\nStatistiques\nImage\nmultipolygon\nde facto\n( )\nÉtendues\ndont l'enveloppe consiste en plusieurs voies, ou qui ont des trous.\nroute\nde facto\nUne route établie (fréquemment signalée) sur plusieurs autoroutes pour un mode de transport donné (randonnée, cyclisme, autobus ou trafic motorisé).\nroute_master\napprobé\nContient uniquement des routes qui sont étroitement liées (parallèles, opposées, variantes, ...) ; utilisé pour regrouper les variantes de transport en commun.\nrestriction\nde facto\nTours autorisés sur un carrefour routier.\nboundary\nde facto\nFrontières politiques, administratives et similaires qui ne sont pas toujours visibles au sol. Définies de manière comparable aux multipolygones.\npublic_transport\napprobé\nPartie du\nschéma de transport public OSM\n. Utilisé principalement par\npublic_transport\n=\nstop_area\n.\ndestination_sign\napprobé\nSignalets de destination à ou avant les carrefours.\nwaterway\napprobé\nGroupe plusieurs segments d'un cours d'eau nommé\nwaterway\n=*\n.\nenforcement\napprobé\nAppareils de contrôle de la circulation ; caméras de vitesse, caméras rouges, pesées de poids, ...\nconnectivity\napprobé\nIndique comment les voies dans le membre \"de\" se connectent aux voies dans le membre \"à\".\nRelations peu fréquentes\nType\nStatut\nMembres\nCommentaires\nStatistiques\nImage\nassociatedStreet\ncontroversial\nNuméros de rue liés à une rue. Voir\nprojet de Karlsruhe\n. Interdit dans certains pays par la communauté.\nsuperroute\ncontroversial\nGroupe ensemble une chaîne de routes. La superroute contient (raccordables) des routes uniquement. Son utilité est contestée.\nsite\nen usage\nGroupe éléments d'un \"site\" avec\nnoeud\nmembres, plutôt que d'utiliser un\nmultipolygon\n. Voir\nRelations/Proposed/Site\nnetwork\nen usage\nRelations qui décrivent des réseaux avec leurs membres faisant partie de ce réseau.\nbuilding\nen usage\nParfois utilisé pour regrouper éléments qui forment un bâtiment dans le modèle 3D simple, mais pas généralement requis.\nmultilinestring\nen usage\nUne série disjointe de voies non fermées qui représentent sématiquement un seul objet physique.\nstreet\nproposé\nLiaison ensemble tous les éléments d'une rue et tout ce qui appartient à elle. Voir\nRelations/Proposed/Street\nbridge\nproposé\nGroupe ensemble tous les éléments d'un pont. Voir\nRelations/Proposed/Bridges and Tunnels\ntunnel\nproposé\nGroupe ensemble tous les éléments d'un tunnel. Voir\nRelations/Proposed/Bridges and Tunnels\nutilisé par défaut\nToutes les valeurs courantes\nselon\nTaginfo\nTaginfo\nUsages proposés\nPropositions abandonnées et obsolètes ne sont pas incluses.\nÉléments de carrefours, intersections, séparations de niveaux, et viaducs\nRelations/Proposed/Bridges and Tunnels\npour regrouper les voies qui utilisent un pont ou un tunnel commun\nRelations/Proposed/Junctions\ntoutes les voies qui composent une intersection (comme une intersection autoroutière)\nRelations/Proposed/Sign hints\nIndications sur le tour à gauche, tour à droite, croisement, etc.\nRelations/Proposed/turn lanes\nles tours autorisés à partir d'un lane donné\nHiérarchies de zones et autres relations pour les zones\nRelations/Proposed/Area\npour définir des zones entre voies et lignes (croisement linéaire), divisoirs virtuels et croisements-possibles, etc.\nRelations/Proposed/Label\nÉtiquettes manuellement placées ou icônes dans les zones\nRelations/Proposed/Niveau\nPour les niveaux de 3D-Objets (stations de métro, bâtiments, etc.).\nRelations/Proposed/Sled\npour regrouper ensemble tous les éléments pertinents d'une piste de ski.\nAdresses\nRelations/Proposed/Cluster\npour regrouper des fonctionnalités avec un nom collectif ou adresse, etc.\nSchéma de Karlsruhe\nRelations/Proposed/Addresses postales\nAutres\nRelations/Proposed/Valeurs par défaut\ndéfinit une série de valeurs par défaut (limites de vitesse, sens unique, accès) pour un pays ou un état\nRelations/Proposed/Associe un objet\npour associer un objet tels qu'un restaurant, hôtel ou musée avec des fonctionnalités de la carte telles que des adresses ou entrées.\nGroupe de relations\nrelation à créer pour créer des groupes d'objets (par exemple lorsqu'ils ont un nom commun en groupe) sans nécessiter de tags supplémentaires (ils sont définis par leurs membres).\nRelations/Proposed/Noeud\nune relation pour avoir plusieurs objets noeud à la même position sans ajouter des objets géométriques réels (par exemple pour les choses accrochées à un poteau, antennes sur un mât, etc.)\nIncorrects de balises\ntype\n=\n*\nPlus de détails à la balise\ninfo\ntype\n=*\n‒ Cette clé ne devrait être utilisée que sur des relations. Les autres types d'objets doivent être sous-classifiés à l'aide de l'un des schemes décrits dans\n*:type\n=*\nou d'une autre étiquette.\nSi vous connaissez\nlieux avec cette étiquette\n, vérifiez si il pourrait être tagué avec une autre étiquette.\nLes édits automatisés sont\nfortement déconseillés\nsauf si vous réellement savez ce que vous faites\n!\nQualité de l'exécution\nRévisez les relations sans balise\ntype\n=*\n(\nDiscussion communautaire OSM\n,\nRequête Overpass\n)\nVoir aussi\n*:type\n=*\nRetrieved from \"\nhttps://wiki.openstreetmap.org/w/index.php?title=Key:type&oldid=2852987\n\"", + "translated_at": "2025-09-04T00:49:57.770342", + "model": "mistral:7b", + "is_specific_page": false + }, + "type_key": { + "key": "type_key", + "en_page": { + "url": "https://wiki.openstreetmap.org/wiki/Key:type", + "last_modified": "2025-05-13", + "word_count": 911 + }, + "translated_content": " type\n·\nd\n·\ne\nDescription\nType de relation.\nGroupe :\npropriétés\nUtilisé sur ces\néléments\nValeurs documentées :\n20\nVoir aussi\n*:type =*\nStatut :\nde facto\ntype\n=\n*\nPlus de détails à la balise\ninfo\nOutils pour cette balise\ntaginfo\n·\nAD\n·\nAT\n·\nBR\n·\nBY\n·\nCH\n·\nCN\n·\nCZ\n·\nDE\n·\nDK\n·\nFI\n·\nFR\n·\nGB\n·\nGR\n·\nHU\n·\nIN\n·\nIR\n·\nIT\n·\nLI\n·\nLU\n·\nJP\n·\nKP\n·\nKR\n·\nNL\n·\nPL\n·\nPT\n·\nRU\n·\nES\n·\nAR\n·\nMX\n·\nCO\n·\nBO\n·\nCL\n·\nEC\n·\nPY\n·\nPE\n·\nUY\n·\nVE\n·\nTW\n·\nUA\n·\nUS\n·\nVN\noverpass-turbo\nHistoire des balises OSM de la relation\ntype\n=*\nsur un objet de relation spécifie son type et ses interactions parmi ses membres. Les types de relations établis et proposés sont listés ci-dessous.\ntype\na été également occasionnellement utilisé comme une balise supplémentaire pour spécifier une \"variante\" d'une catégorie de fonctionnalité sur les voies et points. Cependant, cette approche est en conflit avec son utilisation dans les relations et doit être évitée. De plus, pour les éléments ayant plusieurs balises, il n'est pas clair à quelle balise le type s'applique. Au lieu de cela, utiliser une approche basée sur des suffixes ou sous-balises, comme décrit dans *:type =*.\nRelations établies\nType\nStatut\nMembres\nCommentaires\nStatistiques\nImage\nmultipolygon\nde facto\n( )\nDes zones\noù le contour se compose de plusieurs voies ou qui ont des trous.\nroute\nde facto\nUne route établie (généralement signalisée) sur plusieurs autoroutes pour un mode de transport donné (marche, vélo, autobus ou circulation routière).\nroute_master\napprouvé\nContient uniquement des routes reliées (parallèles, opposées, variantes, ...). Utilisé principalement pour regrouper les variantes de transport en commun.\nrestriction\nde facto\nTournants autorisés sur une junction de route.\nboundary\nde facto\nLes limites politiques, administratives et similaires non toujours visibles au sol. Définies dans un mode similaire aux multipolygons.\npublic_transport\napprouvé\nFaisant partie du réseau public transport OSM. Principalement utilisé par public_transport = stop_area.\ndestination_sign\napprouvé\nSignaux d'itinéraire à ou près des carrefours.\nwaterway\napprouvé\nRegroupe plusieurs segments de voie d'eau portant un nom identique.\nenforcement\napprouvé\nDispositifs de contrôle de la circulation; caméras de vitesse, caméras de feux rouges, vérifications de poids, ...\nconnectivity\napprouvé\nIndique comment les voies du \"depuis\" membre se connectent à celles du \"vers\" membre.\nRelations peu fréquentes\nType\nStatut\nMembres\nCommentaires\nStatistiques\nImage\nassociatedStreet\ncontroversial\nNuméros d'adresse liés à une rue. Voir la proposition de schéma Karlsruhe. Interdit par la communauté dans certains pays.\nsuperroute\ncontroversial\nRegroupe ensemble une chaîne de routes. La superroute contient uniquement des routes concaténables. Son utilité est remise en question.\nsite\nen usage\nRegroupe les éléments d'un \"site\" avec des nœuds membres, au lieu d'utiliser un polygone multicarré. Voir Relations/Proposés/Site\nnetwork\nen usage\nLes relations qui décrivent les réseaux avec leurs membres étant les membres de ce réseau.\nbuilding\nen usage\nSouvent utilisé pour regrouper des éléments qui constituent un bâtiment dans la modélisation 3D simple, mais pas souvent requis.\nmultilinestring\nen usage\nUne série de voies non contiguës et non fermées qui représentent une seule objet physique en tant que série disjointe.\nstreet\nproposé\nRelie tous les morceaux d'une rue ensemble et tout ce qui appartient à elle. Voir Relations/Proposés/Rue\nbridge\nproposé\nRegroupe toutes les parties d'un pont. Voir Relations/Proposés/Ponts et Tunnels\ntunnel\nproposé\nRegroupe toutes les parties d'un tunnel. Voir Relations/Proposés/Ponts et Tunnels\nuser defined\nToutes les valeurs courantes selon Taginfo\nTaginfo\nUtilisations proposées\nDes propositions abandonnées et obsolètes ne sont pas incluses.\nPassages, carrefours, passages à niveau séparés et talus\nRelations/Proposés/Ponts et Tunnels\nregroupent toutes les voies utilisant un pont ou un tunnel commun\nRelations/Proposés/Carrefours\ntoutes les voies qui composent un carrefour (comme une intersection de route)\nRelations/Proposés/Aperçus de tournures\nIndique si une tournure est légèrement à gauche, forte à gauche, emboucle, etc.\nRelations/Proposés/Lanes de tournures\nLes tournures autorisées à partir d'un voie donnée\nHierarchies et autres relations d'espaces\nRelations/Proposés/Espaces\npour définir les espaces entre voies et lignes (crossover linéaire), diviseurs virtuels et crossover-possibilités, etc.\nRelations/Proposés/Balises\nBalises manuellement placées ou icônes dans des espaces\nRelations/Proposés/Niveaux\nPour les niveaux de 3D-Objets (stations du métro, bâtiments, etc.).\nRelations/Proposés/Glisse\npour regrouper ensemble tous les éléments pertinents d'une piste de luge.\nAdresses\nRelations/Proposés/Groupes de fonctionnalité\npour regrouper des fonctionnalités ayant un nom collectif ou une adresse, etc.\nSchéma Karlsruhe\nRelations/Proposés/Adresses postales\nAutres\nRelations/Proposés/Valeurs par défaut\ndéfinit une série de valeurs par défaut (limites de vitesse, sens unique, accès) pour un pays ou un État\nRelations/Proposés/Associe une fonctionnalité\npour associer un objet tel qu'un restaurant, hôtel ou musée avec des fonctionnalités de carte telles que les adresses ou les entrées.\nRelation à créer pour regrouper ensemble des objets (par exemple lorsqu'ils ont un nom commun comme groupe) sans nécessiter d'autres balises (définis par leurs membres).\nRelations/Proposés/Nœud\nune relation pour avoir plusieurs nœuds objets à la même position sans ajouter de géométries réelles (par exemple, pour les choses accrochées à un poteau, antennes sur un mât, etc.)\nMistakes de balisage possible\ntype\n=*\nPlus de détails à la balise\ninfo\ntype\n=*\n-- Cette clé devrait uniquement être utilisée sur les relations. Les objets d'autres types doivent être sous-classés à l'aide de l'un des schémas décrits dans *:type =* ou d'une autre balise.\nSi vous connaissez des lieux avec cette balise, vérifiez si elle ne pourrait pas être taggée avec une autre balise.\nLes édits automatisés sont fortement déconseillés\nsauf s'il vous plait, si vous êtes bien au courant de ce que vous faites !\nQualité Assurance\nVérifier les relations sans balise type =* (\nSujet communautaire OSM\n,\nRequête Overpass\n)\nVoir aussi\n*:type =*\nRécupéré de \"\nhttps://wiki.openstreetmap.org/w/index.php?title=Key:type&oldid=2852987\n\"", + "translated_at": "2025-09-04T00:47:36.015451", + "model": "mistral:7b", + "is_specific_page": false } }, - "last_updated": "2025-09-03T23:53:20.571419" + "last_updated": "2025-09-04T00:49:57.770802" } \ No newline at end of file diff --git a/wiki_compare/__pycache__/wiki_compare.cpython-313.pyc b/wiki_compare/__pycache__/wiki_compare.cpython-313.pyc index fe0f9f33ab64d5f7db212e31b4d27fadcba6da93..0c059414d20eb447a0be29c0fea3831833f99270 100644 GIT binary patch delta 3945 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 F??2GcC}02p delta 3373 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 diff --git a/wiki_compare/wiki_compare.py b/wiki_compare/wiki_compare.py index 60156f9..6f14f3a 100755 --- a/wiki_compare/wiki_compare.py +++ b/wiki_compare/wiki_compare.py @@ -162,8 +162,23 @@ def save_to_json(data, filename): filename (str): Name of the file """ try: + # Convert data to JSON string + json_str = json.dumps(data, indent=2, ensure_ascii=False) + + # Print the JSON string for debugging + logger.info(f"JSON string to be written to {filename}:") + logger.info(f"JSON keys at top level: {list(data.keys())}") + if 'translations' in data: + logger.info(f"JSON keys in translations: {list(data['translations'].keys())}") + if 'type' in data['translations']: + logger.info(f"'type' key exists in translations") + if 'type_key' in data['translations']: + logger.info(f"'type_key' key exists in translations") + + # Write the JSON string to the file with open(filename, 'w', encoding='utf-8') as f: - json.dump(data, f, indent=2, ensure_ascii=False) + f.write(json_str) + logger.info(f"Data saved to {filename}") except IOError as e: logger.error(f"Error saving data to {filename}: {e}") @@ -458,9 +473,9 @@ def fetch_wiki_page(key, language='en', is_specific_page=False): # Check grammar for French pages grammar_suggestions = [] - if language == 'fr': - logger.info(f"Checking grammar for French page: {key}") - grammar_suggestions = check_grammar_with_grammalecte(clean_text) +# if language == 'fr': +# logger.info(f"Checking grammar for French page: {key}") +# grammar_suggestions = check_grammar_with_grammalecte(clean_text) # Extract links links = content.select('a') diff --git a/wiki_compare/wiki_translate.py b/wiki_compare/wiki_translate.py index bef8f06..84cd81b 100644 --- a/wiki_compare/wiki_translate.py +++ b/wiki_compare/wiki_translate.py @@ -148,17 +148,18 @@ French translation:""" logger.error(f"Error translating text: {e}") return "" -def translate_wiki_page(key): +def translate_wiki_page(key, force=False): """ Translate a wiki page Args: key (str): Key or page title + force (bool): Force translation even if French page exists Returns: dict: Translation information """ - logger.info(f"Translating wiki page for key: {key}") + logger.info(f"Translating wiki page for key: {key!r} (type: {type(key)})") # Check if the key is a specific page is_specific_page = key in SPECIFIC_PAGES or key.startswith('http') or key.startswith('FR:') @@ -171,8 +172,8 @@ def translate_wiki_page(key): # Check if French page already exists fr_page = fetch_wiki_page(key, 'fr', is_specific_page=is_specific_page) - if fr_page: - logger.info(f"French page for key '{key}' already exists") + if fr_page and not force: + logger.info(f"French page for key '{key}' already exists (use force=True to translate anyway)") return None # Extract the main content from the English page @@ -220,13 +221,16 @@ def save_translation(translation_info): bool: True if successful, False otherwise """ if not translation_info: + logger.warning("No translation info provided, cannot save") return False # Load existing translations translations = load_json_data(TRANSLATIONS_FILE) + logger.info(f"Loaded existing translations: {list(translations.get('translations', {}).keys())}") # Initialize if empty if not translations: + logger.info("No existing translations found, initializing new translations object") translations = { 'translations': {}, 'last_updated': datetime.now().isoformat() @@ -234,21 +238,51 @@ def save_translation(translation_info): # Add or update translation key = translation_info['key'] + logger.info(f"Adding/updating translation for key '{key!r}' (type: {type(key)})") + + # Debug: print the translations dictionary structure before adding the new translation + logger.info(f"Translations structure before adding: {type(translations)}, keys: {list(translations.keys())}") + logger.info(f"Translations['translations'] type: {type(translations.get('translations', {}))}") + + # Add the translation translations['translations'][key] = translation_info translations['last_updated'] = datetime.now().isoformat() + # Debug: print the translations dictionary structure after adding the new translation + logger.info(f"Translations structure after adding: keys: {list(translations.keys())}") + logger.info(f"Translations['translations'] keys after adding: {list(translations.get('translations', {}).keys())}") + # Save translations - save_to_json(translations, TRANSLATIONS_FILE) + logger.info(f"Saving translations to {TRANSLATIONS_FILE}") + try: + save_to_json(translations, TRANSLATIONS_FILE) + logger.info("save_to_json completed successfully") + except Exception as e: + logger.error(f"Error saving translations: {e}") + return False + + # Verify the translation was saved + try: + verify_translations = load_json_data(TRANSLATIONS_FILE) + logger.info(f"Verify translations loaded, keys: {list(verify_translations.get('translations', {}).keys())}") + if key in verify_translations.get('translations', {}): + logger.info(f"Verified translation for key '{key!r}' was saved") + else: + logger.warning(f"Failed to verify translation for key '{key!r}' was saved") + logger.warning(f"Keys in verify_translations: {list(verify_translations.get('translations', {}).keys())}") + except Exception as e: + logger.error(f"Error verifying translation: {e}") logger.info(f"Translation saved for key '{key}'") return True -def update_translation(key): +def update_translation(key, force=True): """ Update a translation for a specific key Args: key (str): Key or page title + force (bool): Force translation even if French page exists Returns: bool: True if successful, False otherwise @@ -256,7 +290,7 @@ def update_translation(key): logger.info(f"Updating translation for key: {key}") # Translate the page - translation_info = translate_wiki_page(key) + translation_info = translate_wiki_page(key, force=force) # Save the translation if translation_info: