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}.
最后一次翻译是我的翻译之一,请不要用它来质疑翻译人员的质量.毫无疑问,更流利的德语演讲者会从中获得好笑.
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)
您需要大多数Unix系统常见的%n $ s扩展名.
"Hi %1$s, you are %2$s."
Run Code Online (Sandbox Code Playgroud)
请参见底部printf的德语示例
关心DaveF