在云端共享 iOS 和 Android 之间的本地化

Posted

技术标签:

【中文标题】在云端共享 iOS 和 Android 之间的本地化【英文标题】:Share localization between iOS and Android on the cloud 【发布时间】:2018-08-23 03:56:55 【问题描述】:

我有一个支持 +5 语言的 iosandroid 应用程序,所以我认为如果我可以将本地化的字符串文件放在服务器上,一旦用户打开应用程序,我会下载文件并将其加载到应用程序。

目前的挑战在于 iOS,因为我需要从我的 XIB 和 Storyboard 文件中引用所有标签、按钮 .... 等,以便能够将相应的文本/占位符分配给所有 UI 元素。

任何关于在服务器上执行类似一个文件的方法/技术/想法,其中包含两个平台的本地化并且易于实施,因为该应用已达到 50 多个屏幕。

【问题讨论】:

考虑到objective-c和java之间的字符串格式说明符的区别,至少在翻译文本中需要一个类型映射器。 如果您坚持可互操作的模式并注意误报,类型映射非常容易。我有implemented this myself。很乐意充实到一个完整的答案,除非我可能会因为宣传我自己的产品而被标记。 【参考方案1】:

我既不是 Android 开发者也不是 iOS 开发者,但我有做这部分文件转换部分的经验。

方法/技术/理念

毫无疑问,您正在寻找一种产品来完成繁重的工作,但我会尝试回答您的问题,就好像您自己动手一样。

编写一个从 iOS 到 Android 字符串(或反之亦然)的文件转换器并不难,但真正的挑战是如何管理工作流程以及如何保持在两个平台上都适用的通用功能支持基础。

假设您的流程首先从您的 iOS 代码库中提取可翻译字符串,让我们从您可用的可翻译文件格式开始。

Xcode 支持 XLIFF 1.2,它是一个 ISO standard,并被各种翻译产品和翻译行业专业人士使用。这将是在您的工作流程中使用的一种合理的“源”格式。即将您的字符串导出到 XLIFF 文件并翻译它们。然后你可以很容易地用这些文件做很多事情。即导入回 Xcode 并转换为 Android XML 文件。

转化

从您翻译的 XLIFF 文件中,您可以生成一组 Android strings.xml 文件。编写转换器并不是特别难,但这取决于您需要哪些功能。在最简单的例子中,您将从 XLIFF 中提取一组键/值对并将它们呈现为 Android 字符串。

以下(简化的)Xcode 风格的 XLIFF:

    <xliff version="1.2">
        <file source-language="en">
            <body>
                <trans-unit id="foo-message">
                    <source>Foo</source>
                </trans-unit>
            </body>
        </file>
    </xliff>

相当于下面的Android strings.xml

    <resources>
        <string name="foo-message">Foo</string>
    </resource>

我这里没有包含任何代码。如果您的首选语言支持 XML 解析,那么提取 "foo-message": "Foo" 并将其呈现出来并不是什么大问题。

请注意,您翻译的 XLIFF 文件看起来会有些不同。您将取出 &lt;target&gt; 元素而不是 &lt;source&gt;

类型映射

正如 cmets 中已经提到的,您需要将格式化字符串转换为 "%@" 变为 "%s" 等等。这可以使用 RegExp 完成,但复杂性再次取决于您需要支持的范围。例如,您可以只使用字符串/对象占位符,还是使用浮点精度或自定义填充字符等花哨的东西?尽可能避免使用它们会使转换更容易。

可翻译的字符串往往不使用 printf 语法的全部功能,因此您可以使用仅查找 "%@" 符号的基本 RegExp 替换来摆脱困境。需要注意的一件事是在 Android 中必须对多个参数进行编号。 ("%@ %@" 必须变为 "%1$s %2$s")。您可以通过始终使用源格式中的参数编号来避免这种头痛。 (我相信 "%1$@ %2$@" 在 Objective C 中是合法的,但我不是 iOS 开发者)。

注意像"20% off" 这样的误报(这实际上是一个空格填充的八进制"% o")。在 Android 中,您可以将 XML 字符串元素标记为 formatted="false",但不确定在 iOS 中如何标记。

复数形式

这是我遇到的最棘手的问题。虽然这两种格式都支持复数形式,但 iOS 有点像噩梦。

Android 很整洁:

    <resources>
        <plurals name="apple">
            <item quantity="one">1 apple</item>
            <item quantity="other">%d apples</item>
        </plurals>
    </resources>

但是 XLIFF 没有 native 对复数变体的支持,因此 Xcode 风格的 XLIFF 中的等价物要复杂得多。最近添加到 Xcode 的支持为每个“数量”使用单独的翻译单元。它们位于映射到.stringsdict file 的&lt;file&gt; 块中。这里就不多说了。

云托管

我无法建议如何最好地从远程存储的文件中动态加载翻译,但我会考虑您是否希望您的应用在离线时不可用,也许更重要的是您是否要引入外部依赖项。

我可以看到无需发布应用程序的新版本即可更新翻译的优势,但 Xcode 的导入功能似乎可以解决很多繁重的工作,尤其是在涉及复数形式时。它还省去了将新的源字符串合并到翻译文件中的麻烦。对我来说,编译它们是有意义的,但是我从来没有经历过 Apple 的审批流程 :)

【讨论】:

【参考方案2】:

您可以将 Applanga 用于此类工作。

【讨论】:

更多评论

以上是关于在云端共享 iOS 和 Android 之间的本地化的主要内容,如果未能解决你的问题,请参考以下文章

可以在firebase中的ios和android项目之间共享用户进行身份验证

共享邮箱列表本地与云端不一致的问题

iOS 钥匙串在设备之间共享数据

让资源在云端和本地自由流动

在云端开发,但通过远程桌面通过 USB 在本地设备上调试 Android 应用程序

在设备之间共享 iOS sqlite 数据库的最佳方式是啥