printf还有其他选择吗?

ere*_*eOn 21 c c++ linux printf translation

我必须创建一个必须在几个*nix平台(Linux,AIX,...)上运行的软件.

我需要处理国际化,我的翻译字符串采用以下形式:

"Hi %1, you are %2." // English
"Vous êtes %2, bonjour %1 !" // French
Run Code Online (Sandbox Code Playgroud)

这里%1代表名称,%2换句话说.我可以改变格式,这不是问题.

我尝试使用printf()但你不能指定参数的顺序,你只需指定它们的类型.

"Hi %s, you are %s"
"Vous êtes %s, bonjour %s !"
Run Code Online (Sandbox Code Playgroud)

现在无法知道用于替换的参数%s:printf()只使用第一个参数,然后使用下一个参数.

有什么替代方案printf()吗?

注意:gettext()不是一个选项.

pax*_*blo 26

我并不是要成为坏消息的承载者,但你提出的建议实际上是一个坏主意.我为一家非常认真对待i18n的公司工作,我们已经(痛苦地)发现你不能将单词插入这样的句子中,因为它们通常没有任何意义.

我们所做的只是简单地将错误文本与变量位完全断开,以避免这些问题.例如,我们将生成错误:

XYZ-E-1002 Frobozz not configured for multiple zorkmids (F22, 7).
Run Code Online (Sandbox Code Playgroud)

然后,在错误的描述,你的国家,只是在末尾的括号中的两个数值均在Frobozz标识符和zorkmids的数量,您试图造成就可以了.

这使得国际化翻译作为一个非常容易的事,因为你有,在翻译时,所有你需要,而不必担心变位是否应该是单数还是复数,男性或女性,第一,第二或第三变格的语言元素(无论哎,这实际上意味着).

翻译团队只需要进行转换"Frobozz not configured for multiple zorkmids",这样就容易多了.


对于那些想要看到一个具体例子的人,我从我们的翻译书中得到了一些东西(有足够的东西改变以保护有罪).

在某些时候,有人提交了以下内容:

The {name} {object} is invalid
Run Code Online (Sandbox Code Playgroud)

其中{name}是对象的名称(客户,订单等),并且{object}是对象类型本身(表,文件,文档,存储过程等).

简单到英语,开发人员的主要(可能是唯一的)语言,但在翻译成德语/瑞士德语时遇到了问题.

虽然"客户文档"正确地(在位置意义上)翻译Kundendokument,但格式字符串在两个单词之间有空格的事实是一个问题.这基本上是因为开发人员试图让句子听起来更自然,但不幸的是,根据他们有限的经验,这只是更自然.

一个更大的问题是"客户存储过程",它gespeichertes Verfahren der Kunden实际上变成了"客户的存储过程".虽然德国客户可能放了一个空间Kunden dokument,有没有办法征收gespeichertes Verfahren der Kunden{name} {object}成功.

现在你可能会说一个更聪明的格式字符串会解决这个问题,但有几个原因会导致错误:

  • 这是一个非常简单的例子,可能会有其他更复杂的东西(我试着得到一些例子,但我们的翻译人员已经明确表示他们有更紧迫的工作,而不是自己提出我的每一个心血来潮).
  • 格式字符串的重点是外部化翻译.如果格式字符串本身特定于翻译目标,则通过外部化文本获得的收益很少.
  • 开发人员不应该关心格式字符串{possible-pre-adjectives} {possible-pre-owner} {object} {possible-post-adjectives} {possible-post-owner} {possible-postowner-adjectives}.这是翻译团队的工作,因为他们了解细微差别.

请注意,引入断开连接可以很好地回避这个问题:

The object specified by <parameter 1>, of type <parameter 2>, is invalid.
    Parameter 1 = {name}.
    Parameter 2 = {object}.
Der sache nannte <parameter 1>, dessen art <parameter 2> ist, ist falsch. 
    Parameter 1 = {name}.
    Parameter 2 = {object}.

最后一次翻译是我的翻译之一,请不要用它来质疑翻译人员的质量.毫无疑问,更流利的德语演讲者会从中获得好笑.

  • @Konrad Rudolph:语法对象分为两种语言而不是另一种语言的任何情况.例如,考虑`printf("我知道",iKnow?"":"不要");`"我知道"和"我不知道"的法语等同于"Je sais"和"Je" ne sais pas".否定将不适合适用于英语的模板. (2认同)
  • @Konrad:一个更常见的问题是,会说英语的幼稚的人会创建模板“%d%s%s挂在墙上”,其预期值包括绿色/蓝色/粉红色和瓶子/大象( s)。但是您发现,为了定位第二个参数,您需要知道第三个参数的性别。两者都是“单个实词”,但它们的独立性还不足以单独插入,即使是英文,插入的词也取决于%d的值。有时您只能在句子中插入一个“事物”,并且翻译需要比`printf`更聪明。 (2认同)

Ign*_*ams 25

POSIX printf()支持位置参数.

printf("Hi %1$s, you are %2$s.", name, status);
printf("Vous êtes %2$s, bonjour %1$s !", name, status);
Run Code Online (Sandbox Code Playgroud)


Vin*_*enz 11

boost.format支持这种方式就像在python中一样,但这适用于C++


Dav*_*nch 9

您需要大多数Unix系统常见的%n $ s扩展名.

"Hi %1$s, you are %2$s."
Run Code Online (Sandbox Code Playgroud)

请参见底部printf的德语示例

关心DaveF