2

「NSLocalizedString」を「_」に短縮したいので、マクロを使用してい _(x) NSLocalizedString(@x, @__FILE__) ます。

しかし今、ローカライズ用の文字列を生成したいとき、 find . -name \*.m | xargs genstrings それは何も生成しません。

何か助けはありますか?

4

4 に答える 4

4

「-s」引数を使用して、別の関数を探すように genstrings に指示できます。

genstring -s MyFunctionName ....

ただし、MyFunctionName は、組み込みの NSLocalizeString マクロの 1 つと同じ命名規則と引数規則に従う必要があります。

あなたの場合、文字列キーを指定するだけでなく、ドキュメント文字列も指定する必要があります。実際、文字列とドキュメントの両方が含まれていない文字列ファイルを生成するべきではありません。実際のフレーズや単語が文脈に依存する言語はたくさんあります。ドイツ語は、車が「das auto」で複数の車が「die autos」である良い例です。性別、数、時間、質問対ステートメント、はい対いいえの変更など、さらに多くの例があります。ドキュメンテーション文字列は、翻訳者がどの翻訳を使用するかを判断するのに役立ちます。

さらに、ベスト プラクティスは、母国語の単語とは異なるキーを使用することです。つまり、NSLocalizedStringWithDefaultValue(key, table, bundle, val, comment) を使用します。テーブルに nil を指定し、バンドル引数に [NSBundle mainBundle] を指定できます。

これを短縮形でラップすることはできますが、それでも、StringWithDefaultValue の名前と、genstring が機能するための引数に従う必要があります。

ローカリゼーションのヒントとコツに関する WWDC 2012 セッションをご覧になることを強くお勧めします。

モーリス

于 2012-12-10T02:47:01.627 に答える
3

-sのオプションを使用できますgenstringsマニュアルページから:

-sroutineNSLocalizedStringの代わりにルーチン
を使用します。たとえば、-s MyLocalStringは、MyLocalStringおよびMyLocalStringFromTableへの呼び出しをキャッチします。

だから私はあなたが試すことができると思います:

genstrings -s _

于 2012-01-20T13:17:31.073 に答える
2

私の NSLocalizedString マクロが genstrings が期待するように 2 つではなく 1 つの引数を取っていたとき、私は同じ問題を抱えていたので、仕事をする 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()
于 2012-11-11T12:11:26.003 に答える
0

Or Arbel のスクリプトを改善して、1 行に複数のマクロ呼び出しがある場合を含めました。

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 に答える