如何将特定上下文分配给 --keyword for proper_name?
How to assign particular context to --keyword for proper_name?
当使用 xgettext tool it is possible to automatically add commenting to assist translators with regards to proper names (as documented).
文档建议在命令行中添加以下内容:
--keyword='proper_name:1,"This is a proper name. See the gettext manual, section Names."'
这导致专有名称被提取到 .pot
文件,如下所示:
#. This is a proper name. See the gettext manual, section Names.
#: ../Foo.cpp:18
msgid "Bob"
msgstr ""
这个问题;是没有为该字符串定义特定的上下文。理想情况下,这是如何提取专有名称的:
#. This is a proper name. See the gettext manual, section Names.
#: ../Foo.cpp:18
msgctxt "Proper Name"
msgid "Bob"
msgstr ""
我尝试了以下但没有成功:
# Hoping that 0 would be the function name 'proper_name'.
--keyword='proper_name:0c,1,"This is a proper name. See the gettext manual, section Names."'
# Hoping that -1 would be the function name 'proper_name'.
--keyword='proper_name:-1c,1,"This is a proper name. See the gettext manual, section Names."'
# Hoping that the string would be used as the context.
--keyword='proper_name:"Proper Name"c,1,"This is a proper name. See the gettext manual, section Names."'
# Hoping that the string would be used as the context.
--keyword='proper_name:c"Proper Name",1,"This is a proper name. See the gettext manual, section Names."'
有没有办法强制将特定 msgctxt
用于所有使用关键字提取的字符串(例如上面示例中的 proper_name
)?
如果没有选项可以按原样使用 xgettext
实现此目的,那么我考虑可能使用以下方法:
--keyword='proper_name:1,"<PROPERNAME>"'
结果为:
#. <PROPERNAME>
#: ../Foo.cpp:18
msgid "Bob"
msgstr ""
那么问题就变成了;如何将生成的 .pot
文件中出现的所有内容自动转换为以下内容:
#. This is a proper name. See the gettext manual, section Names.
#: ../Foo.cpp:18
msgctxt "Proper Name"
msgid "Bob"
msgstr ""
如果要提取消息上下文,它必须是参数列表的一部分。 "Nc" 中的数字部分必须是正整数。抱歉,您对 0、-1 的所有尝试都没有结果。
您的函数签名必须如下所示:
#define PROPER_NAME "Proper Name"
const char *proper_name(const char *ctx, const char *name);
然后这样称呼它:
proper_name(PROPER_NAME, "Bob");
在整个代码中重复 PROPER_NAME,但这是将其放入消息上下文的唯一方法。
可以提交功能请求吗?
还有一种 hack 可以在不更改源代码的情况下实现相同的效果。我假设您使用的是 C 和标准 Makefile(但您可以用其他语言做同样的事情):
将文件 POTFILES
复制到 POTFILES-proper-names
并添加一行 ./proper_names.pot
到 POTFILES.in
。
然后你必须创建proper_names.pot
:
xgettext --files-from=POTFILES-proper-names \
--keyword='' \
--keyword='proper_names:1:"Your comment ..."' \
--output=proper_names.pox
这现在将只包含使用 "proper_names()" 创建的条目。现在添加上下文:
msg-add-content proper_names.pox "Proper Name" >proper_names.pot
rm proper_names.pot
很遗憾,没有名为 "msg-add-content" 的程序。抓住无数的 po-parsers 之一,然后自己写一个(或者在这个 post 的末尾拿我的)。
现在,像往常一样更新您的 PACKAGE.pot
。由于 "proper_names.pox" 是主 xgettext 运行 的输入文件,所有您提取的带有添加上下文的专有名称都会添加到您的 pot 文件中(并且将使用它们的上下文)。
缺少用于将消息上下文添加到 .pot 文件中的所有条目的另一个脚本,请使用此脚本:
#! /usr/bin/env perl
use strict;
use Locale::PO;
die "usage: [=14=] POFILE CONTEXT" unless @ARGV == 2;
my ($input, $context) = @ARGV;
my $entries = Locale::PO->load_file_asarray($input) or die "$input: failure";
foreach my $entry (@$entries) {
$entry->msgctxt($context) unless '""' eq $entry->msgid;
print $entry->dump;
}
您必须为其安装 Perl 库 "Locale::PO",可以使用 "sudo cpan install Locale::PO" 或使用您的供应商可能拥有的预构建版本。
当使用 xgettext tool it is possible to automatically add commenting to assist translators with regards to proper names (as documented).
文档建议在命令行中添加以下内容:
--keyword='proper_name:1,"This is a proper name. See the gettext manual, section Names."'
这导致专有名称被提取到 .pot
文件,如下所示:
#. This is a proper name. See the gettext manual, section Names.
#: ../Foo.cpp:18
msgid "Bob"
msgstr ""
这个问题;是没有为该字符串定义特定的上下文。理想情况下,这是如何提取专有名称的:
#. This is a proper name. See the gettext manual, section Names.
#: ../Foo.cpp:18
msgctxt "Proper Name"
msgid "Bob"
msgstr ""
我尝试了以下但没有成功:
# Hoping that 0 would be the function name 'proper_name'.
--keyword='proper_name:0c,1,"This is a proper name. See the gettext manual, section Names."'
# Hoping that -1 would be the function name 'proper_name'.
--keyword='proper_name:-1c,1,"This is a proper name. See the gettext manual, section Names."'
# Hoping that the string would be used as the context.
--keyword='proper_name:"Proper Name"c,1,"This is a proper name. See the gettext manual, section Names."'
# Hoping that the string would be used as the context.
--keyword='proper_name:c"Proper Name",1,"This is a proper name. See the gettext manual, section Names."'
有没有办法强制将特定 msgctxt
用于所有使用关键字提取的字符串(例如上面示例中的 proper_name
)?
如果没有选项可以按原样使用 xgettext
实现此目的,那么我考虑可能使用以下方法:
--keyword='proper_name:1,"<PROPERNAME>"'
结果为:
#. <PROPERNAME>
#: ../Foo.cpp:18
msgid "Bob"
msgstr ""
那么问题就变成了;如何将生成的 .pot
文件中出现的所有内容自动转换为以下内容:
#. This is a proper name. See the gettext manual, section Names.
#: ../Foo.cpp:18
msgctxt "Proper Name"
msgid "Bob"
msgstr ""
如果要提取消息上下文,它必须是参数列表的一部分。 "Nc" 中的数字部分必须是正整数。抱歉,您对 0、-1 的所有尝试都没有结果。
您的函数签名必须如下所示:
#define PROPER_NAME "Proper Name"
const char *proper_name(const char *ctx, const char *name);
然后这样称呼它:
proper_name(PROPER_NAME, "Bob");
在整个代码中重复 PROPER_NAME,但这是将其放入消息上下文的唯一方法。
可以提交功能请求吗?
还有一种 hack 可以在不更改源代码的情况下实现相同的效果。我假设您使用的是 C 和标准 Makefile(但您可以用其他语言做同样的事情):
将文件 POTFILES
复制到 POTFILES-proper-names
并添加一行 ./proper_names.pot
到 POTFILES.in
。
然后你必须创建proper_names.pot
:
xgettext --files-from=POTFILES-proper-names \
--keyword='' \
--keyword='proper_names:1:"Your comment ..."' \
--output=proper_names.pox
这现在将只包含使用 "proper_names()" 创建的条目。现在添加上下文:
msg-add-content proper_names.pox "Proper Name" >proper_names.pot
rm proper_names.pot
很遗憾,没有名为 "msg-add-content" 的程序。抓住无数的 po-parsers 之一,然后自己写一个(或者在这个 post 的末尾拿我的)。
现在,像往常一样更新您的 PACKAGE.pot
。由于 "proper_names.pox" 是主 xgettext 运行 的输入文件,所有您提取的带有添加上下文的专有名称都会添加到您的 pot 文件中(并且将使用它们的上下文)。
缺少用于将消息上下文添加到 .pot 文件中的所有条目的另一个脚本,请使用此脚本:
#! /usr/bin/env perl
use strict;
use Locale::PO;
die "usage: [=14=] POFILE CONTEXT" unless @ARGV == 2;
my ($input, $context) = @ARGV;
my $entries = Locale::PO->load_file_asarray($input) or die "$input: failure";
foreach my $entry (@$entries) {
$entry->msgctxt($context) unless '""' eq $entry->msgid;
print $entry->dump;
}
您必须为其安装 Perl 库 "Locale::PO",可以使用 "sudo cpan install Locale::PO" 或使用您的供应商可能拥有的预构建版本。