Mit Variable auf res / values / strings zugreifen

Hi,

ich erzeuge programmatisch eine String Variable.
z.B. String name = "hallo_" + "welt";
Diese ist in res / values / strings.xml enthalten.
[XML]Hallöchen Erde[/XML]

Aber wie komme ich mit meiner Variable an strings/hallo_welt ran?
folgendes funktioniert auf jeden Fall nicht:
button.setText( getString ( R.string.name ) );

R.string.hallo_welt

Das musst du über Reflection machen. Sehr unschön allerdings. Wofür brauchst du das?

Funktioniert so nicht. Er möchte das zur Laufzeit zusammen bauen.

Ich hole die Bezeichnung aus eine Datenbank.
Aber diese Bezeichnung muss in verschiedenen Sprachen innerhalb der App-Oberfläche zur Verfügung stehen.

Um genauer zu sein, es handelt sich um Maschinenteile. In der SQLite-DB stehen die Teile mit diversen Werten dazu. Die Namen der Teile brauche ich in verschiedenen Sprachen.

Wieso nutzt du nicht die internationalisierung die dir Android mitbringt und legst die übersetzungen einfach in den entsprechenden values-Ordnern ab?

Da ist die Frage was mehr Sinn macht. Ich denke, dass du in dem Fall die Namen auch in die DB speichern solltest. Ansonsten musst du zur Compile-Zeit die string.xmls erzeugen. Das händisch zu warten ist doch sicher ziemlicher Aufwand.

Genau das ist ja sein Problem. IMO macht’s in dem Fall mehr Sinn die Internationalisierung nicht in die XMLs auszulagern da 'ne DB dahinter steht. Jetzt muss er zur Laufzeit den Namen des aktuell angezeigten Elements zusammen basteln, diesen verwenden um per Reflection den wert des entsprechenden R.string.NAME-Felds zu ermitteln damit er die Lokalisierung bekommen.

Abgesehen davon, dass es so leicht passieren kann, dass DB u. Strings.xml nicht übereinstimmen da etwas vergessen wurde einzupflegen.

Ne, die string.xml’s muss ich nicht zur Laufzeit erzeugen.
ich kann ja die Maschinenteile jeweils in die string.xml’s legen.
Nur will ich drauf zugreifen können.

Funktioniert wie gesagt mittels Reflection.

Allerdings:

Soll immer die Sprache die in Android als Systemsprache eingestellt ist verwendet werden?
Ja: Dann kann man einfach für jede Sprache eine string.xml zur Verfügung stellen.
Nein: Warum dann nicht gleich die Namen der Teile in den einzelnen Sprachen in der DB speichern?

Sorry, meinte Compile-Zeit. Ist aber so oder so Mist.

Denke dass es so oder so keinen Sinn macht. Schon alleine weil dann die Konsistenz eine wichtige Rolle spielen kann die irgendwie garantiert werden muss.

Du meinst values / strings ?
Das will ich ich ja. / habe ich gemacht.

Wah, hab ich nicht lange genug übers Problem nachgedacht. Ja eigentlich wärs geschickter das in der DB zu verstauen. Wenn du es trotzdem über Resourcen machen willst, müsste es glaube ich damit gehen:

int id = getResources().getIdentifier("app_name","string",null);```

[QUOTE=_Michael;69890]Soll immer die Sprache die in Android als Systemsprache eingestellt ist verwendet werden?
Ja: Dann kann man einfach für jede Sprache eine string.xml zur Verfügung stellen.
Nein: Warum dann nicht gleich die Namen der Teile in den einzelnen Sprachen in der DB speichern?[/QUOTE]

Ja, es soll sich nach Systemsprache richten, bzw. ich habe die Option die Systemsprache für diese App zu ändern.

*** Edit ***

Ich danke Euch allen!
War ein spannendes Forum.
(Ich war fast mehr am Lesen als am Ausprobieren. :wink: )

int id = getResources().getIdentifier(name, "string", getPackageName());
…funktioniert sehr schön.

Ich habe darüber, die Benennungen in die DB zu stecken, nachgedacht.
Aber es ist wahrscheinlich, dass mit der Zeit immer weitere Sprachen nachgeschoben werden und so reicht es, wenn entsprechende strings.xml’s hinzukommen und die DB bleibt unberührt. (Zumal andere Programmierer das Ding pflegen sollen…)

Bin mir nicht sicher, ob ich wirklich verstanden habe was Du vorhast.

Du hast eine App die normalerweise die eingestellte Systemsprache nutzen soll. Hierfür kann man ja für jede Sprache lokalisierte string.xmls zur Verfügung stellen.
Nun soll (durch den Anwender?) die Sprache explizit für diese App umstellen können? Auch hierfür kann man die lokalisierten string.xmls nutzen.
Eine Möglichkeit die Sprache lokal für die App umzustellen, wird hier beschrieben.
http://www.qc4blog.com/?p=1186
Die Kombination xml und DB ist erstens sehr fehleranfällig, da man sicherstellen muss, dass die DB Einträge und die xml konsistent sind und zweitens musst Du oder zukünftige Entwickler immer und überall zusätzlichen Code implementieren, der bei einer Sprachänderung die Beschriftungen/Namen erneuert.
Mit der oben beschriebenen Variante muss man nur die lokalisierten XMLs zur Verfügung stellen (was Du ohnehin schon machst) den Rest macht Android fast von “alleine”.

Ist es nicht eher wahrscheinlicher das neue Geräte hinzukommen?

*** Edit ***

Ohne DB/XML-Kombi geht’s nicht, da die Einträge aus der DB vorgeben welcher String aus dem XML genommen werden soll. Wie stellst du dir das mit dem „fast von allein“ vor?

Wie gesagt, bin ich mir nicht sicher ob ich das Vorhaben verstanden habe. Den Kontext der App kenne ich gar nicht, daher weiß ich nicht für welche Daten die DB bzw. inweit die DB überhaupt benötigt wird.
Wollte damit nur sagen, dass für die Lokalisierung der App keine DB notwendig ist - wenn es um die Beschriftung irgendwelcher Bedienelemente oder Anzeigen geht.
Wenn es hier um irgendwelche Listen, Produkte, Teile o.ä. geht die ohnehin in der DB verwaltet werden, wäre es dann nicht besser die Namen/Bezeichnungen in anderen Sprachen nicht auch direkt in der DB zu pflegen? Sonst mussman immer darauf achten DB und XML synchron zu halten.

Sollte folgende Lösung der, der Reflection nicht vorzuziehen sein?
Einfach in der DB nicht hallo_welt speichern, sondern den (int-)Wert von R.id.hallo_welt? Dann ließe es sich da auch wieder easy drauf zugreifen.
LG

Einfach in der DB nicht hallo_welt speichern, sondern den (int-)Wert von R.id.hallo_welt?

Das ist kein fixer Wert. Der kann sich bei jedem Compile-Vorgang ändern.