發(fā)布于:2021-01-30 11:55:20
0
104
0
本文介紹了一些技巧,這些技巧可在為Android應(yīng)用程序開發(fā)字符串資源時(shí)為您提供幫助。
百分比如何使代碼生???
默認(rèn)情況下,字符串資源是所謂的格式化的。這意味著它們可能用于格式化。下面是一個(gè)簡(jiǎn)單的示例:
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對(duì)格式化字符串執(zhí)行檢查,如果遇到像這樣的字符串:%d of %d left。這種情況下的錯(cuò)誤消息是用非位置格式指定的多個(gè)替換;您是想添加格式化的= " false "屬性嗎?
人們可能認(rèn)為添加formatted="false"
屬性是正確的解決方案(事實(shí)上,沒有其他關(guān)于如何修復(fù)此問(wèn)題的直接建議)。如果添加建議的屬性,lint錯(cuò)誤將消失。但是,在這種情況下,正確的解決方法是使格式具有位置性。在本例中,它將是%1$d of %2$d left
。
另一方面,formatted="false"
用于百分比符號(hào)不是任何格式說(shuō)明符的一部分的字符串,例如Equation: a=50%b+20%c
。
秘密成分
假設(shè)你只為本地市場(chǎng)開發(fā)一個(gè)應(yīng)用程序,不需要英文文本。默認(rèn)翻譯(位于values
目錄中)將使用給定區(qū)域中最常用的語(yǔ)言,例如波蘭的波蘭語(yǔ)或瑞士的德語(yǔ)。由于目錄名中沒有區(qū)域設(shè)置限定符,因此假定為英語(yǔ)。這導(dǎo)致了幾個(gè)問(wèn)題。首先,Android Studio spellchecker會(huì)抱怨大部分單詞。
此外,lint可能會(huì)將一些單詞檢測(cè)為常見的拼寫錯(cuò)誤,并因此產(chǎn)生警告。例如,單詞adres在波蘭語(yǔ)中是正確的,但在英語(yǔ)address中是一個(gè)常見的拼寫錯(cuò)誤。以下是Android Studio建議的快速修復(fù)方法:
不幸的是,最好的不在名單上。請(qǐng)注意,為每個(gè)標(biāo)記添加tools:ignore="Typos"
屬性是可行的,但這相當(dāng)麻煩,因此不是最佳解決方案。
屬性才是真正有用的。它告訴工具文件中使用的語(yǔ)言。您可以將其添加到resources
標(biāo)記中,如下所示:
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="pl">
請(qǐng)記住,只有Android Studio spellchecker和lint才使用它。它不會(huì)影響運(yùn)行時(shí)的任何行為!在某些領(lǐng)域尤其如此,例如,它不會(huì)改變復(fù)數(shù)規(guī)則。這在實(shí)踐中意味著什么?
讓我們考慮一下同樣的復(fù)數(shù)資源,它包含鏈接的官方文檔中的歌曲數(shù)量,但是波蘭語(yǔ)用作默認(rèn)翻譯(位于values
目錄中),并且根本沒有英語(yǔ)。請(qǐng)注意,當(dāng)前版本的lint會(huì)抱怨缺少many
數(shù)量,但我們將在下一章中回到這一點(diǎn)。以下是片段:
<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>
例如,如果設(shè)備的語(yǔ)言設(shè)置為波蘭語(yǔ)并且實(shí)際歌曲數(shù)為5,則結(jié)果文本為Znaleziono 5 piosenek.
,因?yàn)椴ㄌm語(yǔ)中的5屬于many
數(shù)量。但是,在其他語(yǔ)言中,相同的數(shù)字可以映射到不同的量。請(qǐng)看下表:
例如,如果語(yǔ)言設(shè)置為立陶宛語(yǔ),我們將得到Znaleziono 5 piosenki.
,這在波蘭語(yǔ)中是不正確的。但是,如果設(shè)備運(yùn)行的是Android 7或更高版本(API 24+),并且您指定了resConfigs 'pl'
(有關(guān)更多信息,請(qǐng)參閱DSL文檔)。如果應(yīng)用程序不支持區(qū)域設(shè)置,則將使用other
數(shù)量。這是一個(gè)修改過(guò)的樣品,包括這個(gè)數(shù)量:
<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>
假設(shè)您必須在幾個(gè)地方重復(fù)一些文本,例如,某個(gè)屏幕名稱在列表上用作標(biāo)簽,在該屏幕上用作標(biāo)題。當(dāng)然,你可以直接復(fù)制粘貼它們,但這很不方便。在文本更改的情況下,您必須記住在幾個(gè)地方更新它。然而,有一個(gè)更好的解決辦法。您可以引用已有的字符串,如下所示:
<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>
救援實(shí)體
如果只重復(fù)了部分課文呢?例如,應(yīng)用程序名稱在多個(gè)文本中使用。我們可以為此創(chuàng)建一個(gè)自定義的內(nèi)部XML實(shí)體。然后,它可以像標(biāo)準(zhǔn)字符實(shí)體一樣使用(&
等)。請(qǐng)看以下示例:
<!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>
翻譯還是不翻譯?
有些文本不是用來(lái)翻譯的。例如,作者或應(yīng)用程序名和其他專有名稱。如果只為某些字符串提供默認(rèn)翻譯,而在特定語(yǔ)言的文件中忽略了它們,lint會(huì)抱怨缺少翻譯。當(dāng)然,您可以抑制這個(gè)錯(cuò)誤,但幸運(yùn)的是,有一個(gè)更干凈的解決方案。
translatable="false"
屬性將給定的字符串標(biāo)記為不可翻譯。這樣的資源不僅不需要翻譯,而且不能有任何翻譯。不可翻譯文本的翻譯將導(dǎo)致相應(yīng)的lint錯(cuò)誤。Android Studio的翻譯編輯器也支持此功能。下面是一個(gè)不可翻譯字符串的示例:
<string name="author" translatable="false">Droids On Roids</string>
可翻譯屬性只能在單個(gè)字符串級(jí)別上工作。如果有很多,可以將它們分組到一個(gè)名為donottranslate.xml
的文件中。Lint將把它們都視為不可翻譯的。
作者介紹
熱門博客推薦