Lokalisierung: Variablen in String übergeben

  • Antworten:16
  • Bentwortet
Ludwig H.
  • Forum-Beiträge: 3.256

27.04.2011, 23:01:08 via Website

Hi,

ich bin gerade dabei meine App zu lokalisieren und will das, was im Moment noch als setText(); im Code steht, in die strings.xml auslagern.
strings.xml:
1<string name="description">Teststring Variable: %d .</string>

Java-Datei:
1TextView description = (TextView) findViewById(R.id.description);
2Resources res = getResources();
3description.setText(res.getString(R.string.description, 15));

Damit ist die Ausgabe der TextView :
1Teststring Variable: 15 .
.

So weit, so gut.

Jetzt möchte ich aber statt der 15 eine Variable übergeben. Wenn ich aber
1description.setText(res.getString(R.string.description, var));
schreibe gehts nicht, die App stürzt einfach ab.
Das passiert im Log:
104-27 20:56:34.889: DEBUG/AndroidRuntime(355): Shutting down VM
204-27 20:56:34.889: WARN/dalvikvm(355): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
304-27 20:56:34.899: ERROR/AndroidRuntime(355): Uncaught handler: thread main exiting due to uncaught exception
404-27 20:56:34.919: ERROR/AndroidRuntime(355): java.util.IllegalFormatConversionException: d is incompatible with java.lang.Double
504-27 20:56:34.919: ERROR/AndroidRuntime(355): at java.util.Formatter$Transformer.transformFromInteger(Formatter.java:1610)
604-27 20:56:34.919: ERROR/AndroidRuntime(355): at java.util.Formatter$Transformer.transform(Formatter.java:1259)
704-27 20:56:34.919: ERROR/AndroidRuntime(355): at java.util.Formatter.format(Formatter.java:948)
8.
9.
10.
11.
Der markierten Zeile entnehme ich, dass ich für eine Double Variable einen anderen Buchstaben nehmen muss, aber welchen?
In der Android Doc finde ich nichts passendes.

Danke schonmal
Ludwig

Antworten
Markus B.
  • Forum-Beiträge: 636

27.04.2011, 23:52:33 via Website

Hi,
die Frage ist nun halt von welchem Typ deine Variable ist.
Wenn du in der entsprechenden XML-Datei den Platzhalter %d benutzt muss eine Dezimalzahl sein.
Wenn du %s als Platzhalter nutzt muss die Variable ein String sein.
Schreibst du also ein String in den Platzhalter %d hängt sich die Anwendung weg.

Das einzige was ich so auf die Schnell zu diesem Thema gefunden habe ist folgendes dort dann Formatting strings wobei dort halt auch auf den Datentyp geachtet wird.

Hoffe ich konnte dir da etwas weiterhelfen.

Gruß,
Markus

Antworten
Ludwig H.
  • Forum-Beiträge: 3.256

27.04.2011, 23:58:24 via App

Wie oben geschrieben ist es eine Double Variable. Eine einfache Tabelle wo alle Buchstaben zu den Datentypen drin steht wäre klasse :)

trotzdem Danke!

Antworten
Markus B.
  • Forum-Beiträge: 636

28.04.2011, 00:24:38 via Website

luhu
Wie oben geschrieben ist es eine Double Variable. Eine einfache Tabelle wo alle Buchstaben zu den Datentypen drin steht wäre klasse :)

trotzdem Danke!

Okay, ist schon spät, sry :)
So nun hab ich es aber verstanden ....
Also ist ganz einfach und ich habe ne Tabelle für dich :)
Wenn du dort ein bissel scrollst kannst du dir an schauen wie Formatter das unter Android macht.
Die selben Pattern kannst du in der XML-Konfiguration benutzten.
Somit wäre für dich z.B. das hier passen: %.2f -> Also eine floating point Variable mit zwei Nachkommastellen.

Gruß,
Markus

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

28.04.2011, 13:18:28 via Website

Nur so am Rande:

Solange Du Dich in einer Activity/ListActivity/... befindest benötigst Du nicht den Weg über die Resources. getString() ist im Context definiert und somit erben u.a. alle Activities davon. Also statt ...

1Resources res = getResources();
2description.setText(res.getString(R.string.description, 15));

Reicht ...

1description.setText(getString(R.string.description, 15));

Gruß
Harald

Antworten
Ludwig H.
  • Forum-Beiträge: 3.256

28.04.2011, 14:40:29 via Website

Alles klar, danke euch. Klappt soweit.
Wie ist das jetzt, wenn ich noch mehr Variablen in den String übergeben will?

1description.setText(getString(R.string.description, var1, var2)); //Beides double variablen
1<string name="description">Teststring Variable1: %.2f Variable2: %.2f .</string>

So sollte es ja funktionieren, aber anscheinend, klappt das mit dem 2. %.2f nicht. die nachfolgenden Strings in der strings.xml werden nicht mehr erkannt...

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

28.04.2011, 15:09:40 via Website

Das habe ich leider auch gehabt und nicht gelöst bekommen.
Hab auch in Foren Beschwerden von anderen darüber gefunden...scheint wohl eine Limitierung seit den neueren Versionen des SDK zu sein.
Man kann nur eine Variable pro String einbauen, sonst meckert der Resource Parser.

Antworten
Ludwig H.
  • Forum-Beiträge: 3.256

28.04.2011, 15:32:02 via Website

Danke.
Das ist ja blöd, wie soll ich denn dann die App gescheit lokalisieren? Dann muss ich den Text, der voll mit Variablen ist in je einen String pro Variable zerlegen?
sehr umständlich... :rolleyes:

— geändert am 28.04.2011, 15:32:38

Antworten
Markus B.
  • Forum-Beiträge: 636

28.04.2011, 15:55:31 via Website

Hi,
ich kann es atm nicht testen, da ich noch auf der Arbeit hänge aber du müsstest folgendes machen können:
1<string name="description">Teststring Variablen: %.2f %.2f </string>
2
3Resources res = getResources();
4String text = String.format(res.getString(R.string.description), double1, double2);
5description.setText(text);

Gruß,
Markus

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

28.04.2011, 16:02:38 via Website

Ein Workaround - nicht schön, ich weiß. Die Formatierungsangaben in den String-Ressourcen escapen (statt "... %d ..." --> "... \%d ..."). Und dann mit Hilfe der statischen String Methode format():

1description.setText(String.format(getString(R.string.description), var1, var2));

Gruß
Harald

Antworten
Ludwig H.
  • Forum-Beiträge: 3.256

28.04.2011, 16:11:51 via Website

Danke für eure Lösungsvorschläge, aber das Problem ist in der strings.xml.
Er findet die nachfolgenden Strings nicht mehr, wenn ich 2 mal %.2f reinschreibe:
\res\menu\menu.xml:6: error: Error: No resource found that matches the given name (at 'title' with value '@string/share').

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

28.04.2011, 18:29:07 via Website

1. Du hast eine menu Ressource mit dem android:title="@string/share"?

2. Du hast eine string Ressource "share" mit welchem Text?

3. Diese string Ressource befindet sich auch im Ordner, und der Datei, der Default-Sprache (values, ohne Language Zusatz)?

4. Über dieser string Ressource hast Du nun einen String mit 2x %f?

Hmm, kontrolliere mal Position 3?

Gruß
Harald

Antworten
Markus B.
  • Forum-Beiträge: 636

28.04.2011, 22:45:55 via Website

Hi,
also wenn ich folgendes mache:
1<string name="text" formatted="false">My Text %.2f and %.2f</string>
2
3final double d1 = 1.34;
4final double d2 = 2.34;
5textView.setText(getString(R.string.text, d1, d2));

Ist die Ausgabe in der textView: My Text 1.34 and 2.34

Das ist doch nun aber was du sucht oder ?

Gruß,
Markus

— geändert am 28.04.2011, 22:46:16

Antworten
Ludwig H.
  • Forum-Beiträge: 3.256

29.04.2011, 11:14:12 via Website

Markus B.
Hi,
also wenn ich folgendes mache:
1<string name="text" formatted="false">My Text %.2f and %.2f</string>
2
3final double d1 = 1.34;
4final double d2 = 2.34;
5textView.setText(getString(R.string.text, d1, d2));

Ist die Ausgabe in der textView: My Text 1.34 and 2.34

Das ist doch nun aber was du sucht oder ?

Gruß,
Markus

Ja genau, das suche ich.

Wenn ich das so mache, erkennt Eclipse aber die Strings, die in der strings.xml nach dem zweiten "%.2f" ist nicht mehr.
Muss man das formatted="false" mit reinnehmen? Liegt es daran?

EDIT: Das wars, wenn ich das formatted="false" mit reinnehme, geht alles! DANKESCHÖN! :)

— geändert am 29.04.2011, 11:23:20

Antworten
Markus B.
  • Forum-Beiträge: 636

29.04.2011, 11:26:52 via Website

Rafael K.
@Markus:
Kannst Du das auch mal mit 2 Strings testen? Also %s

Das ging bei mir nämlich nicht durch den Android SDK Resource Parser.

Hallo Rafael,
das funktioniert auch mit zwei Strings.

Gruß,
Markus

Antworten