|
10 | 10 | from dataclasses import dataclass
|
11 | 11 |
|
12 | 12 | import polib
|
| 13 | +import pycountry |
13 | 14 | from dotenv import load_dotenv
|
14 | 15 | from openai import OpenAI
|
15 | 16 | from pkg_resources import DistributionNotFound, get_distribution
|
@@ -58,18 +59,43 @@ def disable_fuzzy_translations(po_file_path):
|
58 | 59 | @staticmethod
|
59 | 60 | def get_file_language(po_file_path, po_file, languages, folder_language):
|
60 | 61 | """Determines the language for a .po file."""
|
61 |
| - # Attempt to get language from the file metadata first |
62 | 62 | file_lang = po_file.metadata.get('Language', '')
|
| 63 | + normalized_lang = POFileHandler.normalize_language_code(file_lang) |
63 | 64 |
|
64 |
| - # If the file's language is not valid, infer it from the folder structure |
65 |
| - if not file_lang or file_lang not in languages: |
66 |
| - if folder_language: |
67 |
| - inferred_lang = next((part for part in po_file_path.split(os.sep) if part in languages), None) |
68 |
| - if inferred_lang: |
69 |
| - logging.info("Inferred language for .po file: %s as %s", po_file_path, inferred_lang) |
70 |
| - return inferred_lang |
71 |
| - return None |
72 |
| - 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 |
73 | 99 |
|
74 | 100 | @staticmethod
|
75 | 101 | def log_translation_status(po_file_path, original_texts, translations):
|
|
0 commit comments