【问题标题】:Overwrite output filename of xgettext覆盖 xgettext 的输出文件名
【发布时间】:2017-06-08 15:17:10
【问题描述】:

我将xgettext 与标准输入一起使用,因为该输入在文件中不可用。但是,我希望它输出一个我指定为每个字符串上方的注释的文件名。

当前行为

#: Standardinput:13
msgid "User"
msgstr ""

#: Standardinput:13
msgid "Invite"
msgstr ""

#: Standardinput:14
msgid "Group"
msgstr ""

预期行为

如果我可以将文件名设置为path/to/file.txt,它应该改为输出:

#: path/to/file.txt:13
msgid "User"
msgstr ""

#: path/to/file.txt:13
msgid "Invite"
msgstr ""

#: path/to/file.txt:14
msgid "Group"
msgstr ""

我阅读了可以在docs 中设置的所有选项,但一无所获。

【问题讨论】:

    标签: gettext xgettext


    【解决方案1】:

    #: path/to/file.txt:14 文本称为“位置”,您对它的最大控制是--no-location--add-location 标志。源代码原因见xgettext.c:xgettext_open()

    同时,显而易见的做法是从标准输入获取输入,将输出通过管道传输到标准输出,手动替换,然后存储在目标 PO 文件中。示例:

    xgettext -k_ -Lc -o- - < hello.c \
        | sed 's@#: standard input:@#: path/to/file.c:@g' \
        > messages.po
    

    显然更改 sed 调用中的模式以匹配您的 xgettext 格式和您要表示的文件。

    不太明显的是将标准符号链接到一个看起来像您的目标的文件名。示例:

    $ ln -s /dev/stdin file.c
    $ echo 'int main() { printf(gettext("Hello World\n")); return 0; }' \
          | xgettext --omit-header -o- file.c
    #: file.c:1
    #, c-format
    msgid "Hello World\n"
    msgstr ""
    

    能够为输出目的命名文件,当输入是标准输入时,这似乎是一个合理的功能。我建议向 GNU 提出请求。

    【讨论】:

    • 是的,如果没有内置解决方案,我想尝试替换输出。我实际上是从 webpack 加载器调用它,所以我不需要使用 sed 但感谢这个例子:)
    • 在源代码中进一步挖掘并确认没有 CLI 选项。但是,如果您不喜欢正则表达式替换,则提供了一种替代方法。
    • 感谢您为我浏览源代码!符号链接解决方案在我的情况下听起来可能会更好一些,因为我还使用 --join-existing 选项将所有消息放在同一个 .po 文件中。之后手动替换输出意味着我必须手动合并每个源文件的输出。我还将提交功能请求。
    猜你喜欢
    • 1970-01-01
    • 2016-02-13
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 2018-08-20
    • 2015-03-14
    相关资源
    最近更新 更多