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