我想将 "NSLocalizedString" 缩短为 "_" 所以我正在使用 macro
_(x) NSLocalizedString(@x, @__FILE__)
。
但是现在,当我想生成用于本地化的字符串时,
find . -name \*.m | xargs genstrings
它什么也不会产生。
有什么帮助吗?
我想将 "NSLocalizedString" 缩短为 "_" 所以我正在使用 macro
_(x) NSLocalizedString(@x, @__FILE__)
。
但是现在,当我想生成用于本地化的字符串时,
find . -name \*.m | xargs genstrings
它什么也不会产生。
有什么帮助吗?
您可以使用 '-s' 参数告诉 genstrings 寻找不同的函数:
genstring -s MyFunctionName ....
但是,MyFunctionName 必须遵循与内置 NSLocalizeString 宏之一相同的命名和参数约定。
在您的情况下,您不仅可以指定字符串键,还必须指定文档字符串。事实上,您永远不应该在没有字符串和文档的情况下生成字符串文件。有许多语言的实际短语或单词将取决于上下文。德语是一个很好的例子,其中一辆汽车是“das auto”,而不止一辆是“die autos”。还有更多示例,包括性别、数字、时间、问题与陈述以及是与否的变化。文档字符串可帮助您的翻译人员确定要使用的翻译。
此外,最佳做法是使用与母语单词不同的键。也就是说使用 NSLocalizedStringWithDefaultValue(key, table, bundle, val, comment)。您可以为 table 指定 nil ,为 bundle 参数指定 [NSBundle mainBundle] 。
您可以用简写形式包装它,但您仍然必须遵循 StringWithDefaultValue 名称和参数才能使 genstrings 起作用。
我强烈建议您查看有关本地化提示和技巧的 WWDC 2012 会议。
莫里斯
您可以使用 的-s
选项genstrings
。从手册页:
-s例程
替代 NSLocalizedString 的例程。例如,-s MyLocalString 将捕获对 MyLocalString 和 MyLocalStringFromTable 的调用。
所以我认为你可以尝试:
生成字符串 -s _
当我的 NSLocalizedString 宏采用 1 个参数而不是 genstrings 期望的 2 个参数时,我遇到了同样的问题,所以我编写了我的 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()
我改进了 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()