@@ -28,9 +28,9 @@ def merge_items(base_items, new_items):
2828 key_name = ItemsUtil .get_key_name_from_items (new_items ) # 可能为: key/ios_key/web_key
2929 for key , item in new_items .items ():
3030 for base_item in base_items .values ():
31- if not base_item [ key_name ] and item .all_lang_equals (base_item ):
31+ if not getattr ( base_item , key_name ) and item .all_lang_equals (base_item ):
3232 # base_item不存在[key_name]的情况下, 若所有语言的翻译都相同, 说明是同一个字符串, 给base_item添加[key_name]
33- base_item [ key_name ] = item [ key_name ]
33+ setattr ( base_item , key_name , getattr ( item , key_name ))
3434 break
3535 else : # 没有找到三语相同的时, 需要添加item
3636 items [key ] = item
@@ -85,18 +85,15 @@ def process_diff_cover(files, new_items):
8585 else :
8686 pass
8787
88- def process_diff_all (files : typing .Tuple [File , ...], new_items : typing .Dict [str , Item ], item_key_name : str ):
88+ def process_diff_all (files : typing .Tuple [File , ...], new_items : typing .Dict [str , Item ]):
8989 """
9090 以new_items为准, 处理删除和新增
9191
9292 :param files:
9393 :param new_items:
94- :param item_key_name: new_items的key使用的Item的哪个字段; 可选 'key', 'ios_key';
9594 :return:
9695 """
9796 items = ItemsUtil .read_files_to_items (files )
98- if item_key_name : # 过滤android或ios的item
99- new_items = Dict ((k , v ) for k , v in new_items .items () if str (k ) == v [item_key_name ])
10097 lang_files = list (map (lambda f : (f .lang , f ), files )) # (注意: 有可能存在多个file的lang相同的情况...)
10198 for key , item in items .items (): # 遍历items
10299 new_item = new_items [key ]
@@ -151,7 +148,8 @@ def process_diff_all(files: typing.Tuple[File, ...], new_items: typing.Dict[str,
151148 # ItemsUtil.cover_items_to_files(ios_files, new_items)
152149
153150 for files in files_tuple :
154- process_diff_all (files , new_items , ItemsUtil .get_key_name_from_files (files ))
151+ key_class = ItemsUtil .get_key_class_from_files (files )
152+ process_diff_all (files , Dict ({k : v for k , v in new_items .items () if isinstance (k , key_class )}))
155153 ItemsUtil .cover_items_to_files (files , new_items )
156154
157155
@@ -166,8 +164,9 @@ def process_translate(files: typing.Tuple[File, ...], items: typing.Dict[str, It
166164 has_translate_files = [(lang , f ) for lang , f in main_lang_files if item [lang ]]
167165 if len (has_translate_files ) > 0 and len (has_translate_files ) < len (main_lang_files ):
168166 source = Dict (lang = has_translate_files [0 ][0 ], text = item [has_translate_files [0 ][0 ]]) # 将第一个有翻译的语言作为源语言
169- for lang , file in main_lang_files :
170- try :
167+ try :
168+ temp_result = Dict ()
169+ for lang , file in main_lang_files :
171170 old_text = item [lang ]
172171 # 因为存在将zh写在en的file里的情况, 故大多数情况下需要把所有的file都翻译一遍
173172 if translate_all_lang or not old_text :
@@ -178,12 +177,18 @@ def process_translate(files: typing.Tuple[File, ...], items: typing.Dict[str, It
178177 p ('remind' , '(translate %s => %s)%s:\n %s\n %s' % (source .lang , lang , key , old_text , new_text ))
179178 replace = input ('是否修改该字符串:(y)' ) in 'yY'
180179 if replace :
181- item [lang ] = new_text
182- p ('info' , 'translate %s => %s >> %s => %s' % (source .lang , lang , source .text , item [lang ]))
183- if not old_text : # 给file添加空行, see: @add_empty_line_for_cover
184- file .add (key , '' )
185- except Exception as e :
186- p ('warn' , 'translate %s => %s >> %s =x %s' % (source .lang , lang , source .text , e ))
180+ temp_result [lang ] = (new_text , old_text , file )
181+ # 翻译结果放在temp_result中去, item的所有语言的翻译完全成功后再应用更改
182+ # 若中途报错, 则item的所有语言翻译都会回退
183+ # 这样做主要是为了防止source是zh写在en的file中时, 第一次是zh翻其他语言,
184+ # 第二次若source已经被翻成了en, 则是en翻其他语言, 会存在结果不一致的问题
185+ for lang , (new_text , old_text , file ) in temp_result .items ():
186+ item [lang ] = new_text
187+ p ('info' , 'translate %s => %s >> %s => %s' % (source .lang , lang , source .text , item [lang ]))
188+ if not old_text : # 给file添加空行, see: @add_empty_line_for_cover
189+ file .add (key , '' )
190+ except Exception as e :
191+ p ('warn' , 'translate %s => ?? >> %s =x %s' % (source .lang , source .text , e ))
187192
188193 items = ItemsUtil .read_files_to_items (files )
189194
0 commit comments