Skip to content

Commit 52bab8b

Browse files
Merge pull request #5 from pescheckit/feature_added-data-class
fix: Enhanced language code handling with pycountry lib
2 parents ea6872d + 3f94342 commit 52bab8b

File tree

4 files changed

+57
-22
lines changed

4 files changed

+57
-22
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ dist/
44
*.egg-info/
55
__pycache__
66
build/
7-
db.sqlite3
7+
db.sqlite3
8+
.venv

python_gpt_po/po_translator.py

Lines changed: 51 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
import json
88
import logging
99
import os
10+
from dataclasses import dataclass
1011

1112
import polib
13+
import pycountry
1214
from dotenv import load_dotenv
1315
from openai import OpenAI
1416
from pkg_resources import DistributionNotFound, get_distribution
@@ -57,18 +59,43 @@ def disable_fuzzy_translations(po_file_path):
5759
@staticmethod
5860
def get_file_language(po_file_path, po_file, languages, folder_language):
5961
"""Determines the language for a .po file."""
60-
# Attempt to get language from the file metadata first
6162
file_lang = po_file.metadata.get('Language', '')
63+
normalized_lang = POFileHandler.normalize_language_code(file_lang)
6264

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
7299

73100
@staticmethod
74101
def log_translation_status(po_file_path, original_texts, translations):
@@ -99,14 +126,14 @@ def update_po_entry(po_file, original_text, translated_text):
99126
logging.warning("Original text '%s' not found in the .po file.", original_text)
100127

101128

129+
@dataclass
102130
class TranslationConfig:
103131
""" 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
110137

111138

112139
class TranslationService:
@@ -473,8 +500,14 @@ def main():
473500
else:
474501
detail_langs = [None] * len(lang_codes) # If no detailed language is provided, default to None
475502

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+
)
478511

479512
# Initialize the translation service with the configuration object
480513
translation_service = TranslationService(config, args.bulksize)

requirements.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
polib==1.2.0
2-
openai==v1.42.0
2+
openai==1.58.1
33
python-dotenv==1.0.0
44
pytest==8.2.2
55
tenacity==9.0.0
6-
setuptools-scm==8.1.0
6+
setuptools-scm==8.1.0
7+
pycountry==24.6.1

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
include_package_data=True,
2525
install_requires=[
2626
'polib==1.2.0',
27-
'openai==v1.42.0',
27+
'openai==1.58.1',
2828
'python-dotenv==1.0.0',
2929
'tenacity==9.0.0',
3030
],

0 commit comments

Comments
 (0)