Eine String-Ressource stellt Text-Strings für Ihre Anwendung mit optionaler Textformatierung bereit. Es gibt drei Arten von Ressourcen, die Ihrer Anwendung Strings zur Verfügung stellen können:
- String
- XML-Ressource, die einen einzelnen String bereitstellt.
- String-Array
- XML-Ressource, die ein Array von Strings bereitstellt.
- Mengenstrings (Plurale)
- XML-Ressource mit verschiedenen Strings für die Pluralisierung.
Auf alle Strings können Formatierungs-Markup und Formatierungsargumente angewendet werden. Informationen zum Formatieren von Strings finden Sie im Abschnitt Formatierung und Gestaltung.
String
Ein einzelner String, auf den im Anwendungscode (z. B. in einer zusammensetzbaren Funktion) oder in anderen Ressourcendateien verwiesen werden kann.
- Dateispeicherort:
res/values/filename.xml
Der Dateiname ist beliebig. Dasname-Attribut des<string>-Elements wird als Ressourcen-ID verwendet.- Datentyp der kompilierten Ressource:
- Ressourcenzeiger auf eine
String. - Ressourcenreferenz:
-
In Kotlin:
R.string.string_name
In XML:@string/string_name - Syntax:
-
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="string_name" >text_string</string> </resources>
- Elemente:
- Beispiel:
- XML-Datei gespeichert unter
res/values/strings.xml:<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello!</string> </resources>
Mit diesem Anwendungscode wird ein String aus einem Composable mit
stringResource()abgerufen:@Composable fun Greeting() { Text(text = stringResource(R.string.hello)) }
Hinweis:Wenn Sie einen String außerhalb einer zusammensetzbaren Funktion abrufen möchten, verwenden Sie
Sie können auch aus anderen XML-Dateien, z. B. aus Ihrercontext.getString(R.string.hello).AndroidManifest.xml, auf String-Ressourcen verweisen:<activity android:name=".MainActivity" android:label="@string/hello" />
String-Array
Ein Array mit Strings, auf die von der Anwendung aus verwiesen werden kann.
- Dateispeicherort:
res/values/filename.xml
Der Dateiname ist beliebig. Dasname-Attribut des<string-array>-Elements wird als Ressourcen-ID verwendet.- Datentyp der kompilierten Ressource:
- Ressourcenzeiger auf ein Array von
String-Elementen. - Ressourcenreferenz:
-
In Kotlin:
R.array.string_array_name
In XML:@[package:]array/string_array_name - Syntax:
-
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="string_array_name"> <item >text_string</item> </string-array> </resources>
- Elemente:
- Beispiel:
- XML-Datei gespeichert unter
res/values/strings.xml:<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="planets_array"> <item>Mercury</item> <item>Venus</item> <item>Earth</item> <item>Mars</item> </string-array> </resources>
Mit diesem Anwendungscode wird ein String-Array aus einem Composable mit
stringArrayResource()abgerufen:@Composable fun PlanetList() { val planets: Array
= stringArrayResource(R.array.planets_array) // Render the array, e.g. inside a LazyColumn. } Hinweis:Wenn Sie ein String-Array außerhalb einer zusammensetzbaren Funktion abrufen möchten, verwenden Sie
context.resources.getStringArray(R.array.planets_array).
Mengenstrings (Plurale)
In verschiedenen Sprachen gelten unterschiedliche Regeln für die grammatische Übereinstimmung mit der Menge. Im Deutschen ist die Menge 1 beispielsweise ein Sonderfall. Wir schreiben „1 Buch“, aber für jede andere Menge würden wir „n Bücher“ schreiben. Diese Unterscheidung zwischen Singular und Plural ist sehr häufig, aber in anderen Sprachen wird genauer unterschieden. Die von Android unterstützten Werte sind zero, one, two, few, many und other.
Die Regeln für die Entscheidung, welcher Fall für eine bestimmte Sprache und Menge verwendet werden soll, können sehr komplex sein. Daher bietet Android Methoden wie pluralStringResource(), mit denen Sie die passende Ressource auswählen können.
Mengenstrings wurden früher als „quantity strings“ bezeichnet (und werden in der API immer noch so genannt). Sie sollten nur für Plurale verwendet werden. Es wäre ein Fehler, Mengenstrings zu verwenden, um etwas wie „Posteingang“ im Vergleich zu „Posteingang (12)“ in Gmail zu implementieren, wenn beispielsweise ungelesene Nachrichten vorhanden sind. Es mag praktisch erscheinen, Mengenstrings anstelle einer if-Anweisung zu verwenden. Es ist jedoch wichtig zu beachten, dass in einigen Sprachen (z. B. Chinesisch) diese grammatischen Unterscheidungen überhaupt nicht vorgenommen werden. Sie erhalten also immer den other-String.
Die Auswahl des zu verwendenden Strings erfolgt ausschließlich auf Grundlage der grammatischen Notwendigkeit. Im Englischen wird ein String für zero ignoriert, auch wenn die Menge 0 ist, da 0 sich grammatikalisch nicht von 2 oder einer anderen Zahl außer 1 unterscheidet („zero books“, „one book“, „two books“ usw.). Im Gegensatz dazu wird im Koreanischen nur der String other verwendet.
Lassen Sie sich auch nicht davon täuschen, dass two beispielsweise so klingt, als ob es nur für die Menge 2 gelten könnte: In einer Sprache kann es erforderlich sein, dass 2, 12, 102 usw. alle gleich behandelt werden, aber anders als andere Mengen. Verlassen Sie sich darauf, dass Ihr Übersetzer weiß, welche Unterscheidungen in seiner Sprache tatsächlich erforderlich sind.
Wenn Ihre Nachricht keine Mengenangabe enthält, ist sie wahrscheinlich nicht für die Pluralisierung geeignet. Im Litauischen wird beispielsweise sowohl für 1 als auch für 101 die Singularform verwendet. „1 Buch“ wird also als „1 knyga“ und „101 Bücher“ als „101 knyga“ übersetzt. „a book“ ist „knyga“ und „many books“ ist „daug knygų“. Wenn eine englische Pluralnachricht „a book“ (ein Buch, Singular) und „many books“ (viele Bücher, Plural) ohne die tatsächliche Anzahl enthält, kann sie als „knyga“ (ein Buch)/„daug knygų“ (viele Bücher) übersetzt werden. Gemäß den litauischen Regeln wird jedoch „knyga“ (ein einzelnes Buch) angezeigt, wenn die Anzahl 101 ist.
Mengenstrings lassen sich oft vermeiden, indem Sie mengenneutrale Formulierungen wie „Bücher: 1“ verwenden. Das erleichtert Ihnen und Ihren Übersetzern die Arbeit, sofern es sich um einen akzeptablen Stil für Ihre Anwendung handelt.
Ab API 24 können Sie stattdessen die viel leistungsfähigere ICU-Klasse MessageFormat verwenden.
- Dateispeicherort:
res/values/filename.xml
Der Dateiname ist beliebig. Dasname-Attribut des<plurals>-Elements wird als Ressourcen-ID verwendet.- Ressourcenreferenz:
-
In Kotlin:
R.plurals.plural_name - Syntax:
-
<?xml version="1.0" encoding="utf-8"?> <resources> <plurals name="plural_name"> <item quantity=["zero" | "one" | "two" | "few" | "many" | "other"] >text_string</item> </plurals> </resources>
- Elemente:
- Beispiel:
XML-Datei gespeichert unter
res/values/strings.xml:<?xml version="1.0" encoding="utf-8"?> <resources> <plurals name="numberOfSongsAvailable"> <!-- As a developer, you should always supply "one" and "other" strings. Your translators will know which strings are actually needed for their language. Always include %d in "one" because translators will need to use %d for languages where "one" doesn't mean 1 (as explained above). --> <item quantity="one">%d song found.</item> <item quantity="other">%d songs found.</item> </plurals> </resources>
XML-Datei gespeichert unter
res/values-pl/strings.xml:<?xml version="1.0" encoding="utf-8"?> <resources> <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>
Mit diesem Anwendungscode wird ein Pluralstring aus einem Composable mit
pluralStringResource()abgerufen:@Composable fun SongCount(count: Int) { Text( text = pluralStringResource( R.plurals.numberOfSongsAvailable, count, count, ) ) }
Wenn Sie die Funktion
pluralStringResource()verwenden, müssen Siecountzweimal übergeben, wenn Ihr String Stringformatierung mit einer Zahl enthält. Für den String%d songs foundwählt der erstecount-Parameter beispielsweise den entsprechenden Pluralstring aus und der zweitecount-Parameter wird in den%d-Platzhalter eingefügt. Wenn Ihre Pluralstrings keine Stringformatierung enthalten, müssen Sie den dritten Parameter nicht anpluralStringResourceübergeben.Hinweis:Wenn Sie einen Pluralstring außerhalb einer zusammensetzbaren Funktion abrufen möchten, verwenden Sie
context.resources.getQuantityString(R.plurals.numberOfSongsAvailable, count, count).
Format und Stil
Hier sind einige wichtige Informationen zur richtigen Formatierung und Gestaltung Ihrer String-Ressourcen.
Sonderzeichen verarbeiten
Wenn ein String Zeichen enthält, die in XML eine besondere Bedeutung haben, müssen Sie die Zeichen gemäß den standardmäßigen XML-/HTML-Escaping-Regeln maskieren. Wenn Sie ein Zeichen maskieren müssen, das in Android eine besondere Bedeutung hat, sollten Sie einen vorangestellten umgekehrten Schrägstrich verwenden.
Unter Android werden Folgen von Leerzeichen standardmäßig zu einem einzelnen Leerzeichen zusammengefasst. Sie können das vermeiden, indem Sie den entsprechenden Teil des Strings in doppelte Anführungszeichen setzen. In diesem Fall bleiben alle Whitespace-Zeichen (einschließlich Zeilenumbrüchen) im zitierten Bereich erhalten. Mit doppelten Anführungszeichen können Sie auch reguläre einfache Anführungszeichen ohne Escapezeichen verwenden.
| Zeichen | Maskierte Form(en) |
|---|---|
| @ | \@ |
| ? | \? |
| Neue Zeile | \n |
| Tabulatortaste | \t |
| Unicode-Zeichen U+XXXX | \uXXXX |
Einfaches Anführungszeichen (') |
Eine der folgenden:
|
Doppeltes Anführungszeichen (") |
\"
Beachten Sie, dass das Umschließen des Strings mit einfachen Anführungszeichen nicht funktioniert. |
Das Reduzieren von Leerzeichen und das Android-Escaping erfolgen, nachdem Ihre Ressourcendatei als XML geparst wurde. Das bedeutet, dass <string>      </string> (Leerzeichen, Satzzeichen-Leerzeichen, Unicode-Em-Leerzeichen) alle zu einem einzelnen Leerzeichen (" ") zusammengefasst werden, da sie alle Unicode-Leerzeichen sind, nachdem die Datei als XML geparst wurde.
Wenn Sie diese Leerzeichen beibehalten möchten, können Sie sie entweder in Anführungszeichen setzen (<string>"      "</string>) oder Android-Escaping verwenden (<string> \u0032 \u8200 \u8195</string>).
Strings formatieren
Wenn Sie Ihre Strings formatieren müssen, können Sie die Formatierungsargumente in die String-Ressource einfügen, wie im folgenden Beispiel gezeigt.
<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
Mit diesem Anwendungscode wird der String in einem Composable formatiert, indem Argumente direkt an stringResource() übergeben werden:
@Composable fun WelcomeMessage(username: String, mailCount: Int) { Text( text = stringResource( R.string.welcome_messages, username, mailCount, ) ) }
Formatierung mit HTML-Markup
Sie können Ihren Strings mit HTML-Markup Formatierungen hinzufügen. Beispiel:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="welcome">Welcome to <b>Android</b>!</string> </resources>
Die folgenden HTML-Elemente werden unterstützt:
- Fett:
<b> - Kursiv:
<i>,<cite>,<dfn>,<em> - 25% größerer Text:
<big> - 20% kleinerer Text:
<small> - Schriftart-Eigenschaften festlegen:
<font face="font_family" color="hex_color">. Beispiele für mögliche Schriftfamilien sindmonospace,serifundsans_serif. - Festlegen einer Festbreitenschriftfamilie:
<tt> - Durchgestrichen:
<s>,<strike>,<del> - Unterstrichen:
<u> - Hochgestellt:
<sup> - Tiefgestellt:
<sub> - Aufzählungspunkte:
<ul>,<li> - Zeilenumbrüche:
<br> - Division:
<div> - CSS-Stil:
<span style="color|background_color|text-decoration"> - Absätze:
<p dir="rtl | ltr" style="…">
In einigen Fällen möchten Sie möglicherweise eine formatierte Textressource erstellen, die auch als Formatstring verwendet wird. Normalerweise funktioniert das nicht, da Formatierungsmethoden wie stringResource() alle Stilinformationen aus dem String entfernen.
Als Workaround können Sie die HTML-Tags mit Escape-Sequenzen schreiben, die dann nach der Formatierung mit AnnotatedString.fromHtml() wiederhergestellt werden. Beispiel:
- Speichern Sie die formatierte Textressource als HTML-escaped-String:
<resources> <string name="welcome_messages">Hello, %1$s! You have <b>%2$d new messages</b>.</string> </resources>
In diesem formatierten String wird ein
<b>-Element hinzugefügt. Beachten Sie, dass die öffnende geschweifte Klammer mit der Notation<HTML-escaped wird. - Formatieren Sie den String dann wie gewohnt, rufen Sie aber auch
AnnotatedString.fromHtml()auf, um den HTML-Text in einen formatierten Compose-String zu konvertieren.
Da fromHtml() alle HTML-Entitäten formatiert, müssen Sie alle möglichen HTML-Zeichen in den Strings, die Sie mit dem formatierten Text verwenden, mit TextUtils.htmlEncode() maskieren.
import android.text.TextUtils import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.fromHtml @Composable fun WelcomeHtmlMessage(username: String, mailCount: Int) { // Escape the username in case it contains characters like "<" or "&" val escapedUsername = TextUtils.htmlEncode(username) val text = stringResource( R.string.welcome_messages, escapedUsername, mailCount, ) Text( text = AnnotatedString.fromHtml(text) ) }
Formatierung mit AnnotatedString
Ein AnnotatedString ist ein Compose-Textobjekt, das Sie mit Eigenschaften wie Farbe und Schriftstärke gestalten können. Sie können formatierten Text programmatisch mit buildAnnotatedString und withStyle erstellen.
Mit diesem Anwendungscode wird ein einzelnes Textelement mit gemischten Formatierungen erstellt:
@Composable fun StyledGreeting() { val styled = buildAnnotatedString { append("Welcome to ") withStyle(SpanStyle(fontWeight = FontWeight.Bold)) { append("Android") } append("!") } Text(text = styled) }
Verwenden Sie SpanStyle, um Farbe, Schriftgröße und Textformatierung anzuwenden. Wenn Sie Formatierungen auf Absatzebene (z. B. Ausrichtung oder Zeilenhöhe) anwenden möchten, verwenden Sie ParagraphStyle:
@Composable fun RichText() { val text = buildAnnotatedString { withStyle(ParagraphStyle(lineHeight = 24.sp, textAlign = TextAlign.Center)) { withStyle(SpanStyle(color = Color.Gray)) { append("Hello, ") } withStyle( SpanStyle( fontWeight = FontWeight.Bold, color = Color.Red, ) ) { append("world") } append("!") } } Text(text = text) }
Die AnnotatedString direkt zu erstellen, ist der empfohlene Ansatz für einsprachige Apps oder statischen Text in Compose. Wenn Sie jedoch formatierten Text verwenden, der lokalisiert werden muss, lesen Sie den XML-Ansatz <annotation> im nächsten Abschnitt.
Übersetzte Strings mit Anmerkungen formatieren
Für Strings, die eine benutzerdefinierte Formatierung und Übersetzung erfordern, definieren Sie das <annotation>-Tag in der strings.xml jeder Sprache. Übersetzer behalten die Anmerkung bei, unabhängig davon, wo sie im Satz steht. Lesen Sie den String mit context.resources.getText(), durchlaufen Sie die Annotation-Spannen und konvertieren Sie das Ergebnis in ein AnnotatedString:
@Composable fun AnnotatedTitle() { val context = LocalContext.current val source = context.resources.getText(R.string.title) as SpannedString val text = buildAnnotatedString { append(source.toString()) source.getSpans(0, source.length, Annotation::class.java) .forEach { annotation -> if (annotation.key == "font" && annotation.value == "title_emphasis") { addStyle( SpanStyle( fontFamily = FontFamily( Font(R.font.permanent_marker) ) ), source.getSpanStart(annotation), source.getSpanEnd(annotation), ) } } } Text(text = text) }
Das <annotation>-Tag in Ihrem XML-Code bleibt unverändert. Nur der Abrufcode unterscheidet sich. Übersetzer verschieben das Tag weiterhin, um das richtige Wort in jeder Sprache zu umschließen.
Zusätzliche Ressourcen
Weitere Informationen zu String-Ressourcen finden Sie in den folgenden zusätzlichen Ressourcen: