我需要在我的应用程序中打印Localizable.strings的键,而不是它们的值(出于调试目的(。有没有一种快速的方法可以覆盖NSLocalizedString((方法或重新定义宏,比如:
#define NSLocalizedString(key, comment) NSLocalizedString(key, key)
一个选项是通过产品菜单导出应用程序进行本地化>导出Xcode中的本地化,然后将xcloc文件保存到桌面。
之后,您可以使用python脚本来解析内部xliff(xml(,以找到具有包含Localizable.strings
的original
属性的文件元素,并在其正文中打印trans-unit
的source
元素文本。下面是一个python脚本的例子,它应该本地化Keys.py:
import sys
import os.path
from xml.etree import ElementTree as et
import argparse as ap
import re
if __name__ == '__main__':
parser = ap.ArgumentParser()
# filename argument ex: de.xliff
parser.add_argument('filename', help="filename of the xliff to find keys ex:de.xliff")
# verbose flag
parser.add_argument('-v', '--verbose', action='store_true', default=False, help='Show all the output')
args = parser.parse_args()
if (os.path.isfile(args.filename)):
tree = et.parse(args.filename)
root = tree.getroot()
match = re.match(r'{.*}', root.tag)
ns = match.group(0) if match else ''
files = root.findall(ns + 'file')
for file in files:
originalAttr = file.attrib['original']
# find all files which contain Localizable.strings
if originalAttr != None and 'Localizable.strings' in originalAttr:
if args.verbose == True:
print("----- Localizations for file: " + originalAttr + " -----")
# grab the body element
bodyElement = file.find(ns + 'body')
# get all the trans-units
transUnits = bodyElement.findall(ns + 'trans-unit')
for transUnit in transUnits:
# print all the source values (keys)
print(transUnit.find(ns + 'source').text)
else:
print("No file found with the specified name: " + args.filename)
然后你可以使用如下:
python3 localizationKeys.py en.xcloc/Localized Contents/en.xliff
或者,如果您更喜欢打印到文件而不是
python3 localizationKeys.py en.xcloc/Localized Contents/en.xliff > output.txt
使用xpath
可以更简洁,但这正是我很快想到的。
好吧,这就是我获得所需的方式
// Overriding NSLocalizedString to print keys instead of values
#ifdef NSLocalizedString
#undef NSLocalizedString
#endif
#define NSLocalizedString(key, comment) key
通过这种方式,应用程序使用密钥而不是值