xgettext из CSV-файла

У меня есть CSV со всеми значениями для перевода... Я хочу прочитать файл CSV и создать файл.pot, но когда я загружаю и пытаюсь вызвать print _(значение), не создается.pot. Не уверен, почему вы не можете создать файл.pot с динамическим содержимым из CSV.

Вот фрагмент моего кода:

import csv
import gettext

t = gettext.translation('api_trans', '/path/to/locale/', fallback=True)
_ = t.ugettext

string_list = []
with open('/path/to/csv/file') as csvfile:
  reader = csv.reader(csvfile, delimiter=',', quotechar='"')
  for row in reader:
    if row:
        if row[0] != '':
            print _(%row[0])

Когда я запускаю этот скрипт, я вижу все значения в списке, но файл.pot не создается, если я запускаю:

xgettext -d api_trans -o api_trans.pot api_trans.py 

Определение действительной строки в сравнении с переменной со строковым значением (например, print _('hello')) работает... любая помощь будет принята с благодарностью.

1 ответ

Решение

Это происходит потому, что xgettext на самом деле не выполняет ваш файл Python, но читает как обычный текст и пытается определить строки, которые должны быть переведены. Как вы добавляете _(varaible) и не _("literal string that xgettext understands"), он не распознает его как текст, который должен быть переведен.

Чтобы это произошло, самый прямой способ, которым я могу придумать, - это создание фиктивного файла, к которому вы будете передавать xgettext, который будет содержать все фактические значения. Теперь, учитывая, что ваш CSV-файл не очень большой, вы можете попытаться сгенерировать файл, который будет содержать строку, аналогичную print _("the value of the thing you want to translate") и это будет понятно xgettext, Конечно, это не самый оптимальный путь, но он самый простой, не беспокоясь о разборе.

import csv
import gettext

t = gettext.translation('api_trans', '/path/to/locale/', fallback=True)
_ = t.ugettext

string_list = []
with open('/path/to/csv/file') as csvfile:
  with open('/path/to/some/other/file', 'w') as out:
    reader = csv.reader(csvfile, delimiter=',', quotechar='"')
    for row in reader:
      if row:
          if row[0] != '':
              out.write("print _(%s)\n" % (repr(row[0],))

Тогда вы выполните xgettext -d api_trans -o api_trans.pot /path/to/that/file,

Опять же, это неоптимально. Возможно, вы захотите заглянуть в Вавилон и найти более эффективное решение, я тоже посмотрю на это.

Вот что я получил от использования Babel:

def extract_csv(fileobj, keywords, comment_tags, options):
    """Extract messages from XXX files.
    :param fileobj: the file-like object the messages should be extracted
                    from
    :param keywords: a list of keywords (i.e. function names) that should
                     be recognized as translation functions
    :param comment_tags: a list of translator tags to search for and
                         include in the results
    :param options: a dictionary of additional options (optional)
    :return: an iterator over ``(lineno, funcname, message, comments)``
             tuples
    :rtype: ``iterator``
    """
    import csv

    reader = csv.reader(fileobj, delimiter=',', quotechar='"')
    for row in reader:
        if row and row[0] != '':
            yield (lineno, ',', row[0], 'No comment')

Тогда вам нужно будет включить его в качестве метода извлечения. Самый простой способ - иметь его в упаковке в PYTHONPATH и используйте его следующим образом:

# Some custom extraction method
[extractors]
csv = mypackage.module:extract_csv
[csv: **.ctm]
some_option = foo

Я не совсем уверен в этом последнем бите, вы можете увидеть здесь для более подробной информации:)

Другие вопросы по тегам