0

我有一个包含所有要翻译的值的 csv...我想读取 csv 文件并生成一个 .pot 文件,但是当我加载并尝试调用 print _(value) 时,没有生成 .pot。不知道为什么不能从 csv 生成包含动态内容的 .pot 文件。

这是我的代码片段:

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'))确实有效......任何帮助将不胜感激。

4

1 回答 1

0

发生这种情况的原因是因为xgettext它实际上并没有执行您的 Python 文件,而是读取为纯文本并尝试识别必须翻译的字符串。当您添加 a_(varaible)而 not_("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并提出更有效的解决方案,我也会研究它。

这就是我使用 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

我不完全确定最后一点,您可以在此处查看更多详细信息:)

于 2013-01-07T20:56:48.940 回答