2012-01-20 2 views
2

"NSLocalizedString"を "_"に短縮してマクロを使用していますので _(x) NSLocalizedString(@x, @__FILE__) です。genstringsはNSLocalizedStringのマクロでは機能しません

しかし、ローカライゼーション用の文字列を生成するときに、 find . -name \*.m | xargs genstrings を入力すると、何も生成されません。

助けが必要ですか?

答えて

3

-sオプションをgenstringsとすることができます。 man pageから:

NSLocalizedStringためルーチン
代替ルーチンを-s。たとえば、-s MyLocalStringはMyLocalStringとMyLocalStringFromTableの呼び出しをキャッチします。

だから私は、あなたが試みることができると思う:

genstrings -s _

+0

ガット:***キャッチされない例外によりにアプリを終了「NSRangeException」理由: '*** - [NSCFString characterAtIndex:]:範囲外または範囲外のインデックス' – user500

+0

これは、NSLocalizedString呼び出しではないコードの場所に_が表示されるため、動作しそうにありません。 _LSのようなより一意のマクロ名を選択する必要があります。あなたのマクロが標準のNSLocalizedString関数のように2つの引数を取らない場合でも動作しませんが、自分で試してみる必要があります。 –

2

私NSLocalizedStringマクロはそう、1つの引数を取る代わりにgenstringsのような2期待していたとき、私は同じ問題を抱えていました私は仕事をするpythonスクリプトを書いた。

スクリプトの最初の引数はマクロ名で、2番目の引数はプロジェクトへのパスです。

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

モーリスが正しいとはいえ、これは私のために役立った、thx男。 – Lifely

+0

このスクリプトの改善版については私の答えを見てください。 :) – ullstrm

4

あなたは「-s」引数を使って、さまざまな機能を探すためにgenstringsを伝えることができます。

genstring -s MyFunctionName .... 

しかし、MyFunctionNameはの一つとして同じ命名し、引数の規則に従わなければなりませんNSLocalizeStringマクロで構築されています。

あなたの場合、文字列キーだけを指定することはできません。また、ドキュメント文字列も指定する必要があります。実際には、は決して文字列とドキュメントの両方を含まない文字列ファイルを生成する必要があります。実際のフレーズや単語が文脈に依存する多くの言語があります。ドイツ語は、自動車が「das auto」であり、複数が「die autos」である大きな例です。性別、数、時間、質問対声明、賛否の変化を含む多くの例があります。ドキュメンテーション文字列は、翻訳者が使用する翻訳を把握するのに役立ちます。

さらに、母国語とは異なるキーを使用することをお勧めします。それは、NSLocalizedStringWithDefaultValue(key、table、bundle、val、comment)を使用しています。 テーブルにはnil、バンドル引数には[NSBundle mainBundle]を指定できます。

これを省略形で囲むことはできますが、StringWithDefaultValueの名前とgenstringsの引数を使用する必要があります。

ローカリゼーションのヒントとテクニックに関するWWDC 2012セッションをご覧ください。

モーリス

+0

これは本当に残念ですが、バンドルなどのためにデフォルト値を渡すことはできません。 – jmstone617

0
私が改善している

または単一の行に複数のマクロ呼び出しがあります例を含むように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() 
関連する問題