我想縮短「NSLocalizedString」爲「_」,所以我使用宏 _(x) NSLocalizedString(@x, @__FILE__)
。genstrings不適用於NSLocalizedString的宏
但是現在,當我想生成與本地化字符串 find . -name \*.m | xargs genstrings
它什麼都不會產生。
任何幫助?
我想縮短「NSLocalizedString」爲「_」,所以我使用宏 _(x) NSLocalizedString(@x, @__FILE__)
。genstrings不適用於NSLocalizedString的宏
但是現在,當我想生成與本地化字符串 find . -name \*.m | xargs genstrings
它什麼都不會產生。
任何幫助?
您可以使用選項genstrings
。從man page:
-s爲NSLocalizedString 常規
替代程序。例如,-s MyLocalString將捕獲對MyLocalString和MyLocalStringFromTable的調用。
所以我認爲你可以嘗試:
genstrings -s _
我有同樣的問題,當我NSLocalizedString宏正在採取1個論點,而不是像2預計genstrings,所以我寫了我的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()
你可以告訴genstrings使用「-s」參數來尋找不同的功能:
genstring -s MyFunctionName ....
然而,MyFunctionName必須遵循相同的命名和參數約定的一個內置NSLocalizeString宏。
在你的情況下,你不能只指定字符串鍵,你還必須指定文檔字符串。事實上,你應該永遠不會生成一個沒有字符串和文檔的字符串文件。有許多語言的實際短語或單詞將取決於上下文。德語是一個很好的例子,汽車是「das汽車」,不止一個是「汽車死亡」。還有更多的例子包括性別,數量,時間,問題與聲明的變化,以及是與否。文檔字符串可幫助您的翻譯員找出要使用的翻譯。
此外,最佳做法是使用與母語不同的單詞。這就是說使用NSLocalizedStringWithDefaultValue(key,table,bundle,val,comment)。 您可以爲表參數指定nil,併爲bundle參數指定[NSBundle mainBundle]。
你可以用簡寫的方式來包裝它,但你仍然需要遵循StringWithDefaultValue的名字和參數來使genstrings起作用。
我強烈建議您查看關於本地化技巧和技巧的WWDC 2012會話。
莫里斯
這真的很蹩腳,我們不能將默認值傳遞給事物(比如捆綁包)並且使用一個帶有起始位置的短手宏 – jmstone617
我已改善或阿爾貝爾的腳本,包括那裏的多個在同一行宏調用的情況:
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()
了:***終止應用程序由於未捕獲的異常「NSRangeException」 ,原因:'*** - [NSCFString characterAtIndex:]:範圍或索引超出範圍' – user500
這不太可能工作,因爲_將出現在代碼中不是NSLocalizedString調用的負載中。你必須選擇一個更加獨特的宏名稱,比如_LS。如果你的宏不像標準的NSLocalizedString函數那樣有兩個參數,它也可能不起作用,但你必須自己嘗試。 –