All posts by Marco

Zentrale Lokalisierung in einer angularJS App

angularJS ist großartig und macht Spaß. Je mehr Code ich damit entwickle, umso begeisterter bin ich.

Um auch in unserer Web App einen zentralen Platz für unsere Lokalisierungen zu haben, habe ich einen Service geschrieben, der sich zentral um die Lokalisierung von allen Texten kümmern soll. Als Java-Entwickler wollte ich etwas ähnliches entwickeln, wie ResourceBundles und Properties-Dateien.

Meine Lösung ist als Angular-Service implementiert und die Lokalisierungstexte sind in JSON-Dateien ausgelagert. Der Service lädt die passende JSON-Datei asynchron per [highlight1]$http-Service[/highlight1] nach und stellt die Texte systemweit über eine [highlight1]localizationService.translate()[/highlight1]-Methode zur Verfügung. Die Lokalisierungsstrings lassen sich den Java-Properties parametrisieren, wobei die aktuelle Implementierung nur einen Parameter auswertet, weil wir aktuell nur einen benötigen. Die Formatierung greift dabei auf eine format-Methode am String-Prototyp zurück.

Hinweis: der Code um die Browsersprache zu erkennen fehlt, damit der Code einfacher zu verstehen ist.

	function localizationServiceFactory($http, $q) {
		var translationsDE, errorMessage;

		function loadTranslations() {
			var deferred = $q.defer();

			if (!translationsDE) {
				$http.get("/json/translations/translationsDE.json").then(
					function(data) {
						translationsDE = data;
						errorMessage = '';
						deferred.resolve();
					},
					function(error) {
						translationsDE = {};
						errorMessage = error;
					}
				);
			} else {
				deferred.resolve();
			}

			return deferred.promise;
		}

		function translate(key, param) {
			var translation = "";

			return loadTranslations().then(function() {
				if (key) {
					translation = translationsDE[key];

					//unbekannter Key = gib Key zurück
					if(!translation) {
						translation = key;
					}

					if (param) {
						translation = translation.format(param);
					}
				}

				return translation;
			});
		}

		return {
			translate:translate
		};
	}

	localizationServiceFactory.$inject = ['backendService', '$q'];
	angularModule.factory("localizationService", localizationServiceFactory);
{
	"MEIN_STRING": "Das ist die Lokalisierung",
	"NOCH_EIN_STRING": "Und noch eine",
	"FALSCHER_BENUTZER": "Benutzername {0} wurde nicht gefunden."
}
//format Methode, {0} {1} usw.
if (!String.prototype.hasOwnProperty("format")) {
	String.prototype.format = function() {
		var formatted, i, regexp;
		formatted = this;
		for (i = 0; i < arguments.length; i++) {
			regexp = new RegExp('\\{'+i+'\\}', 'gi');
			formatted = formatted.replace(regexp, arguments[i]);
		}
		return formatted;
	};
}

Das wirklich schöne an dem Service ist, dass er die JSON-Datei asynchron nachlädt, wenn sie gebraucht wird. Wenn man den Code zur Spracherkennung entsprechend baut, lädt er auch nur die tatsächlich benötigte Lokalisierung. Nicht benötigte Lokalisierungen landen erst gar nicht im Browser.

Was mich am meisten beeindruckt hat, ist der Umgang von AngularJS mit dem [highlight1]Promise-Objekt[/highlight1] das die translate-Methode in jedem Fall zurückgibt. In diesem Fall sorgt angularJS nämlich automatisch dafür, dass die Aufrufe von translate aus einem Controller heraus synchron aufgelöst werden, sodass man im Controller ohne besonderes Zutun auf jeden Fall einen lokalisierten String bekommt, obwohl der $http-Request asynchron abläuft und zum Zeitpunkt des Aufrufes eventuell noch gar nicht abgeschlossen ist.

Man könnte es fast als Magie bezeichnen 🙂

Watch Full Movie Online xXx: Return of Xander Cage (2017)

xXx: Return of Xander Cage (2017) HD

Director : D.J. Caruso.
Writer : Chad St. John, F. Scott Frazier.
Producer : Neal H. Moritz, Jeff Kirschenbaum, Joe Roth, Samantha Vincent, Vin Diesel.
Release : January 13, 2017
Country : United States of America.
Production Company : Paramount Pictures, Original Film, Revolution Studios, One Race Films.
Language : English.
Runtime : 107 min.
Genre : Action, Adventure, Crime, Thriller.

Movie ‘xXx: Return of Xander Cage’ was released in January 13, 2017 in genre Action. D.J. Caruso was directed this movie and starring by Vin Diesel. This movie tell story about Extreme athlete turned government operative Xander Cage comes out of self-imposed exile, thought to be long dead, and is set on a collision course with deadly alpha warrior Xiang and his team in a race to recover a sinister and seemingly unstoppable weapon known as Pandora’s Box. Recruiting an all-new group of thrill-seeking cohorts, Xander finds himself enmeshed in a deadly conspiracy that points to collusion at the highest levels of world governments.

Streaming Full Movie xXx: Return of Xander Cage (2017) Online

Do not miss to Watch movie xXx: Return of Xander Cage (2017) Online for free with your family. only 2 step you can Watch or download this movie with high quality video. Come and join us! because very much movie can you watch free streaming.

Watch Full Movie xXx: Return of Xander Cage (2017)

Incoming search term :

Watch xXx: Return of Xander Cage 2017 Online Free megashare, watch xXx: Return of Xander Cage film online now, xXx: Return of Xander Cage 2017 Episodes Watch Online, xXx: Return of Xander Cage live streaming movie, download film xXx: Return of Xander Cage now, Watch xXx: Return of Xander Cage 2017 Online Free Viooz, watch film xXx: Return of Xander Cage now, streaming xXx: Return of Xander Cage 2017 film, xXx: Return of Xander Cage 2017 English Full Episodes Download, streaming movie xXx: Return of Xander Cage 2017, Watch xXx: Return of Xander Cage 2017 Online Free, xXx: Return of Xander Cage 2017 Full Episodes Watch Online, film xXx: Return of Xander Cage download, xXx: Return of Xander Cage streaming, download movie xXx: Return of Xander Cage now, xXx: Return of Xander Cage 2017 For Free online, Watch xXx: Return of Xander Cage 2017 Online Viooz, xXx: Return of Xander Cage 2017 English Full Episodes Free Download, xXx: Return of Xander Cage 2017 HD Full Episodes Online, xXx: Return of Xander Cage 2017 Watch Online, xXx: Return of Xander Cage 2017 film trailer, film xXx: Return of Xander Cage 2017 trailer, xXx: Return of Xander Cage 2017 English Episodes Free Watch Online, xXx: Return of Xander Cage 2017 English Full Episodes Online Free Download, xXx: Return of Xander Cage 2017 Full Episodes Online, xXx: Return of Xander Cage 2017 Online Free Megashare, watch full film xXx: Return of Xander Cage 2017 online, xXx: Return of Xander Cage 2017 Full Episode, download xXx: Return of Xander Cage 2017 movie now, xXx: Return of Xander Cage 2017 HD English Full Episodes Download, watch full movie xXx: Return of Xander Cage 2017 online, movie xXx: Return of Xander Cage, Watch xXx: Return of Xander Cage 2017 Online Free putlocker, Watch xXx: Return of Xander Cage 2017 Online Megashare, xXx: Return of Xander Cage 2017 English Episodes, streaming film xXx: Return of Xander Cage 2017, Watch xXx: Return of Xander Cage 2017 Online Putlocker, xXx: Return of Xander Cage movie download, movie xXx: Return of Xander Cage 2017 trailer, Watch xXx: Return of Xander Cage 2017 Online Free Putlocker, xXx: Return of Xander Cage 2017 live streaming film, xXx: Return of Xander Cage 2017 English Full Episodes Watch Online, xXx: Return of Xander Cage 2017 For Free Online, xXx: Return of Xander Cage 2017 English Episode, xXx: Return of Xander Cage 2017 Episodes Online, trailer movie xXx: Return of Xander Cage 2017,

Milestone-Releases von JSF 2.2 auf Glassfish 3.1 testen

Markus Eisele hat heute eine Anleitung veröffentlicht, wie man aktuelle Milestone-Releases von Mojarra JSF 2.2 auf Glassfish 3.1.2.2 testen kann, sodass man keinen JEE7 Container wie Glassfish 4 mehr braucht.

Trotz dass Mojarra JSF 2.2 eigentlich kompatibel zu JEE6 Containern ist und somit eigentlich keine Probleme machen sollte, muss man in der aktuellen Version von Glassfish 3.1.2.2 die im Glassfish gebundelte Version von JSF austauschen. Eine Projekt-Abhängigkeit reicht wohl nicht aus.

Markus beschreibt das recht anschaulich und es ist z.B. deutlich einfacher als im JBoss 7.1 ein Myfaces 2.1 einzubauen (was praktisch gar nicht funktioniert).

Somit kann man sich jetzt schon mal mit dem neuen HTML5-Modus in JSF 2.2 beschäftigen.

grunt – Ein Javascript Build Tool

Momentan beschäftige ich mich erstmals mit einer reinen Javascript Web App, die komplett aus statischen HTML- und JS-Dateien besteht und über eine REST-Schnittstelle mit (dynamischen) Daten versorgt wird. Als Technologien verwende ich dabei so interessante Sachen, wie [highlight1]angularJS[/highlight1], [highlight1]jQuery Mobile[/highlight1] und [highlight1]Jasmine[/highlight1]. Alles super spannend.

Aber wie verwaltet man so eine App im professionellen Einsatz, wenn man an Maven als Build-, Dependency Management- und Deployment-Tool gewohnt ist? Und im Jenkins (Continous Integration) soll es natürlich ebenfalls integrierbar sein. Und regelmässige Unit-Tests sollen auch ausgeführt werden. Und automatisch verteilte Builds, die ins automatische Deployment einlaufen.

Einfach mal die HTML- und JS-Dateien manuell ins Apache-Verzeichnis zu kopieren, kommt jedenfalls nicht in Frage.

Continue reading grunt – Ein Javascript Build Tool

Kommentare in JSON

Fun Fact: Es gibt keine offizielle Möglichkeit in JSON-Daten Kommentare unterzubringen.

Gerade als Entwicklerteam, dass sich erstmals mit JSON, Javascript und Client-Programmierung beschäftigt, sind Kommentare eine gute Möglichkeit sich zu erklären. Deshalb war ich überrascht, dass es tatsächlich keine Kommentare in JSON gibt.

In den ersten Versionen des Standards gab es zwar Kommentare, aber nachdem Douglas Crockford nicht gefiel, was die Leute mit Kommentaren anstellten, hat er sie ersatzlos aus dem Standard entfernt.

Nichtsdestotrotz halte ich diese Entscheidung für völlig falsch. Es ist für mich einfach völlig unverständlich warum z.B. in einer “package.json”-Konfigurationsdatei keinerlei Kommentare möglich sind, um bestimmte Einstellungen anderen Entwicklern zu erklären.

Als Konvention könnte man sich aber z.B. darauf einigen, Kommentare in der Datenstruktur selbst unterzubringen und diese Daten einfach nicht verarbeiten. Beispiel:

{
   "__comment" : "Das hier ist ein Kommentar",
   "success" : true,
   "data": {
      "title": "Es",
      "author": "Stephen King", 
      "isbn": "1234567890"
   }
}

Für Puristen sicher ein Graus, aber leider so ziemlich die einzige Möglichkeit.

Eine längere Abhandlung und auch eine Erklärung der Historie findet sich im getiblog