हालांकि मैं स्ट्रिंग / app_name को प्रति स्वाद भिन्न कैसे बनाऊं?
मैं एक अद्यतन लिखना चाहता था, लेकिन यह महसूस किया कि यह मूल उत्तर से बड़ा है कि मैं एक पायथन स्क्रिप्ट का उपयोग करता हूं जो स्रोत को पैच करती है।
पायथन लिपि में एक पैरामीटर, एक निर्देशिका नाम है। उस निर्देशिका में प्रति-स्वाद संपत्ति, लॉन्चर आइकन जैसे संसाधन और पायथन शब्दकोश के साथ फ़ाइल गुण। Txt शामिल हैं।
{ 'someBoolean' : True
, 'someParam' : 'none'
, 'appTitle' : '@string/x_app_name_xyz'
}
पायथन लिपि उस फ़ाइल से शब्दकोश को लोड करती है और मान को उसके बीच <string name="app_name">
और उसके स्थान पर बदल देती </string>
है properties['appTitle']
।
नीचे दिया गया कोड as-is / as-as आधार आदि पर प्रदान किया गया है।
for strings_xml in glob.glob("res/values*/strings.xml"):
fileReplace(strings_xml,'<string name="app_name">',properties['appTitle'],'</string>',oldtextpattern=r"[a-zA-Z0-9_/@\- ]+")
एक या अधिक ऐसी फ़ाइल से गुण पढ़ने के लिए:
with open(filename1) as f:
properties = eval(f.read())
with open(filename2) as f:
properties.update(eval(f.read()))
और fileReplace फ़ंक्शन है:
really = True
def fileReplace(fname,before,newtext,after,oldtextpattern=r"[\w.]+",mandatory=True):
with open(fname, 'r+') as f:
read_data = f.read()
pattern = r"("+re.escape(before)+r")"+oldtextpattern+"("+re.escape(after)+r")"
replacement = r"\g<1>"+newtext+r"\g<2>"
new_data,replacements_made = re.subn(pattern,replacement,read_data,flags=re.MULTILINE)
if replacements_made and really:
f.seek(0)
f.truncate()
f.write(new_data)
if verbose:
print "patching ",fname," (",replacements_made," occurrence" + ("s" if 1!=replacements_made else ""),")",newtext,("-- no changes" if new_data==read_data else "-- ***CHANGED***")
elif replacements_made:
print fname,":"
print new_data
elif mandatory:
raise Exception("cannot patch the file: "+fname+" with ["+newtext+"] instead of '"+before+"{"+oldtextpattern+"}"+after+"'")
स्क्रिप्ट की पहली पंक्तियाँ हैं:
#!/usr/bin/python
# coding: utf-8
import sys
import os
import re
import os.path
import shutil
import argparse
import string
import glob
from myutils import copytreeover