Browse Source

mastered translations

feature/document
Stephan Richter 4 months ago
parent
commit
f81fa50f27
  1. 14
      frontend/src/App.svelte
  2. 14
      frontend/src/Components/Login.svelte
  3. 17
      frontend/src/Components/translations.js
  4. 19
      frontend/src/translations.svelte.js
  5. 30
      translations/src/main/java/de/srsoftware/umbrella/translations/Translations.java
  6. 5
      translations/src/main/resources/de.json

14
frontend/src/App.svelte

@ -1,9 +1,21 @@ @@ -1,9 +1,21 @@
<script>
import { onMount } from 'svelte';
import { loadTranslation } from './translations.svelte.js'
let translations_ready = false;
onMount(async () => {
await loadTranslation('de','Login');
translations_ready = true;
});
import Homepage from "./Components/Homepage.svelte";
import Login from "./Components/Login.svelte";
import Menu from "./Components/Menu.svelte";
</script>
{#if translations_ready}
<Menu />
<Homepage />
<Login />
<Login />
{:else}
<p>Loading translations...</p>
{/if}

14
frontend/src/Components/Login.svelte

@ -1,11 +1,5 @@ @@ -1,11 +1,5 @@
<script>
import { onMount } from 'svelte';
import { t, loadTranslation } from './translations.js'
let ready = false;
onMount(async () => {
await loadTranslation('en','Login');
ready = true;
});
import { t } from '../translations.svelte.js';
</script>
<style>
label { display: block; margin: 5px; }
@ -20,9 +14,8 @@ @@ -20,9 +14,8 @@
}
</style>
{#if ready}
<fieldset>
<legend>{t('Login','Login')}</legend>
<legend>{t('login.Login')}</legend>
<label>
<input type="text" />
<span>Email/Username</span>
@ -39,6 +32,3 @@ @@ -39,6 +32,3 @@
<button>SRSoftware</button>
<button>ORC ID</button>
</fieldset>
{:else}
<p>Loading translations...</p>
{/if}

17
frontend/src/Components/translations.js

@ -1,17 +0,0 @@ @@ -1,17 +0,0 @@
const translations = {}
export async function loadTranslation(lang,page){
if (!translations[lang]) translations[lang] = {};
if (translations[lang][page]) return;
var url = `${location.protocol}//${location.host.replace('5173','8080')}/api/translations/${lang}/${page}`;
const resp = await fetch(url);
const json = await resp.json();
translations[lang][page] = json;
}
export function t(page,key){
const lang = 'en';
if (!translations[lang]) return key;
if (!translations[lang][page]) return key;
return translations[lang][page][key] ? translations[lang][page][key] : key;
}

19
frontend/src/translations.svelte.js

@ -0,0 +1,19 @@ @@ -0,0 +1,19 @@
export const translations = $state({
values: {}
})
export async function loadTranslation(lang){
var url = `${location.protocol}//${location.host.replace('5173','8080')}/api/translations/${lang}`;
translations.values = await fetch(url).then(resp => resp.json());
}
export function t(key){
var keys = key.split('.');
let set = translations.values;
for (let key of keys){
if (set[key]) {
set = set[key];
} else return key;
}
return set;
}

30
translations/src/main/java/de/srsoftware/umbrella/translations/Translations.java

@ -3,13 +3,17 @@ package de.srsoftware.umbrella.translations; @@ -3,13 +3,17 @@ package de.srsoftware.umbrella.translations;
import static java.lang.System.Logger.Level.INFO;
import static java.lang.System.Logger.Level.WARNING;
import static java.nio.charset.StandardCharsets.UTF_8;
import com.sun.net.httpserver.HttpExchange;
import de.srsoftware.tools.Path;
import de.srsoftware.tools.PathHandler;
import org.json.JSONObject;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
@ -18,29 +22,31 @@ public class Translations extends PathHandler { @@ -18,29 +22,31 @@ public class Translations extends PathHandler {
private HashMap<String, JSONObject> translations = new HashMap<>();
public Translations(){
translations.put("en", new JSONObject(Map.of("Login",Map.of("Login","Nooo!"))));
}
@Override
public boolean doGet(Path path, HttpExchange ex) throws IOException {
LOG.log(INFO,"doGet({0},ex)",path);
allowOrigin(ex,"*");
if (path.empty())return sendContent(ex,501,"Language missing");
var lang = path.pop();
if (path.empty())return sendContent(ex,501,"Page missing");
var page = path.pop();
var translationsForLang = translations.get(lang);
if (translationsForLang == null) translations.put(lang,translationsForLang = loadTranslations(lang));
if (!translationsForLang.has(page)) return sendContent(ex,404,new JSONObject());
var translations = translationsForLang.get(page);
if (translations instanceof JSONObject json) sendContent(ex,json);
return sendContent(ex,500,translations);
return sendContent(ex,translationsForLang);
}
private JSONObject loadTranslations(String lang) {
private JSONObject loadTranslations(String lang) throws IOException {
LOG.log(WARNING,"loadTranslations({0} not implemented!",lang);
return new JSONObject();
var filename = lang + ".json";
URL url = getClass().getClassLoader().getResource(filename);
if (url == null) return new JSONObject();
var bos = new ByteArrayOutputStream();
var conn = url.openConnection();
try (var stream = conn.getInputStream()){
stream.transferTo(bos);
return new JSONObject(bos.toString(UTF_8));
} catch (Exception e) {
LOG.log(WARNING,"Failed to load {0}",url);
return new JSONObject();
}
}
}

5
translations/src/main/resources/de.json

@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
{
'login' : {
'Login' : "Mist!"
}
}
Loading…
Cancel
Save