如何避免由于缺少字符串条目而导致的崩溃?
我有翻译成3种语言的应用程序:英语,德语,波兰语如何避免由于缺少字符串条目而导致的崩溃?
所以,我对于该项目的语言这三个文件夹:
values
strings.xml
values-en
strings.xml
values-de
strings.xml
values-pl
strings.xml
我已经意识到,如果我把所有字符串成值文件夹,并在波兰语版本中缺少一些字符串,导致应用程序在访问波兰语版本中缺少的字符串时崩溃。
我原以为系统只是从默认值文件夹中获取字符串,如果它没有在values-pl文件夹中找到它的话。
有什么办法可以捕捉到这些潜在的缺失字符串崩溃? EVen如果我可以在编译器中得到一个警告,说明任何语言的字符串都丢失了,那么可以吗?
编辑和添加
其实另一个字符串缺少默认太....所以谢谢你的答案/评论!
但是现在我也测试了在默认的strings.xml文件中只有一个字符串缺少的情况,但是只存在于所有其他文件中。我没有得到任何警告或任何其他。
因此,在这种情况下,如果所有的字符串存在于德语,英语,PL但一个是在默认情况下丢失,那么在中国的应用程序崩溃,例如(我当然明白的,因为默认的缺失)。
但是困扰我的是我没有找到任何方法来检查代码中所有引用字符串的完整性。这是我访问缺失的字符串:
context.getString(R.string.MYTRING_abc),
在Eclipse菜单Window --> Properties --> Android --> Lint Error Checking
在Correctness:Messages
部分设置MissingTranslation
在Severity
框中错误。当以默认值编译string.xml时,每个未翻译的字符串都将被标记。 大部分时间构建后,您必须单击Link Warnings
窗口(Outline window
旁边的refresh icon
)才会显示这些错误。
如果在修复它们之后出现错误,则必须清理项目,否则Eclipse将不会生成并仍显示这些错误。
谢谢,我已经检查了 - 我的设置是致命 – user387184 2013-04-26 09:34:01
我本来期望的是,系统只是获取字符串的默认值文件夹,如果它不值-PL文件夹中找到它。
它适用于<string>
s,但不适用于<string-array>
s的元素。如果其中一个翻译的<string-array>
没有正确数量的元素,那么如果应用尝试访问缺少的元素,则会发生崩溃。我过去几年的解决方案是将每个字符串数组存储在非翻译的XML文件中,并引用可翻译的字符串。
RES /价值/ misc.xml:
<?xml version="1.0" encoding="utf-8"?>
<!-- Resources that are neither styles nor strings to be translated. -->
<resources>
<string-array name="notification_line_content_entries">
<item>@string/time_remaining</item>
<item>@string/time_since_status_change</item>
<item>@string/vital_signs</item>
</string-array>
</resources>
这样,如果独立字符串中的一个不翻译,阵列仍然有效,并且你回退到默认的转换为特定的值。
当然,另一种可能性是,作为在评论中建议,你不必在res/values/
每个字符串默认翻译。
感谢,它只是一个普通的字符串,它缺少的值目录中,但没有警告或其他任何东西! – user387184 2013-04-26 09:34:56
在Android Studio中:
Settings -> Editor -> Inspections -> (search for or find) Incomplete translation
设置为info
或warning
。 Error
阻止在按create signed APK
时创建应用程序。
根据我自己的经验,当创建构建时(通过USB调试进行非调试,意味着它是签名构建时),但将不完整的转换更改为warning
(因此我收到通知没有完成,但它不会被忽略(如果我忘记了)(或者info
就可以),它允许应用程序被构建,它的功能就像在调试中一样,其中不完整的翻译将转换为默认值。
但是,如果你在调试遇到的错误为好,这仍然应该工作,防止APK创建崩溃
从我expiriens如果有遗漏串项目不编译。我正在使用eclipse juno。 – NickF 2013-04-25 19:54:43
如果你测试你的应用程序,用所有可用的语言,你不会问这个问题。对我来说,这是没有道理的,为什么你只是不确定,在发布你的应用程序之前,字符串是可用的。并非所有的例外都应该被捕捉,应该在它们发生之前处理。 – Darwind 2013-04-25 20:00:12
“我的应用程序已翻译成3种语言:英语,德语,波兰语” - 不,您的应用翻译成四种语言:英语,德语,波兰语,以及您的'res/values /'目录中的任何语言。如果你真的只把你的应用翻译成三种语言,那么其中一种语言需要转移到'res/values /'中。你希望'res/values /'对于每一个字符串资源都有默认值,无论你希望认为你的默认语言是什么。 – CommonsWare 2013-04-25 20:10:47