19

Ours 是一个由志愿者本地化的开源 Mac 应用程序。这些志愿者将在软件的特殊本地化版本(带有未剥离的 nib)上完成他们的工作,然后将更改发送给我们以集成到原始 xib 和字符串文件中。

问题是,虽然有一种方法可以集成字符串更改而不会消除以前的大小更改,但我看不到一种集成新字符串和大小更改的方法(就像我们添加或替换视图时一样)。

我能看到的唯一方法是让本地化人员直接使用原始 xib 并将差异发送给我们。这意味着他们必须下载整个源代码,而不仅仅是一个可本地化的版本,在 Xcode 和 IB 中工作,或者自己运行 diff 命令(每个 xib)或者安装和使用 Mercurial。

基于 xib 的应用程序有更好的方法吗?

4

4 回答 4

33

2014 年 1 月更新:Apple 的“自动布局”代码与他们的“基本”本地化内容相结合,吸收了我的大部分想法并对其进行了改进。我建议不要使用我在这个答案中谈到的旧工具。但是,我也是对的!


我强烈强烈建议不要在本地化中更改框架。我知道这与 Apple 的建议背道而驰,但是允许帧更改存在很多问题 - 你最终会遇到十亿个边缘情况。

假设您的应用中有 10 个 XIB,并且支持 12 种语言。现在,您可以支持 120 种不同的布局。你不能这样做。

更改字符串,将视图留在原处。如果需要,可以在所有语言中让它们变得更大。听起来这不应该工作,但确实如此。(我用一个以这种方式本地化了大约 10 种语言的应用程序赢得了三项 Apple 设计奖。)

规格:

  • 对于单选框和复选框,只需让它们向右延伸很远,超过最后一个英文字符。这也为不精确的鼠标提供了一个很好的大着陆区。

  • 对于按钮,无论如何它们都应该是宽的,因为将文本挤在按钮中间看起来不太好。

  • 对于 tableview 列上的标题,如果需要,您应该在加载它们时自动调整大小。

  • 对于解释性文本,你应该在右边有一些额外的空间,也许还有一个额外的行。它只是让英文版的 XIB 看起来不那么混乱。当然,德国人会看到更严格的 XIB,但是,嘿,他们是德国人——他们可能已经习惯了。甚至可能有一个德语单词。“Deutscheninterfakkenclutterlongen。”

  • 如果文本字段居中,只需在两侧添加相等的空间。没有理由不这样做。

我已经将它与从我的 XIB 中提取所有字符串并将它们放入 .strings 文件中的脚本相结合,然后在运行时动态地将字符串放回原处,因此任何人都可以在没有任何特殊工具的情况下本地化我的应用程序。只需放入一堆 .strings 文件并运行它!

包含完整来源的博客文章:[迷失在翻译中]¹。

于 2009-10-02T09:38:57.830 回答
3

在我以前工作的地方,我们也遇到了这个问题。我们的应用程序被翻译成 10 种不同的语言。

起初,我们尝试按照 Wil 的建议去做,那就是让一切都变得超宽并适合每种语言。不幸的是,“在线备份”在英语中可能很短,但在其他语言(尤其是西班牙语)中,它真的很长(“copia de seguridad”只是意味着“备份”)。扩大我们的 UI 让一切看起来都非常糟糕。

有一天,我在玩一些 Core Animation 的东西并发现了这CAConstraint门课。 CAConstraint基本上是定义两者之间的布局关系的一种方式CALayers。你给一个层起一个名字(比如“layerA”),然后说“layerB [以这样那样的方式] 被约束到名为 layerA 的同级层”。然后,每当命名图层layerA被重新定位或调整大小时,layerB它也会自动移动。它真的很整洁,这正是我们想要的。

经过几天的工作,我想出了现在的样子CHLayoutManager。它基本上是CAConstraint和朋友的翻拍,但对于NSViews. 这是它如何工作的一个简单示例:

CHLayoutConstraint * centerHorizontal = [CHLayoutConstraint constraintWithAttribute:CHLayoutConstraintAttributeMidX relativeTo:@"superview" attribute:CHLayoutConstraintAttributeMidX];
CHLayoutConstraint * centerVertical = [CHLayoutConstraint constraintWithAttribute:CHLayoutConstraintAttributeMidY relativeTo:@"superview" attribute:CHLayoutConstraintAttributeMidY];
[aView addConstraint:centerHorizontal];
[aView addConstraint:centerVertical];

aView无论超级视图如何调整大小,这将保持在其超级视图的中心。这是另一个:

[button1 setLayoutName:@"button1"];
[button2 addConstraint:[CHLayoutConstraint constraintWithAttribute:CHLayoutConstraintAttributeMinX relativeTo:@"button1" attribute:CHLayoutConstraintAttributeMaxX]];
[button2 addConstraint:[CHLayoutConstraint constraintWithAttribute:CHLayoutConstraintAttributeMaxY relativeTo:@"button1" attribute:CHLayoutConstraintAttributeMaxY]];
[button2 addConstraint:[CHLayoutConstraint constraintWithAttribute:CHLayoutConstraintAttributeWidth relativeTo:@"button1" attribute:CHLayoutConstraintAttributeWidth]];

这将保持button2锚定到 的右边缘button1,并保持button2's 的 Y 位置和宽度与button1's 相同。

在内部,CHLayoutManager使用一个NSValueTransformer计算新的定位信息。一些CHLayoutConstraint初始化程序接受NSValueTransformer,因此您可以创建任意复杂的布局操作。

我们使用它来约束和布局整个 UI,然后在代码中进行所有本地化(然后调用-sizeToFit,并进行一些修改)。我们的 UI 将流入其最终布局。事实证明这非常方便。我们只需打包我们的.strings文件,将它们发送给翻译人员,然后在我们取回它们时将它们放到适当的位置,我们的应用程序将立即针对该语言进行本地化。

CHLayoutManager并不完美。它不能解决冲突,而只是按照添加的顺序应用约束。所以你可以用 42 种不同的方式来约束(例如)MinX一个视图,但只会使用最后一种。此外,如果您约束 MinX 和 MaxX,它们也将按照添加的顺序应用,并且最终不会拉伸或缩小宽度。换句话说,约束视图的一个属性不会影响其他属性。它与 10.5+(GC 和非)兼容。然而,由于 Lion 的一些变化,我不太可能解决这些缺点。

尽管有这些缺点,但它是一个非常灵活的框架,并且(IMO)一些非常漂亮的代码。(另外,我调酒-[NSView dealloc]!耶!)


更新

现在 AppKit 具有相同的功能(通过NSLayoutConstraint),我建议使用该系统而不是CHLayoutManager. 它更加健壮。

于 2011-04-06T04:36:21.237 回答
3

我承认我对本地化 Mac 应用程序的过程并不十分熟悉。但我确实遇到了一个脚本,它是Three20 iPhone 库的一部分,它看起来可能很有用:diffstrings.py是一个 Python 脚本,它“将您的主要语言环境与所有其他语言环境进行比较,以帮助您确定需要哪些新字符串已翻译。它输出可翻译的 XML 文件,然后合并回您的字符串文件。”

编辑:作为Wil Shipley对这个问题的回答的补充,我将添加一个指向他刚刚写的博客文章的链接,该文章详细介绍了本地化,并提供了一些他为简化流程而构建的工具。

于 2009-09-30T03:26:58.467 回答
0

请记住,XIB 文件只是一种模糊格式的 XML 文件,因此您可以很容易地翻译这些文件,前提是您首先可以找到要翻译的字符串。例如,下面的代码片段创建了一个名为 Jenson 的按钮:

<object class="NSButtonCell" key="NSCell" id="41219959">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">134217728</int>
<string key="NSContents">Jenson</string>
...
</object>

因此,您可以翻译该字符串,然后用您翻译的值替换 XIB 中出现的字符串。为了验证它是否按预期工作,您可以将语言更改为使用随机键(如 BUTTON_TITLE),这样在丢失时更容易发现。

但是,项目的位置/大小是固定的,因此您的标题可能会溢出以不同语言给出的空间。这就是为什么 Mac 对每种语言都有单独的 XIB 文件的原因之一,以允许在每种语言的基础上进行调整,无论维护起来多么困难。

于 2009-09-30T22:47:39.697 回答