@@ -43,55 +43,62 @@ def build_language_map():
4343DEFAULT_LANGUAGE_MAP = build_language_map ()
4444
4545def detect_language_from_filename (filename ):
46- """Detect language from file extension (e.g., my-program.de.py -> german)"""
46+ """Detect language from file extension (e.g., my-program.de.py -> german)
47+ Returns tuple: (filepath, two_letter_code) or None"""
4748 parts = filename .split ('.' )
48-
49- # ------------- Debugging ---------------
50- # print("filename", filename)
51- # print("parts", parts)
52- # print("DEFAULT_LANGUAGE_MAP", DEFAULT_LANGUAGE_MAP)
53- # ------------- Debugging ---------------
54-
49+
5550 if len (parts ) > 2 : # Has language code in extension
5651 lang_code = parts [- 2 ].lower ()
57- return DEFAULT_LANGUAGE_MAP .get (lang_code , None )['default' ]
52+ if lang_code in DEFAULT_LANGUAGE_MAP :
53+ # Return first filepath found and the language code
54+ lang_files = DEFAULT_LANGUAGE_MAP [lang_code ]
55+ first_file = next (iter (lang_files .values ())) if lang_files else None
56+ return (first_file , lang_code )
5857 return None
5958
6059def detect_language_from_comment (code ):
61- """Detect language from comment (e.g., # language:fr)"""
60+ """Detect language from comment (e.g., # language:fr)
61+ Returns tuple: (filepath, two_letter_code) or None"""
6262 first_lines = code .split ('\n ' )[:5 ] # Check first 5 lines for comment
6363 for line in first_lines :
6464 match = re .search (r'^#\s*language\s*:\s*(\w+)' , line , re .IGNORECASE )
6565 if match :
6666 lang_code = match .group (1 ).lower ()
67- return DEFAULT_LANGUAGE_MAP .get (lang_code , None )['default' ]
67+ if lang_code in DEFAULT_LANGUAGE_MAP :
68+ # Return first filepath found and the language code
69+ lang_files = DEFAULT_LANGUAGE_MAP [lang_code ]
70+ first_file = next (iter (lang_files .values ())) if lang_files else None
71+ return (first_file , lang_code )
6872 return None
6973
7074def determine_language (args , filename , code ):
7175 """Determine target language based on priority rules"""
72- # If dictionary is explicitly provided, use that
73- if args .get ('dictionary' ):
74- return args ['dictionary' ]
76+ detected_dictionary = None
7577
76- # Check for language comment (higher priority)
77- lang = detect_language_from_comment (code )
78- if lang :
79- return lang
80-
81- # Check file extension
82- lang = detect_language_from_filename (filename )
83- if lang :
84- return lang
85-
86- # Default to empty (no translation)
87- return ""
78+ detected_lang = None
79+
80+ # Check detection methods in priority order
81+ if args .get ('dictionary' ):
82+ detected_dictionary = args ['dictionary' ]
83+ elif args .get ('source_language' ):
84+ detected_dictionary = DEFAULT_LANGUAGE_MAP .get (args ['source_language' ], {})['default' ]
85+ else :
86+ detected_dictionary , detected_lang = detect_language_from_comment (code ) or detect_language_from_filename (filename )
87+
88+ # Update source_language with the detected language if not explicitly set
89+ # if not args.get('source_language') and detected_lang:
90+ if detected_lang :
91+ args ['source_language' ] = detected_lang
92+
93+ return detected_dictionary or ""
8894
8995def run_module (
9096 mode ,
9197 code ,
9298 args = {
9399 'translate' : False ,
94100 'dictionary' : "" ,
101+ 'source_language' : "" ,
95102 'reverse' : False ,
96103 'keep' : False ,
97104 'keep_only' : False ,
@@ -111,14 +118,23 @@ def main():
111118 help = 'File to compile.' )
112119
113120 ap .add_argument ("-t" , "--translate" ,
114- action = 'store_true' ,
115- default = False , required = False ,
116- help = "Translate variables and functions to English, using the unicode." )
121+ choices = ["" , "argostranslate" , "unicode" ],
122+ const = "" , # Default when --translate is used without value
123+ default = None , # Default when --translate is not used at all
124+ nargs = '?' , # Makes the argument optional
125+ required = False ,
126+ help = "Translate variables and functions. Options: "
127+ "no value (unicode), 'argostranslate', or 'unicode'" )
117128
118129 ap .add_argument ("-d" , "--dictionary" ,
119130 default = "" , required = False ,
120131 help = "The dictionary to use to translate the code." )
121132
133+ ap .add_argument ("-sl" , "--source-language" ,
134+ default = "" , required = False ,
135+ dest = "source_language" ,
136+ help = "The source language of the code (for translation)." )
137+
122138 ap .add_argument ("-r" , "--reverse" ,
123139 action = 'store_true' ,
124140 default = False , required = False ,
@@ -143,10 +159,10 @@ def main():
143159 args = vars (ap .parse_args ())
144160
145161 filename = args ["file" ][0 ]
146- code_pyfile = open (filename )
147- code = code_pyfile .read ()
162+ with open (filename ) as code_pyfile :
163+ code = code_pyfile .read ()
148164
149- # Determine language if not explicitly provided
165+ # Determine language and update source_language
150166 args ['dictionary' ] = determine_language (args , filename , code )
151167
152168 # Default mode is 'lex' if not specified
0 commit comments