2012-01-20 62 views
2

我想縮短「NSLocalizedString」爲「_」,所以我使用宏 _(x) NSLocalizedString(@x, @__FILE__)genstrings不適用於NSLocalizedString的宏

但是現在,當我想生成與本地化字符串 find . -name \*.m | xargs genstrings 它什麼都不會產生。

任何幫助?

回答

3

您可以使用選項genstrings。從man page

-s爲NSLocalizedString 常規
替代程序。例如,-s MyLocalString將捕獲對MyLocalString和MyLocalStringFromTable的調用。

所以我認爲你可以嘗試:

genstrings -s _

+0

了:***終止應用程序由於未捕獲的異常「NSRangeException」 ,原因:'*** - [NSCFString characterAtIndex:]:範圍或索引超出範圍' – user500

+0

這不太可能工作,因爲_將出現在代碼中不是NSLocalizedString調用的負載中。你必須選擇一個更加獨特的宏名稱,比如_LS。如果你的宏不像標準的NSLocalizedString函數那樣有兩個參數,它也可能不起作用,但你必須自己嘗試。 –

2

我有同樣的問題,當我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() 
+0

雖然莫里斯是對的,但對我來說,這個人很有用。 – Lifely

+0

請參閱我對此腳本改進版本的回答。 :) – ullstrm

4

你可以告訴genstrings使用「-s」參數來尋找不同的功能:

genstring -s MyFunctionName .... 

然而,MyFunctionName必須遵循相同的命名和參數約定的一個內置NSLocalizeString宏。

在你的情況下,你不能只指定字符串鍵,你還必須指定文檔字符串。事實上,你應該永遠不會生成一個沒有字符串和文檔的字符串文件。有許多語言的實際短語或單詞將取決於上下文。德語是一個很好的例子,汽車是「das汽車」,不止一個是「汽車死亡」。還有更多的例子包括性別,數量,時間,問題與聲明的變化,以及是與否。文檔字符串可幫助您的翻譯員找出要使用的翻譯。

此外,最佳做法是使用與母語不同的單詞。這就是說使用NSLocalizedStringWithDefaultValue(key,table,bundle,val,comment)。 您可以爲表參數指定nil,併爲bundle參數指定[NSBundle mainBundle]。

你可以用簡寫的方式來包裝它,但你仍然需要遵循StringWithDefaultValue的名字和參數來使genstrings起作用。

我強烈建議您查看關於本地化技巧和技巧的WWDC 2012會話。

莫里斯

+0

這真的很蹩腳,我們不能將默認值傳遞給事物(比如捆綁包)並且使用一個帶有起始位置的短手宏 – jmstone617

0

我已改善或阿爾貝爾的腳本,包括那裏的多個在同一行宏調用的情況:

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() 
相關問題