对于NSLocalizedString,genstrings不适用于宏

时间:2012-01-20 13:09:04

标签: iphone ios nslocalizedstring genstrings

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

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

任何帮助?

4 个答案:

答案 0 :(得分:4)

您可以通过使用'-s'参数告诉g​​enstrings寻找不同的函数:

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()