Eclipse Externalize (Concatenated) Strings

T

tuxedo

Gast
Hallo zusammen,

ich hab die leidige Aufgabe eine bestehende Eclipse RCP Anwendung fit für I18N zu machen.

Eclipse bietet da ja einen netten Wizard "Externalze Strings" an. Für einfache Strings ist das ja eine gute Sache. Aber dummerweise haben die Entwickler der Anwendung überall und ständig Strings zusammengesetzt:

Java:
boolean value = MessageDialog.openConfirm(HandlerUtil.getActiveShell(aEvent), "Input Mode", "Do you want to switch Input Mode to " + menuItemLabel + " for following Module(s):\n " + ss);

Der Wizard hat da einen recht einfachen Workflow: Alles was in "..." steht als ein zu übersetzender String im Wizard anbieten. Alles andere: Pustekuchen :autsch:

Weiß jemand ob Eclipse da eine (Refactor-)Hilfe anbietet um sowas zu bereinigen? Oder gibt's für sowas Plugins?
Wenn ich das alles von Hand einzeln umbauen muss, sitze ich da in einem Jahr noch dran... ;(

Gruß
Alex
 
Zuletzt bearbeitet von einem Moderator:
N

nillehammer

Gast
Wenn in dem String variablen vorkommen, wie soll Externalisierung dann überhaupt funktionieren? Oder sind menuItemLabel und ss etwa Konstanten und die Programmierer haben auf Code-Conventions geschissen?
 
T

tuxedo

Gast
Das geht 8http://help.eclipse.org/helios/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Freference%2Fref-wizard-externalize-strings.htm). Aber der Wizard bietet das eben leider nicht an. Und alles von Hand nachträglich umbauen wird wohl verdammt lange dauern... Deshalb suche ich nach einer Hilfe/Funktion/Wizard das einem dabei unterstützt.

- Alex
 
N

nillehammer

Gast
Jaa ich weiß, was Externalization von Strings bei Eclipse ist. Bei Deinem Beispielcode sind aber Variablen "menuItemLabel und ss" drinnen. Wie soll Eclipse da einen sinnvollen Wert finden, wenn der ja erst zur Laufzeit bekannt ist? Oder, nochmal die Frage: Sind menuItemLabel und ss etwa Konstanten und die Programmierer haben auf Code-Conventions geschissen?
 
S

SlaterB

Gast
also ich weiß nicht exakt wie Externalization von Strings bei Eclipse funktioniert, aber sehe wiederum kein Problem mit den Variablen,
warum sollte nicht [c]"Hello World"+x[/c]
in [c]getString("KeyHW")+x[/c] umgewandelt werden können, wobei die Methode dann je nach Sprache "Hello World" oder "Hallo Welt" liefert?

vielleicht wird das letzlich nicht schön herauskommen,
aber wenn x irgendein Eigenname oder gar eine Zahl wäre, dann hätte man in diesem Fall ein brauchbares Ergebnis
 
T

tuxedo

Gast
Wieso müssen das Konstanten sein?

Der gesuchte Wizard müsste doch nur erkennen:

Java:
"Do you want to switch Input Mode to " + menuItemLabel + " for following Module(s):\n " + ss

Aha, Da gibt's mehrere Strings und Variablen die zu einem Gesamt-String zusammengesetzt werden sollen. Also alle Variablen (egal ob Konstante oder nicht) herausnehmen und durch {} ersetzen:

Java:
"Do you want to switch Input Mode to {} for following Module(s):\n {}"

Diesen dann mit einem vom Entwickler definierten Namen in die message.orpperties reinschrieben:

Code:
MyClassIdentifier_MyKeyIdentifier=Do you want to switch Input Mode to {} for following Module(s):\n {}

Und die herausgenommenen Variablen mit dem von Variablen befreiten String so in den Sourcecode einbauen:

Java:
Messages.bind(Messages.MyClassIdentifier_MyKeyIdentifier, new Object[]{menuItemLabel, ss})

Hatte bis jetzt die Hoffnung dass es ein Hilfsmittel gibt dass das kann. Aber bis dato bin ich nicht fündig geworden.
 
T

tuxedo

Gast
Jaa ich weiß, was Externalization von Strings bei Eclipse ist. Bei Deinem Beispielcode sind aber Variablen "menuItemLabel und ss" drinnen. Wie soll Eclipse da einen sinnvollen Wert finden, wenn der ja erst zur Laufzeit bekannt ist?

Wo ist das Problem mit Nicht-Konstanten? Internationalisierung ist nicht hard-coded und somit immer von der Laufzeit abhängig. Warum also nicht auch Variablen in einem internationalisierten Dialog?
 
N

nillehammer

Gast
tuxedo hat gesagt.:
Wieso müssen das Konstanten sein?

Der gesuchte Wizard müsste doch nur erkennen:
[...]
Müssen tut es das natürlich nicht. Der von Dir (jetzt endlich) beschriebene Anwendungsfall macht 100% Sinn. Mit Konstanten wäre es evtl. leichter gewesen. So out of the box geht das mit der Eclipse-Funktion leider nicht. Du könntest ihr aber ein bischen helfen, indem Du Deinen Quellcode vorher mit Find/Replace unter zur Hilfename von Regexes etwas aufhübschst. Ein erster Ansatz wäre evtl, die mit "+" konkatonierten Strings zu einem einzigen zu machen. Die Regexen dafür wären:
Code:
"\s*\+
: String-Konstante hört mit " auf, dann kommen beliebig viele Whitespaces, dann kommt das +
Code:
\+\s*"
: String-Konstante fängt mit " an, davor kommen beliebig viele Whitespaches, davor das +
Das könntest Du durch schlicht nichts ersetzen. Die Kompilierfehler mit den ggf. fehlenden " am Ende eines Strings dann selbst beheben. Die Regexen kann man sicher noch verfeinern, um sich Handarbeit zu ersparen, aber Fummelkram bleibt das trotzdem...
 

Oben