2

我想将 "NSLocalizedString" 缩短为 "_" 所以我正在使用 macro _(x) NSLocalizedString(@x, @__FILE__)

但是现在,当我想生成用于本地化的字符串时, find . -name \*.m | xargs genstrings 它什么也不会产生。

有什么帮助吗?

4

4 回答 4

4

您可以使用 '-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 会议。

莫里斯

于 2012-12-10T02:47:01.627 回答
3

您可以使用 的-s选项genstrings。从手册页

-s例程
替代 NSLocalizedString 的例程。例如,-s MyLocalString 将捕获对 MyLocalString 和 MyLocalStringFromTable 的调用。

所以我认为你可以尝试:

生成字符串 -s _

于 2012-01-20T13:17:31.073 回答
2

当我的 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()
于 2012-11-11T12:11:26.003 回答
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()
于 2014-09-11T15:14:26.447 回答