为什么通常将字符串资源保留在代码外部而不是代码内部?


18

通常,在许多平台上,我都将字符串资源写入.resx或.xml文件,然后使用某种依赖于平台的方法来获取它们。

也就是说,在iOS上,我通过NSBundle.MainBundleContext.Resources在Android上使用来获取它们。

这种方法的优点是什么,为什么不直接在代码中访问它,例如:

  1. 在跨平台项目中,任何平台都可以直接访问它,而无需集成。

  2. 在构建过程中,无需担心资源是否构建良好。

  3. 编码人员可以使用多种语言处理功能

长话短说:以这种方式构造字符串资源的原因是什么?

[编辑]

假设我的文件是其他项目之间共享的“核心”项目的一部分。(考虑一下PCL跨平台项目文件结构。)

并假设我的文件与.resx / .xml文件完全相似,看起来像这样(我不是xml专业人士,对不起!):参数Paramètres

因此,这基本上是一个自定义xml,您在其中指向键/语言以获取正确的字符串。

该文件将成为应用程序的一部分,就像您在应用程序内添加任何可访问文件一样,并且系统将访问使用PCL编码的字符串资源。这会增加应用程序的开销吗?



6
不,我担心的不是国际化,而是架构和跨平台,抱歉。
莱昂佩尔蒂埃

1
实际上,即使不考虑本地化/国际化问题,这个问题也可以推广到任何种类的资源。将任何类型的资源与代码分开的好处是什么?为什么通常在源中通常不将图像或音频文件编码为二进制字符串?(当然,数据URI确实存在,但是对于大文件来说通常是不切实际的)。其他人已经提供了一些很好的答案,但是我只想指出,用户可读的字符串并不是唯一从外部化中受益的资源类型。
JAB

Answers:


38

本地化和国际化,

将字符串保留在外部可以使它们无需重新编译即可更改(阅读:翻译)(最多只需重新链接,最多只需放入新文件夹)。


谢谢,这次重新链接与重新编译是一个很好的理由。
莱昂佩尔蒂埃

2
仍然是唯一了解此问题的人。
莱昂佩尔蒂埃

3
@ratchetfreak接受时间过早(在数小时之内绝对是很重要的)是一种不好的形式。这很简单,而且很精确,但是……明天(或者下个月)有人可能会提出更好,更完整,更详细的答案。
WernerCD 2014年

3
附加:译者编辑XML文件可能没问题,但永远不要让他们摆弄实际的代码...
Darkhogg 2014年

现在的问题是:“此答案是否仍适用于解释语言?”。我问,因为不会进行任何重新链接或重新编译。
Thomas Eding

10

如果您的文件仅包含字符串资源,则可以将资源文件提供给翻译公司或类似机构,然后进行翻译。我想您可以想象,如果您不得不将大量代码文件提供给外行人员进行一些翻译(除了可能不想将代码分发给任何人),那将有多难。


2
好吧,项目中包含的文件和资源文件之间没有区别。问题不在那里。
莱昂佩尔蒂埃

我说的是直接在代码中包含资源,然后在程序中处理所有内容,因此它对PCL /跨平台友好。
莱昂佩尔蒂埃

2
如果您有一个包含所有字符串资源(字典定义或类似内容)的“代码”文件,并且其中没有其他内容..那么它基本上就是一个资源文件(但仅适用于单个平台,例如android不会)采取任何Objective-C代码)。如果其中包含其他代码,或者将其拆分为多个文件,则比进行外部翻译要难得多。在跨平台视图中,像xml这样的文本格式的优点是,您可以在任何语言/平台上阅读和使用(但是您可能需要做一些工作)
2014年

7

除了国际化/本地化之外,像这样将文本字符串分隔开也允许校对者提交对孤立的拼写/语法/标点的更正messages.${LOCALE},而无需触摸真实的源代码文件。您可能会在代码更改方面遇到停电,但是接受此类文本更正。如果您同时接受对代码和消息的并发更改,则将代码分开并保持分隔会使合并补丁程序更加容易,前提是代码更改不会重新定义校对者检出时存在的任何消息messages.en_US

而且,根据实现方式的不同,甚至可能甚至不需要重新链接应用程序。代码可以简单地从messages.${LOCALE}一条特定消息中获取行138 ,其中行号是在运行时确定的。


0

这只是您的语言/平台决定实现字符串本地化的方式。所有本地化方法都需要某种外部资源文件来获取翻译。主要的痛点是如何维护这些资源。

看起来您需要手动维护这些资源文件,这可能是一个负担。这也使重复字符串的共享变得复杂。而且,当您当前仅运送一种语言时,必须这样做,这甚至会带来更多负担。

一个通用的替代方法是GNU Gettext方法,该方法只是在源代码中标记可翻译的字符串,然后将这些字符串自动提取到标准的PO文件中,这些文件可以很好地跨平台和跨语言工作。从开发人员的角度来看,它每天都优于手动维护XML资源文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.