كود: تحديد الكل
#!/usr/bin/env python3
import re
import json
import argparse
def extract(input_path, translation_path, mapping_path):
"""
Extract readable English text from the original file, replacing tags/codes/entities
with unique placeholders, and save the translation template and mapping JSON.
"""
mapping = {}
counter = 0
translations = []
# يطابق أي وسم XML أو كود موضوع بين { }
pattern = re.compile(r'(<[^>]*>|{[^}]*})')
with open(input_path, 'r', encoding='utf-8') as f:
for line in f:
last_end = 0
line_translated = ''
for m in pattern.finditer(line):
# نص قبل الكود/الوسم
line_translated += line[last_end:m.start()]
# إنشاء العنصر النائب
placeholder = f'{{#{counter}}}'
mapping[placeholder] = m.group(0)
counter += 1
# إضافة العنصر النائب
line_translated += placeholder
last_end = m.end()
# إضافة بقية السطر
line_translated += line[last_end:]
translations.append(line_translated)
# حفظ ملف القالب للترجمة
with open(translation_path, 'w', encoding='utf-8') as f:
f.writelines(translations)
# حفظ خريطة الأكواد/الوسوم إلى JSON
with open(mapping_path, 'w', encoding='utf-8') as f:
json.dump(mapping, f, ensure_ascii=False, indent=2)
def merge(translation_path, mapping_path, output_path):
"""
Merge translated text back by replacing placeholders with the original codes/entities.
"""
# تحميل الخريطة
with open(mapping_path, 'r', encoding='utf-8') as f:
mapping = json.load(f)
# قراءة ملف الترجمة بعد المعالجة الخارجية
with open(translation_path, 'r', encoding='utf-8') as f:
lines = f.readlines()
merged_lines = []
for line in lines:
# استبدال كل عنصر نائب بالكود الأصلي
for placeholder, code in mapping.items():
line = line.replace(placeholder, code)
merged_lines.append(line)
# حفظ الناتج المدمج
with open(output_path, 'w', encoding='utf-8') as f:
f.writelines(merged_lines)
def main():
parser = argparse.ArgumentParser(
description="Extract and merge translations with placeholders."
)
parser.add_argument(
"action",
choices=["extract", "merge"],
help="Action to perform: 'extract' to create template, 'merge' to reintegrate"
)
parser.add_argument(
"--input", "-i",
default="Game.locres.txt",
help="Path to the original file"
)
parser.add_argument(
"--translation", "-t",
default="Game_translation.txt",
help="Path to the translation output file"
)
parser.add_argument(
"--mapping", "-m",
default="Game_mapping.json",
help="Path to the mapping JSON file"
)
parser.add_argument(
"--output", "-o",
default="Game_merged.txt",
help="Path to the merged output file"
)
args = parser.parse_args()
if args.action == "extract":
extract(args.input, args.translation, args.mapping)
print(f"Template created: {args.translation}")
print(f"Mapping saved: {args.mapping}")
elif args.action == "merge":
merge(args.translation, args.mapping, args.output)
print(f"Merged file saved: {args.output}")
if __name__ == "__main__":
main()
# يطابق أي وسم XML أو كود موضوع بين { }
(r'(<[^>]*>|{[^}]*})')