发布于:2021-01-30 11:55:20
0
81
0
本文介绍了一些技巧,这些技巧可在为Android应用程序开发字符串资源时为您提供帮助。
百分比如何使代码生病?
默认情况下,字符串资源是所谓的格式化的。这意味着它们可能用于格式化。下面是一个简单的示例:
val text = resources.getString(R.string.welcome_message, 4)
//"You have 4 new messages."
<string name="welcome_messages">You have %d new messages.</string>
Lint对格式化字符串执行检查,如果遇到像这样的字符串:%d of %d left。这种情况下的错误消息是用非位置格式指定的多个替换;您是想添加格式化的= " false "属性吗?
人们可能认为添加formatted="false"
属性是正确的解决方案(事实上,没有其他关于如何修复此问题的直接建议)。如果添加建议的属性,lint错误将消失。但是,在这种情况下,正确的解决方法是使格式具有位置性。在本例中,它将是%1$d of %2$d left
。
另一方面,formatted="false"
用于百分比符号不是任何格式说明符的一部分的字符串,例如Equation: a=50%b+20%c
。
秘密成分
假设你只为本地市场开发一个应用程序,不需要英文文本。默认翻译(位于values
目录中)将使用给定区域中最常用的语言,例如波兰的波兰语或瑞士的德语。由于目录名中没有区域设置限定符,因此假定为英语。这导致了几个问题。首先,Android Studio spellchecker会抱怨大部分单词。
此外,lint可能会将一些单词检测为常见的拼写错误,并因此产生警告。例如,单词adres在波兰语中是正确的,但在英语address中是一个常见的拼写错误。以下是Android Studio建议的快速修复方法:
不幸的是,最好的不在名单上。请注意,为每个标记添加tools:ignore="Typos"
属性是可行的,但这相当麻烦,因此不是最佳解决方案。
属性才是真正有用的。它告诉工具文件中使用的语言。您可以将其添加到resources
标记中,如下所示:
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="pl">
请记住,只有Android Studio spellchecker和lint才使用它。它不会影响运行时的任何行为!在某些领域尤其如此,例如,它不会改变复数规则。这在实践中意味着什么?
让我们考虑一下同样的复数资源,它包含链接的官方文档中的歌曲数量,但是波兰语用作默认翻译(位于values
目录中),并且根本没有英语。请注意,当前版本的lint会抱怨缺少many
数量,但我们将在下一章中回到这一点。以下是片段:
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="pl">
<plurals name="numberOfSongsAvailable">
<item quantity="one">Znaleziono %d piosenkę.</item>
<item quantity="few">Znaleziono %d piosenki.</item>
<item quantity="other">Znaleziono %d piosenek.</item>
</plurals>
</resources>
例如,如果设备的语言设置为波兰语并且实际歌曲数为5,则结果文本为Znaleziono 5 piosenek.
,因为波兰语中的5属于many
数量。但是,在其他语言中,相同的数字可以映射到不同的量。请看下表:
例如,如果语言设置为立陶宛语,我们将得到Znaleziono 5 piosenki.
,这在波兰语中是不正确的。但是,如果设备运行的是Android 7或更高版本(API 24+),并且您指定了resConfigs 'pl'
(有关更多信息,请参阅DSL文档)。如果应用程序不支持区域设置,则将使用other
数量。这是一个修改过的样品,包括这个数量:
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="pl">
<plurals name="numberOfSongsAvailable">
<item quantity="one">Znaleziono %d piosenkę.</item>
<item quantity="few">Znaleziono %d piosenki.</item>
<item quantity="many">Znaleziono %d piosenek.</item>
<item quantity="other">Liczba znalezionych piosenek: %d.</item>
</plurals>
</resources>
假设您必须在几个地方重复一些文本,例如,某个屏幕名称在列表上用作标签,在该屏幕上用作标题。当然,你可以直接复制粘贴它们,但这很不方便。在文本更改的情况下,您必须记住在几个地方更新它。然而,有一个更好的解决办法。您可以引用已有的字符串,如下所示:
<string name="tab_foo">Foo</string>
<string name="tab_baz">Baz</string>
<string-array name="tab_labels">
<item>@string/tab_foo</item>
<item>@string/tab_baz</item>
</string-array>
救援实体
如果只重复了部分课文呢?例如,应用程序名称在多个文本中使用。我们可以为此创建一个自定义的内部XML实体。然后,它可以像标准字符实体一样使用(&
等)。请看以下示例:
<!DOCTYPE resources [
<!ENTITY foo "Foo">
]>
<resources>
<string name="app_name">&foo;</string>
<string name="busy_warning">Sorry, &foo; is working hard, please try again in a moment.</string>
<string name="trademark">&foo; is a registerd trademark, all rights reserved.</string>
</resources>
翻译还是不翻译?
有些文本不是用来翻译的。例如,作者或应用程序名和其他专有名称。如果只为某些字符串提供默认翻译,而在特定语言的文件中忽略了它们,lint会抱怨缺少翻译。当然,您可以抑制这个错误,但幸运的是,有一个更干净的解决方案。
translatable="false"
属性将给定的字符串标记为不可翻译。这样的资源不仅不需要翻译,而且不能有任何翻译。不可翻译文本的翻译将导致相应的lint错误。Android Studio的翻译编辑器也支持此功能。下面是一个不可翻译字符串的示例:
<string name="author" translatable="false">Droids On Roids</string>
可翻译属性只能在单个字符串级别上工作。如果有很多,可以将它们分组到一个名为donottranslate.xml
的文件中。Lint将把它们都视为不可翻译的。
作者介绍