i18n und physikalische Einheiten

godi

Aktives Mitglied
Hallo,

ich bin gerade dabei das ich mir ein kleines (Übungs-) Programm schreibe bzw erst Gedanken zur Umsetzung mache.
In diesem Programm verwende ich physikalische Einheiten die ich in Metrisch oder Englisch darstellen will.
Der User kann in einem Menü zwischen Metrisch oder Englisch auswählen. Die Sprache ebenfalls.
Jetzt stellt sich mir die Frage wie ich das am besten umsetze.

Also zB soll dann in einem Formular vor einem Textfeld so etwas stehen:
Geschwindigkeit [km/h]
Wenn auf Englische Einheit umgestellt wird dann soll
Geschwindigkeit [mph] stehen.
Natürlich soll die Sprache auch noch einzeln umgestellt werden können:
Speed [mph]

Jetzt habe ich probiert das ganze in der Gui Klasse zu realisieren also das ich die zwei Strings aus der propertie Datei lese, verknüpfe und ausgebe.
Jedoch stellt mich das überhaupt nicht zufrieden da ich den zusammengesetzten String öfters benötige und irgendwie passt das nicht in die GUI Klasse.
Würdet ihr da eine eigene (static?) Klasse machen zb. AutoI18N mit der Methode getSpeedStr wo der String zurückgegeben wird oder soll das ganze überhaupt in die Klasse Auto wo der Wert auch abgespeichert ist und umgerechnet wird zwischen den Einheiten?

Wie Löst ihr das?

godi
 

KrokoDiehl

Top Contributor
Ich würde sagen: Kommt ein wenig drauf an :)

Da du Sprache und Einheiten unabhängig voneinander handhabst, wirst du auch beide einzeln hinterlegen und laden müssen (z.B. via ResourceBundle).
Am "saubersten" scheint es für mich bisher, dass die GUI sich nur die Übersetzungstexte holt ("Geschwindigkeit", "Speed", ...).
Die Einheiten gehören ja zur Berechnung (zum Modell) und sollten daher hierrüber ermittelt werden. Wenn das Modell seine Einheit ändert müssen die Labels auf der GUI neu zusammengesetzt werden. Ich halte es zumindest für unsinnig alle Übersetzungstexte n-mal zu hinterlegen, jeweils mit einer anderen Einheit.

Das Modell sollte die Einheiten auch nicht als String zurückgeben sondern idealerweise intern mit Enums oder Konstanten o.Ä. arbeiten. So ist auch hier die GUI frei eine entsprechende Übersetzung zu finden.

Ob du das ganze Ermitteln der "Einheit zu String" in eine Helferklasse (AutiI18N) auslagerst ist deine Entscheidung. Kann durchaus sinnvoll sein.

In den Properties mit den Übersetzungen kannst du auch direkt Formatierungen für String.format() angeben, z.B.:

Code:
label.speed=Geschwindigkeit [%s]

Das kann man dann z.B. so als Labeltext setzen:
Java:
lblSpeed.setText( String.format( myBundle.getString("label.speed"), AutoI18N.unitToString(unit) ) );
 

godi

Aktives Mitglied
Vielen Dank!

Das mit String.format() hört sich schon mal gut.
Ich glaube so werde ich es jetzt einmal Probieren wie in deinem Beispiel mit einer Extraklasse UnitsI18N da ich doch mehrere verschiedene Einheiten benötige.

godi
 

Ähnliche Java Themen

Neue Themen


Oben