【问题标题】:Restrictions on resource name or how to do generic internationalisation资源名称限制或如何进行通用国际化
【发布时间】:2010-10-05 12:59:45
【问题描述】:

目前正在将 iPhone 应用程序移植到 Android。我遇到了一个我无法克服的问题。

在 iPhone 上,翻译您的文本是微不足道的。将您的所有字符串/文本放入 Localizable.strings 中,格式如下: "要翻译的句子" = "翻译的句子"

原始字符串可以包含任何类型的任何字符。

尝试在 Android 上重现类似的内容,在 strings.xml 中我添加了所有键,例如: 句子翻译

然后我希望做类似的事情:
int resID = getResources().getIdentifier(tmp, "strings", "com.name.app_name"); 其中 tmp 包含字符串。 获得 resID 后,我可以使用 findresourcebyId 获得翻译后的字符串。

不幸的是,发现这并不容易。字符串名称不能包含空格、不能以数字开头等。

Eclipse 没有向我显示任何内容,但在尝试运行代码时,我只是得到一个“您的项目包含错误。请在运行您的应用程序之前修复它们”,仅此而已。在错误日志等中看不到任何内容。

那么,Android 上资源名称的限制是什么。或者有没有办法绕过它并轻松地将一个字符串替换为另一个字符串。我想保留我在 iPhone 上使用的原始文本字典,以保持简单,不会引入任何不必要的错误。

谢谢

【问题讨论】:

    标签: java android xml internationalization


    【解决方案1】:

    您基本上只需为您想要支持的每种语言创建一个新的values 目录,使用以下命名模式values-en 进行英语本地化等等。它使用两个字母的 ISO 639-1 标准。

    现在在每个语言值目录中都有您的strings.xml。在这个 XML 文件中,每个字符串都有自己的 ID 和值(翻译后的字符串)。不同语言目录下的每个strings.xml的ID都是一样的,只是字符串内容不同。

    要深入阅读本文,我推荐 Android 开发者网站上的 Localization 文章。

    编辑:您只能使用大写、小写、数字和下划线作为字符串标识符。

    【讨论】:

    • 恐怕你还没有读懂我原来的困境。我已阅读本地化文章,但它不适用。我已经有一个 key = value 的表。我不想改变它。那里有成千上万的翻译关键字。问题在于键可以包含的字符。
    • @jyavenard:看来我误解了你。你现在想要做什么?本地化还是其他?编辑:我明白了。
    • 这里是使用的键/值的示例。 "2-RL" = "2-Rail Fence 的导轨数"。在这种情况下,编译失败,因为名称以数字 (2) 开头,并且 i 包含一个“-”,由于某种原因它也不喜欢它。在 iPhone 上我会做 [[NSBundle mainBundle] 本地化StringForKey:(@"2-RL") value:@"" table:nil]。这将返回我需要的字符串。
    • 归根结底是本地化。碰巧在原始代码中使用的键/值是 4 个字符的代码或整个英文句子。假设您在 iPhone 上的法语本地化文件是“我的名字是 jean-yves”=“je m'appelle jean-yves”。将您的 iPhone 设置为英语它显示第一部分,在法语中它显示第二部分。在 Android 上,我希望密钥类似于 Number of Rails for 2-Rail Fence。毕竟已经有像 My Application 这样的条目
    • @jyavenard:不带减号的原因是因为每个资源id都是存储在R.java中的变量,可以通过R.string.some_string_id访问。如果那里有减号,编译器无法判断它是否是变量的一部分,或者您是否正在尝试进行减法操作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多