genstrings не работает с макросом для NSLocalizedString - PullRequest
2 голосов
/ 20 января 2012

Я хотел бы сократить "NSLocalizedString" до "_", поэтому я использую макрос _(x) NSLocalizedString(@x, @__FILE__).

Но теперь, когда я хочу сгенерировать строки для локализации с find . -name \*.m | xargs genstrings, он ничего не генерирует.

Любая помощь?

Ответы [ 4 ]

4 голосов
/ 10 декабря 2012

Вы можете указать genstrings для поиска другой функции, используя аргумент '-s':

genstring -s MyFunctionName ....

Однако , MyFunctionName должен следовать тем же соглашениям об именах и аргументах, что и одинвстроенных макросов NSLocalizeString.

В вашем случае вы не можете просто указать ключ строки, вы также должны указать строку документации.Фактически, вы должны никогда генерировать файл строк без строки и документации.Есть много языков, где фактическая фраза или слово будут зависеть от контекста.Немецкий пример - отличный пример, когда автомобиль - это «das auto», а больше - «die autos».Есть еще много примеров, которые включают изменения по полу, количеству, времени, вопросу и утверждению, и да, а не нет.Строка документации помогает вашему переводчику выяснить, какой перевод использовать.

Кроме того, рекомендуется использовать ключ, отличный от слова на родном языке.Это говорит использовать NSLocalizedStringWithDefaultValue (ключ, таблица, пакет, val, комментарий).Вы можете указать nil для таблицы и [NSBundle mainBundle] для аргумента пакета.

Вы можете заключить это в сокращение, но вы все равно должны следовать имени StringWithDefaultValue и аргументам для работы genstrings.*

Я настоятельно рекомендую вам взглянуть на сессию WWDC 2012 "Советы и хитрости по локализации".

Морис

3 голосов
/ 20 января 2012

Вы можете использовать опцию -s genstrings.Из справочной страницы :

-s рутина
Заменяет рутину для NSLocalizedString.Например, -s MyLocalString будет перехватывать вызовы MyLocalString и MyLocalStringFromTable.

Поэтому я думаю, что вы можете попробовать:

genstrings -s _

2 голосов
/ 11 ноября 2012

У меня была такая же проблема, когда мой макрос 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 голосов
/ 11 сентября 2014

Я улучшил сценарий 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...