Spring Boot i18n

Diskutiere Spring Boot i18n im Allgemeines EE Bereich.
Bitte aktiviere JavaScript!
S

Schuriko

In einer Thymlef - Web - Anwendung habe ich in src\main\ressources die Dateien

  • messages.properties
  • messages_en.properties
  • messages_de.properties
Der Inhalt dieser Dateien ist identisch
Code:
app.name=Editor
app.verson=V1.0
Die Datei ist ISO-8859-1

Meine Thymlef sieht wie folgt aus:
Code:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <title th:text="${title == null} ? #{app.name} + ' ' + #{app.version} : #{app.name} + ' ' + #{app.version} + ' - ' + #{${title}}">Title</title>
    
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    
        <link rel="stylesheet"
            href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
        <link th:href="@{/css/style.css}" rel="stylesheet" media="screen" />
    
        <!-- JQuery  -->
        <script
            src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    
        <!-- Bootstrap  -->
        <script
            src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    
        <!-- JQuery UI  -->
        <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
    
        <!-- Own Actions -->
        <script th:src="@{/js/actions.js}"></script>
    </head>

    <body>
        Editor
    </body>
</html>
Ausgeben tut er allerdings "??app.name_en_US??". Anscheinend habe ich irgendetwas übersehen, Wer kann mir sagen was?
 
J

JustNobody

Hast Du denn das auch konfiguriert? Auf die Schnelle habe ich das z.B. einmal unter https://im-coder.com/i18n-in-spring-boot-thymeleaf.html gefunden.

Ginge aber auch mit spring profiles und einer yaml Config (https://www.marcelustrojahn.com/2016/12/springboot-thymeleaf-i18n-internationalization/)

Die Links sind einfach nur erste Treffer und nicht unbedingt sehr gut. Aber mir geht es erst einmal um die Frage, ob Du da was gemacht hast oder nicht oder wie Du meinst, der Applikation gesagt zu haben, das zu nutzen....
 
T

thecain

Das ist Quatsch. Das sind offizielle i18n Standards bei Java. Wenn en_US nicht definiert ist, sollte en verwendet werden.
 
T

TM69

@JustNobody das ist völliger Nonsens. Es funktioniert auch ohne messageSource, wie @thecain schon feststellt. Die Funktion messageSource aus https://im-coder.com/i18n-in-spring-boot-thymeleaf.html wird nur benötigt, wenn du

  1. eine andere Codierung für deine Properties Dateien hast
  2. wenn deine Properties Dateien in einem anderen Ordner und nicht in dem Standardorder src/main/resources befinden.
  3. weitere (abweichende) Angabe treffen willst
Standardmäßig wird message_en_us.properties verwendet. Nur wenn diese Datei nicht existiert, wird message_en verwendet und wenn diese auch nicht existiert die default message.properties.

Was mir auf den ersten Blick auffällt, ist das du "app.verson" in deiner properties hast. Du aber in der HTML - Datei "app.version" verwendest.
 
J

JustNobody

@JustNobody das ist völliger Nonsens.
Ich finde es immer toll, wenn Leute so freundliche Aussagen machen ...

Es funktioniert auch ohne messageSource, wie @thecain schon feststellt.
... und dann nicht einmal Postings verstehen .... @thecain bezog sich zumindest nach meinem Verständnis nicht auf meinen Beitrag ....

Die Funktion messageSource aus https://im-coder.com/i18n-in-spring-boot-thymeleaf.html wird nur benötigt, wenn du

  1. eine andere Codierung für deine Properties Dateien hast
  2. wenn deine Properties Dateien in einem anderen Ordner und nicht in dem Standardorder src/main/resources befinden.
  3. weitere (abweichende) Angabe treffen willst
Standardmäßig wird message_en_us.properties verwendet. Nur wenn diese Datei nicht existiert, wird message_en verwendet und wenn diese auch nicht existiert die default message.properties.
Danke für Ergänzung. Aber Punkt 2 ist schlicht scheiße formuliert. Wenn Du hier schon so auftrittst, dann solltest Du korrekte Formulierungen verwenden. Wenn mein Build die Ressourcen nicht in src/main/resources behandelt, dann bringt es eben absolut nichts, wenn die Dateien in src/main/resources liegen!
Was mir auf den ersten Blick auffällt, ist das du "app.verson" in deiner properties hast. Du aber in der HTML - Datei "app.version" verwendest.
Was aber nicht die Kernursache sein kann, da ja app.name auch problematisch ist.

Und da eben genau dies schon nicht klappt, muss bei den von Dir genannten Punkten irgendwo der Wurm drin sein. Und schon wird aus meinem angeblichen Nonsense eine möglicherweise hilfreiche Information. Dies dürfte auf jeden Fall mehr helfen als nur der Typo in version...
 
M

mrBrown

Aber Punkt 2 ist schlicht scheiße formuliert. Wenn Du hier schon so auftrittst, dann solltest Du korrekte Formulierungen verwenden. Wenn mein Build die Ressourcen nicht in src/main/resources behandelt, dann bringt es eben absolut nichts, wenn die Dateien in src/main/resources liegen!
War eher drauf bezogen, dass die Datei direkt in den Resourcen liegen muss, und nicht in zB src/main/resources/i18n/ :)
 
J

JustNobody

War eher drauf bezogen, dass die Datei direkt in den Resourcen liegen muss, und nicht in zB src/main/resources/i18n/ :)
Ja, das war mir schon klar. Aber dennoch ist es nur dann wirklich korrekt, wenn angegeben wird, wo die Datei nach dem Buildvorgang liegen muss. Ohne Informationen zum verwendeten Build Tool ist die Aussage, dass etwas unter src/main/resources liegt, schlicht nicht aussagekräftig.

BTW @Schuriko:c\main\ressources ist ein Tippfehler oder ist der Ordner wirklich ressources was in Ordnung sein kann, so er als Ordner für Ressourcen vom Build Tool verwendet wird.
 
T

TM69

@mrBrown: korrekt.

Ich finde es immer toll, wenn Leute so freundliche Aussagen machen ...
Dieses bezog sich darauf, wie ein auch näher erklärt, darauf das man für i18n die Angaben nicht zwangsläufig benötigt, wie der Artikel versucht zu assoziieren.

... und dann nicht einmal Postings verstehen .... @thecain bezog sich zumindest nach meinem Verständnis nicht auf meinen Beitrag ....
Ich glaube schon das er sich auf deinen Beitrag bezog.

Danke für Ergänzung. Aber Punkt 2 ist schlicht scheiße formuliert. Wenn Du hier schon so auftrittst, dann solltest Du korrekte Formulierungen verwenden. Wenn mein Build die Ressourcen nicht in src/main/resources behandelt, dann bringt es eben absolut nichts, wenn die Dateien in src/main/resources liegen!
Was möchtest Du uns denn mitteilen????? O.O

Was aber nicht die Kernursache sein kann, da ja app.name auch problematisch ist.

Und da eben genau dies schon nicht klappt, muss bei den von Dir genannten Punkten irgendwo der Wurm drin sein. Und schon wird aus meinem angeblichen Nonsense eine möglicherweise hilfreiche Information. Dies dürfte auf jeden Fall mehr helfen als nur der Typo in version...
Nur weil DU dich angegriffen fühlst, was mich persönlich wenig tangiert, war dieses auch nur eine Feststellung, dass mein Typo nur eine kleine Korrektur war, und bewusst keine Lösung darstellt.

Ich sehe aber auch nicht wo deine 1. Posting eine Lösung darstellen sollte, wenn wir schon mal dabei sind.
 
Zuletzt bearbeitet von einem Moderator:
J

JustNobody

Es ist schön, das Du dies glaubst. Du darfst auch glauben, was immer Du möchtest. Nur bitte erläutere dann doch einmal, in wie weit "wenn en_US nicht definiert ist, sollte en verwendet werden." sich auf meinen Beitrag beziehen kann. Das wird Dir dann ja einfach fallen, dies zu begründen ...
 
T

thecain

@TM69 und @JustNobody ich bezog mich auf den Beitrag von @krgewb der jetzt weg ist. Wo etwas drin stand von wegen es gibt verschiedene Kürzel mit eng und deu oder so...

Jetzt ist er wegeditiert.
 
T

TM69

Es ist schön, das Du dies glaubst. Du darfst auch glauben, was immer Du möchtest. Nur bitte erläutere dann doch einmal, in wie weit "wenn en_US nicht definiert ist, sollte en verwendet werden." sich auf meinen Beitrag beziehen kann. Das wird Dir dann ja einfach fallen, dies zu begründen ...
Ich gehe jetzt mal davon aus das du mich meintest: Weil dieses so definiert ist, dass Standardmässig en_US verwendet wird, und wenn dieses nicht angegeben ist halt en, wie oben schon erklärt.

Was ich nur nicht verstehe ist, wie du einen Bezug zwischen "wenn en_US nicht definiert ist, sollte en verwendet werden." und deinem 1. Posting herstellst?
 
J

JustNobody

Ich gehe jetzt mal davon aus das du mich meintest: Weil dieses so definiert ist, dass Standardmässig en_US verwendet wird, und wenn dieses nicht angegeben ist halt en, wie oben schon erklärt.

Was ich nur nicht verstehe ist, wie du einen Bezug zwischen "wenn en_US nicht definiert ist, sollte en verwendet werden." und deinem 1. Posting herstellst?
Ok, das mit Dir wird mir jetzt schlicht zu blöd. Den Zusammenhang hast Du aufgebracht, denn Du hast ja auch behauptet: "Ich glaube schon das er sich auf deinen Beitrag bezog."

Und dann zeige ich auf, dass es Gründe gibt, die das Gegenteil zeigen und dann kommt das? Also Dir irgendwas zu entgegnen bringt irgendwie nichts, daher stelle ich das jetzt erst einmal ein...
 
T

TM69

Ok, das mit Dir wird mir jetzt schlicht zu blöd. Den Zusammenhang hast Du aufgebracht, denn Du hast ja auch behauptet: "Ich glaube schon das er sich auf deinen Beitrag bezog."

Und dann zeige ich auf, dass es Gründe gibt, die das Gegenteil zeigen und dann kommt das? Also Dir irgendwas zu entgegnen bringt irgendwie nichts, daher stelle ich das jetzt erst einmal ein...
Dann drücke dich klarer aus. Wenn du Fehler in meinen Aussagen siehst, dann fordere ich dich jetzt hier auf dieses zu Beweisen, andernfalls solltest du mal über deine Argumentation und Wissensstand nachdenken.
 
J

JustNobody

Was soll ich beweisen? Meine Aussage war eigentlich klar und deutlich. Wenn du zu blöd bist, dann ist es nicht mein Problem! Aber extra für Anfänger wie dich:
Du hast in deinem Punkt gesagt, dass die Datei in src/main/resources liegen soll. Und das ist natürlich nicht exakt und setzt eine build Konfiguration voraus, die die Sourcen von dort eben nimmt und behandelt.

Das muss aber nicht zwingend der Fall sein! Mach einfach ein IntelliJ Projekt und markiere andere Ordner als resource Ordner. Oder übersetze es mit ant ohne dass du da die Ressourcen mit betrachtest.

Ist nur wirklich mehr als trivial. Und ein Beweis kannst du dir selbst basteln: Bau dir ein kleines ant Filet zum bauen des Projektes und packt die Ressourcen einfach nicht an ... dann liegen sie in dem Ordner wie von dir gefordert und es reicht eben nicht.
 
T

TM69

Was soll ich beweisen? Meine Aussage war eigentlich klar und deutlich. Wenn du zu blöd bist, dann ist es nicht mein Problem! Aber extra für Anfänger wie dich:
Du hast in deinem Punkt gesagt, dass die Datei in src/main/resources liegen soll. Und das ist natürlich nicht exakt und setzt eine build Konfiguration voraus, die die Sourcen von dort eben nimmt und behandelt.

Das muss aber nicht zwingend der Fall sein! Mach einfach ein IntelliJ Projekt und markiere andere Ordner als resource Ordner. Oder übersetze es mit ant ohne dass du da die Ressourcen mit betrachtest.

Ist nur wirklich mehr als trivial. Und ein Beweis kannst du dir selbst basteln: Bau dir ein kleines ant Filet zum bauen des Projektes und packt die Ressourcen einfach nicht an ... dann liegen sie in dem Ordner wie von dir gefordert und es reicht eben nicht.
Nur weil DU kein deutsch verstehst, eindeutig fehlenden Wissensstand aufweist, und darauf auf beleidigende Art reagierst macht dich gerade einfach nur lächerlich.

Ich zitiere hier jetzt mal:
By default, a Spring Boot application will look for message files containing internationalization keys and values in the src/main/resources folder.
Ich habe nirgendwo geschrieben, dass, wie Du anscheinend versuchst, mir zu unterstellen "Das muss aber nicht zwingend der Fall sein..". Bereits in meinem ersten Beitrag habe ich dieses erwähnt.
 
Zuletzt bearbeitet:
J

JustNobody

Also wenn Du zitierst, dann gib doch bitte auch die Quelle an.

Ich nehme mal an, dass Du das Zitat von Baeldungs Guide hast und da geht es um ein reines maven Projekt. Dies ist aber hier im Thread nirgends vorgegeben gewesen. Ob hier also maven benutzt wird oder nicht ist also offen.

Du setzt also schlicht Dinge voraus, die nicht klar gegeben sind. Und ich habe nur auf diese Ungenauigkeit hingewiesen. Nicht mehr und nicht weniger.

Und die beleidigende Art ging doch von Dir aus. Also was willst Du eigentlich von mir? Hast Du nichts konstruktives beizutragen?
 
T

TM69

Also wenn Du zitierst, dann gib doch bitte auch die Quelle an.

Ich nehme mal an, dass Du das Zitat von Baeldungs Guide hast und da geht es um ein reines maven Projekt. Dies ist aber hier im Thread nirgends vorgegeben gewesen. Ob hier also maven benutzt wird oder nicht ist also offen.

Du setzt also schlicht Dinge voraus, die nicht klar gegeben sind. Und ich habe nur auf diese Ungenauigkeit hingewiesen. Nicht mehr und nicht weniger.

Und die beleidigende Art ging doch von Dir aus. Also was willst Du eigentlich von mir? Hast Du nichts konstruktives beizutragen?
Von mir kann ich keine einzige Beleidigung dir gegenüber feststellen, DU hingegen bist du ganze Zeit nur am rumflamen. Das dich einer der Admins noch nicht abgestraft hat verwundert mich jetzt etwas, aber egal.

Jetzt zur Kernaussage von deinem Schreiben:
Ich kann dir in der Physik auch beweisen, dass ein Elefant an einem Gänseblümchen an einer Steilklippe hängen kann.

Mit anderen Worten, oder damit DU es besser verstehst: Ich kann eine gegebene Tatsache so umbauen, dass es passen würde, ob dieses allerdings der Sinn des Threads mag ich an dieser Stelle mal ganz stark bezweifeln.
 
Zuletzt bearbeitet:
J

JustNobody

Also ich finde das mit den Fehlern nicht zugeben wirklich super. Du warst der Meinung, @thecain hätte sich auf mich bezogen, hätte irgend etwas bezüglich meiner Aussage schon gesagt ... Dem war aber doch nicht so. Also was genau möchtest Du?

Und die Formulierung findest Du gut?
"By default, a Spring Boot application will look for message files containing internationalization keys and values in the src/main/resources folder." (==> https://www.javadevjournal.com/spring-boot/spring-boot-internationalization/ )

Diese Formulierung finde ich weiterhin einfach unzutreffend. Hintergrund ist, dass es nach der Übersetzung eben genau diesen Ordner für die Applikation nicht gibt.

Und der Link von @thecain zeigt auch direkt, wie es besser geht: "By default, Spring Boot looks for the presence of a messages resource bundle at the root of the classpath."

Ansonsten habe ich eine Meinung geäußert und für diese Argumente gebracht. Das so als flamen ab zu tun ist interessant vor allem vor dem Hintergrund, dass Du pauschal etwas als "Nonsense" abtust und mindestens den Beitrag von @thecain falsch verstanden hast ... Aber das ist nicht weiter zu vertiefen...
 
T

TM69

Und die Formulierung findest Du gut?
"By default, a Spring Boot application will look for message files containing internationalization keys and values in the src/main/resources folder." (==> https://www.javadevjournal.com/spring-boot/spring-boot-internationalization/ )

Diese Formulierung finde ich weiterhin einfach unzutreffend. Hintergrund ist, dass es nach der Übersetzung eben genau diesen Ordner für die Applikation nicht gibt.

Und der Link von @thecain zeigt auch direkt, wie es besser geht: "By default, Spring Boot looks for the presence of a messages resource bundle at the root of the classpath."
[
Ein Blick auf den Titel auf das Thema und dir wäre sicherlich aufgefallen, dass es um Spring Boot geht. Kleine Zwischenfrage: Hast du mit Spring Boot schon einmal gearbeitet? Wenn ja, dann wüsstest du wo der Classpath hinzeigt und das Spring Boot dieses Verzeichnis beim generieren erzeugt / anlegt.

Ansonsten habe ich eine Meinung geäußert und für diese Argumente gebracht. Das so als flamen ab zu tun ist interessant vor allem vor dem Hintergrund, dass Du pauschal etwas als "Nonsense" abtust und mindestens den Beitrag von @thecain falsch verstanden hast ... Aber das ist nicht weiter zu vertiefen...
Wie bereits oben beschrieben, habe ich dieses auf den Artikel gemünzt. Da wie bereits erwähnt die Angaben in @config nicht zwangsläufig gebraucht werden, was der Artikel aber versucht zu assozieren.

DU hingegen warst, selbst nach der Klarstellung, nur am Beleidigen. Ich weiß zwar nicht was bei dir gerade schiefläuft und deine Beleidigungen interessieren mich auch nicht. Aber andere könnten hierauf allergisch reagieren.
 
J

JustNobody

Ein Blick auf den Titel auf das Thema und dir wäre sicherlich aufgefallen, dass es um Spring Boot geht. Kleine Zwischenfrage: Hast du mit Spring Boot schon einmal gearbeitet? Wenn ja, dann wüsstest du wo der Classpath hinzeigt und das Spring Boot dieses Verzeichnis beim generieren erzeugt / anlegt.
Ja, selbstverständlich habe ich schon einiges mit Spring und auch explizit mit Spring Boot gemacht.
Und nein, Spring Boot hat bei mir noch nie sowas von sich aus angelegt.

Redest Du hier evtl. vom Spring Initializr, der einen Projektrahmen erzeugen kann? (z.B. https://start.spring.io/) Der legt dann tatsächlich einen entsprechenden Rahmen an als Gradle oder Maven Projekt.

Aber Dir ist bewusst, dass man dies nicht zwangsläufig nutzen muss? Das es durchaus Leute gibt, die dies nicht nutzten wollen oder dürfen?

Und über die Projektstruktur und co wurde vom TE doch nichts gesagt. Daher ist eine solche Annahme schlicht blöd.

Und wenn man etwas mehr über die Abläufe wissen muss, dann ich so eine Aussage extrem hinfällig. In dem Projekt, in dem ich z.B. arbeite, wirst du kein src/main/resources finden - selbst bei Spring Boot Applikationen nicht :).
 
M

mrBrown

Ein Blick auf den Titel auf das Thema und dir wäre sicherlich aufgefallen, dass es um Spring Boot geht. Kleine Zwischenfrage: Hast du mit Spring Boot schon einmal gearbeitet? Wenn ja, dann wüsstest du wo der Classpath hinzeigt und das Spring Boot dieses Verzeichnis beim generieren erzeugt / anlegt.
Wenn ich das so lese würde ich die Frage an dich zurückgeben.

Spring Boot generiert selber keine Source-Verzeichnisse, die kann man auch mit mit jedem Build-Tool so konfigurieren, wie man will.

Damit, dass es nicht zwingend nach Maven-Konvention src/main/resources sein muss, hat @JustNobody völlig Recht.

Von mir kann ich keine einzige Beleidigung dir gegenüber feststellen, DU hingegen bist du ganze Zeit nur am rumflamen. Das dich einer der Admins noch nicht abgestraft hat verwundert mich jetzt etwas, aber egal.
Beleidigende und völlig unsachliche Beitrage werden hier durchaus abgestraft :)
Beleidigungen darfst du auch gerne melden, wenn du da Handlungsbedarf siehst.
 
J

JustNobody

Lassts doch mal gut sein...
https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-internationalization

Entweder ist wirklich der Typo mit ressources schuld, irgend eine unnötig Konfig ist gesetzt oder resources ist aus irgendeinem Grund nicht im ClassPath...
Ja, das fand ich übrigens ganz interessant. Die ganzen Webseiten, die einem einen schnellen Einstieg geben wollen, geben sehr viel mit rein, das nicht benötigt wird. Das trifft nicht nur auf den von mir gebrachten Hinweis auf den MessageSource auf den ich verwiesen habe sondern auch die ganzen anderen Dinge, die einem diverse Webseiten aufschwatzen wollen. Also z.B. auch LocalResolver und LocalChangeInterceptor (Die finden sich z.B. mit auf der Seite, bei der ich das Zitat von @TM69 gefunden habe).

Wenn man gewisse Dinge in der Praxis immer auf gewisse Weise macht (wir weichen von den Defaults ab, wobei ich da gesehen habe, dass da auch einiges direkt konfigurierbar wäre und somit ggf. auch ohne Code auskommen.) und die Dinge nicht hinterfragt, dann kommt da manchmal eine leicht verkehrte Sichtweise auf.

Der Auto-Configured MessageSource funktioniert sehr schön und die Internationalisierung benötigt tatsächlich keinerlei Code. (Habe es sogar extra auch auf die Schnelle ausprobieren müssen so als kleiner Test :) )
 
Thema: 

Spring Boot i18n

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben