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
Я не совсем уверен в этом последнем бите, вы можете увидеть здесь для более подробной информации:)