|
7 | 7 | import json
|
8 | 8 | import logging
|
9 | 9 | import os
|
| 10 | +from dataclasses import dataclass |
10 | 11 |
|
11 | 12 | import polib
|
| 13 | +import pycountry |
12 | 14 | from dotenv import load_dotenv
|
13 | 15 | from openai import OpenAI
|
14 | 16 | from pkg_resources import DistributionNotFound, get_distribution
|
@@ -57,18 +59,43 @@ def disable_fuzzy_translations(po_file_path):
|
57 | 59 | @staticmethod
|
58 | 60 | def get_file_language(po_file_path, po_file, languages, folder_language):
|
59 | 61 | """Determines the language for a .po file."""
|
60 |
| - # Attempt to get language from the file metadata first |
61 | 62 | file_lang = po_file.metadata.get('Language', '')
|
| 63 | + normalized_lang = POFileHandler.normalize_language_code(file_lang) |
62 | 64 |
|
63 |
| - # If the file's language is not valid, infer it from the folder structure |
64 |
| - if not file_lang or file_lang not in languages: |
65 |
| - if folder_language: |
66 |
| - inferred_lang = next((part for part in po_file_path.split(os.sep) if part in languages), None) |
67 |
| - if inferred_lang: |
68 |
| - logging.info("Inferred language for .po file: %s as %s", po_file_path, inferred_lang) |
69 |
| - return inferred_lang |
70 |
| - return None |
71 |
| - return file_lang |
| 65 | + if normalized_lang in languages: |
| 66 | + return normalized_lang |
| 67 | + |
| 68 | + if folder_language: |
| 69 | + for part in po_file_path.split(os.sep): |
| 70 | + norm_part = POFileHandler.normalize_language_code(part) |
| 71 | + if norm_part in languages: |
| 72 | + logging.info("Inferred language for .po file: %s as %s", po_file_path, norm_part) |
| 73 | + return norm_part |
| 74 | + |
| 75 | + return None |
| 76 | + |
| 77 | + @staticmethod |
| 78 | + def normalize_language_code(lang): |
| 79 | + """Convert language name or code to ISO 639-1 code.""" |
| 80 | + # Try direct lookup |
| 81 | + if len(lang) == 2: |
| 82 | + try: |
| 83 | + return pycountry.languages.get(alpha_2=lang.lower()).alpha_2 |
| 84 | + except AttributeError: |
| 85 | + pass |
| 86 | + |
| 87 | + # Try by name |
| 88 | + try: |
| 89 | + return pycountry.languages.get(name=lang.title()).alpha_2 |
| 90 | + except AttributeError: |
| 91 | + pass |
| 92 | + |
| 93 | + # Try by native name |
| 94 | + for language in pycountry.languages: |
| 95 | + if hasattr(language, 'inverted_name') and language.inverted_name.lower() == lang.lower(): |
| 96 | + return language.alpha_2 |
| 97 | + |
| 98 | + return None |
72 | 99 |
|
73 | 100 | @staticmethod
|
74 | 101 | def log_translation_status(po_file_path, original_texts, translations):
|
@@ -99,14 +126,14 @@ def update_po_entry(po_file, original_text, translated_text):
|
99 | 126 | logging.warning("Original text '%s' not found in the .po file.", original_text)
|
100 | 127 |
|
101 | 128 |
|
| 129 | +@dataclass |
102 | 130 | class TranslationConfig:
|
103 | 131 | """ Class to hold configuration parameters for the translation service. """
|
104 |
| - def __init__(self, client, model, bulk_mode=False, fuzzy=False, folder_language=False): # pylint: disable=R0913 |
105 |
| - self.client = client |
106 |
| - self.model = model |
107 |
| - self.bulk_mode = bulk_mode |
108 |
| - self.fuzzy = fuzzy |
109 |
| - self.folder_language = folder_language |
| 132 | + client: object |
| 133 | + model: str |
| 134 | + bulk_mode: bool = False |
| 135 | + fuzzy: bool = False |
| 136 | + folder_language: bool = False |
110 | 137 |
|
111 | 138 |
|
112 | 139 | class TranslationService:
|
@@ -473,8 +500,14 @@ def main():
|
473 | 500 | else:
|
474 | 501 | detail_langs = [None] * len(lang_codes) # If no detailed language is provided, default to None
|
475 | 502 |
|
476 |
| - # Create a configuration object |
477 |
| - config = TranslationConfig(client, args.model, args.bulk, args.fuzzy, args.folder_language) |
| 503 | + # And in main(): |
| 504 | + config = TranslationConfig( |
| 505 | + client=client, |
| 506 | + model=args.model, |
| 507 | + bulk_mode=args.bulk, # Changed bulk to bulk_mode |
| 508 | + fuzzy=args.fuzzy, |
| 509 | + folder_language=args.folder_language |
| 510 | + ) |
478 | 511 |
|
479 | 512 | # Initialize the translation service with the configuration object
|
480 | 513 | translation_service = TranslationService(config, args.bulksize)
|
|
0 commit comments