我想将“NSLocalizedString”缩短为“_”,所以我正在使用宏
_(x) NSLocalizedString(@x, @__FILE__)
但是现在,当我想为本地化生成字符串时
find . -name \*.m | xargs genstrings
它什么也没产生。
任何帮助?
答案 0 :(得分:4)
您可以通过使用'-s'参数告诉genstrings寻找不同的函数:
genstring -s MyFunctionName ....
但是,MyFunctionName必须遵循与内置的NSLocalizeString宏相同的命名和参数约定。
在您的情况下,您不能只指定字符串键,还必须指定文档字符串。事实上,你应该从不生成一个没有字符串和文档的字符串文件。有许多语言,实际的短语或单词将取决于上下文。德国是一个很好的例子,汽车是“汽车自动”,不止一个是“死汽车”。还有更多的例子包括性别,数量,时间,问题与陈述的变化,以及是和否。文档字符串可帮助您的翻译人员确定要使用的翻译。
此外,最佳做法是使用与母语单词不同的键。这就是说使用NSLocalizedStringWithDefaultValue(key,table,bundle,val,comment)。 您可以为表指定nil,为bundle参数指定[NSBundle mainBundle]。
你可以用速记包装它,但你仍然必须遵循StringWithDefaultValue名称和genstrings的参数才能工作。
我强烈建议您查看有关本地化提示和技巧的WWDC 2012会议。
莫里斯
答案 1 :(得分:3)
您可以使用-s
的{{1}}选项。来自man page:
-s 例程
替换NSLocalizedString的例程。例如,-s MyLocalString将捕获对MyLocalString和MyLocalStringFromTable的调用。
所以我想你可以试试:
genstrings -s _
答案 2 :(得分:2)
当我的NSLocalizedString宏占用1个参数而不是2个像genstrings期望的时候,我遇到了同样的问题,所以我编写了i python脚本来完成这项工作。
脚本的第一个参数是宏名称,第二个参数是项目的路径。
import fnmatch
import os
from xml.dom import minidom
function = sys.argv[1]
rootdir = sys.argv[2]
# Generate strings from .m files
files = []
for root, dirnames, filenames in os.walk(rootdir):
for filename in fnmatch.filter(filenames, '*.m'):
files.append(os.path.join(root, filename))
strings = []
for file in files:
lineNumber = 0
for line in open(file):
lineNumber += 1
index = line.find(function)
if (index != -1):
callStr = line[index:]
index = callStr.find('@')
if (index == -1):
print 'call with a variable/macro. file: ' + file + ' line: %d' % lineNumber
else:
callStr = callStr[index+1:]
index = callStr.find('")')
callStr = callStr[:index+1]
if callStr not in strings:
strings.append(callStr)
# Write strings to file
f = open('Localizable.strings', 'w+')
for string in strings:
f.write(string + ' = ' + string + ';\n\n')
f.close()
答案 3 :(得分:0)
我已经改进了Or Arbel的脚本,以包含单行上有多个宏调用的情况:
import fnmatch
import os
from xml.dom import minidom
import sys
function = sys.argv[1]
rootdir = sys.argv[2]
# Generate strings from .m files
files = []
for root, dirnames, filenames in os.walk(rootdir):
for filename in fnmatch.filter(filenames, '*.m'):
files.append(os.path.join(root, filename))
strings = []
for file in files:
lineNumber = 0
for line in open(file):
lineNumber += 1
index = line.find(function)
startIndex = 0
while (index != -1):
startIndex = index+1
callStr = line[index:]
index = callStr.find('@')
if (index == -1):
print 'call with a variable/macro. file: ' + file + ' line: %d' % lineNumber
else:
callStr = callStr[index+1:]
index = callStr.find('")')
callStr = callStr[:index+1]
if callStr not in strings:
strings.append(callStr)
index = line.find(function, startIndex)
# Write strings to file
f = open('Localizable.strings', 'w+')
for string in strings:
f.write(string + ' = ' + string + ';\n\n')
f.close()