Archive for the “Code” Category

Hallo zusammen,

da ich mich in der letzten Zeit mit der Internationalisierung unter GWT ( Google Web Toolkit – WikiHomepage ) beschäftigt habe und es teilweise nicht einfach war wollte ich mal die Lösung an dem Standard GWT Beispiel hier zur Verfügung stellen.

Was muss gemacht werden?
Zunächst brauchen wir eine Datei die z.B. “MyConstants.properties”. Dort werden die “Schlüssel” reingeschrieben z.B.
“HelloWorld = Hello World”. Dies ist die default Datei, wenn der GWT Browser geladen wird dann wird aus dieser Datei die “Schlüssel” geladen.

Beispiel:

1
2
helloworld = Hello World.
clickme = Click me.

Alle anderen Dateien, für die Internationalisierung müssen den gleichen Namen wie die Default-Datei besitzen jedoch mit “[...]_de.properties” für Deutsch. Beispiel: “MyConstants_de.properties”

Ein weiterer Punkt ist in der “.gwt.xml”. Dort müssen wir das Modul einfügen.

1
2
3
	<!-- Internationalization -->
	<extend-property name='locale' values='de' />
	<extend-property name='locale' values='en' />

Danach brauchen wir eine Datei die sich dann “MyConstants.java” nennt. Dort kommt dann das Interface mit den Methoden rein. Bei mir sieht das wie folgt aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package <packageName>;
 
import com.google.gwt.i18n.client.Constants;
 
/**
 * Interface for Internationalization in GWT
 * 
 */
 
public interface MyConstants extends Constants
{
	String helloworld();
	String clickme();
}

So, nachdem wir dann auch diese Datei haben können wir uns an das Hauptthema wenden. Wir haben die Properties-Datein, wir haben das Interface nun kommen wir zur Haupt-Datei.

Zu Beginn suchen wir uns den “Entry Point” und fügen dort folgene Zeile ein.

1
2
3
4
public class <KlassenName> implements EntryPoint {
 
	MyConstants constants = (MyConstants) GWT.create(MyConstants.class);
[...]

Nachdem wir das nun auch haben können wir die “Schlüssel” verwenden. Das sieht wie folgt aus (Beispiel aus der “Test Application” von GWT selber)

1
2
3
4
5
  public void onModuleLoad() {
 
    final Button button = new Button(constants.clickme());
 
[...]

Hier wird ein Button erstellt. Was man sehr gut sehen kann ist , dass wir für den Text im Button nun die Funktion clickme() aufrufen die dann den entsprechenden Schlüssel aufruft und anhand des locale-Parameters (später dazu mehr) die entsprechende Sprache dazu aufgerufen und ausgegeben wird.

Der locale-Parameter wird ganze einfach verwendet. Indem man in der URL ein “?locale=” anhängt und nach dem Gleichheitszeichen noch die Abkürzung benutzt ( Deutsch = de, Englisch = en, Japanisch = jp etc. ) sowie die Seite neu lädt wird die entsprechende Sprache geladen. Will man Beispielsweise (in meinem Beispiel wurde die default-Datei bzw. default-Sprache geladen) Deutsch angezeigt bekommen muss 1. die Datei MyConstants_de.properties existieren und es muss in der URL “.html?locale=de” und in der “.gwt.xml” muss

1
	<extend-property name='locale' values='de' />

stehen damit es richtig Funktioniert.
Habe ich was vergessen? Ich denke nicht. Wurde das gemacht müsste es funktionieren. Das blöde an der Sache ist nur das man die Seite neu laden muss um eine andere Sprache zu wählen. ( Jedenfalls ist das auch bei dem GWT-Example zur Internationalisierung auch so )

Hier nochmal alle meine Dateien:

Test.gwt.xml:
show

MyConstants.properties
show

MyConstants_de.properties
show

MyConstants.java
show

Test.java
show

Comments No Comments »

Hallo zusammen,

da ich mich jetzt mit einem Thema rumgeschlagen habe und immer wieder tolle Foren-Beiträge fand wo drin stand: “Ich habe ein Problem” …. “hab das Problem selber gelöst” … aber die Lösung wird nicht veröffentlicht. Deshalb werde ich hier mal meine Lösung präsentieren.

Folgendes Problem:
Ich habe auf einer Seite ein paar Hyperlinks (Anzahl ist egal), wenn ich auf diese Links drauf Klicke soll eine Ebene mit einem Text angezeigt werden. Meine Überlegung war es das ganze mit JavaScript zu machen damit die Seite nicht neu geladen werden muss. Nach kurzem stöbern unter google.de fand ich auch schon das passende.

Ebene anzeigen:

1
document.getElementById('EbenenName').style.display = 'block';

Ebene ausblenden:

1
document.getElementById('EbenenName').style.display = 'none';

Das Problem bestand jetzt nur das ich für jeden Link die Zeilebene einblenden und alle anderen Ebenen ausblenden musste, was wie folgt aussah:

1
2
3
4
<a href="javascript:show('Unterpunkt1'); 
                    hide('Unterpunkt2'); 
                    hide('Unterpunkt3'); 
                    hide('Unterpunkt4');">test - Unterpunkt1</a>

show() ist die Funktion um die Ebene anzuzeigen und hide() um sie auszublenden. Unterpunkt1/2/3/4 sind die Namen der Ebenen 1-4.
Diese Lösung war aber sehr unschön, da jeder Link “seine” Ebene einschalten und alle anderen ausschalten musste und somit der Code für jeden Link verlängert wird.

Daraufhin bin ich folgende Lösung gestoßen:

1
2
3
4
5
6
7
8
9
function show(ID)
{
	var divs = document.getElementsByTagName('div');
	for (var i = 0; i < divs.length; i++) {
		document.getElementsByTagName('div')[i].style.display = 'none';
	}
	showSite();
	document.getElementById(ID).style.display = 'block';
}

diese Funktion blendet erst alle Ebenen aus und zeigt dann nur die an, die übergeben wird.
Die Funktion showSite (Zeile 7) blendet nur die einzelnen Ebenen ein, die dauerhaft angezeigt werden sollen.

Dadurch kann man beliebig viele Links haben die wie folgt aussehen müssen:

1
<a href="javascript:show('Unterpunkt1')">test - Unterpunkt1</a>

Comments No Comments »