mastered translations
This commit is contained in:
@@ -1,9 +1,21 @@
|
|||||||
<script>
|
<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 Homepage from "./Components/Homepage.svelte";
|
||||||
import Login from "./Components/Login.svelte";
|
import Login from "./Components/Login.svelte";
|
||||||
import Menu from "./Components/Menu.svelte";
|
import Menu from "./Components/Menu.svelte";
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
{#if translations_ready}
|
||||||
<Menu />
|
<Menu />
|
||||||
<Homepage />
|
<Homepage />
|
||||||
<Login />
|
<Login />
|
||||||
|
{:else}
|
||||||
|
<p>Loading translations...</p>
|
||||||
|
{/if}
|
||||||
@@ -1,11 +1,5 @@
|
|||||||
<script>
|
<script>
|
||||||
import { onMount } from 'svelte';
|
import { t } from '../translations.svelte.js';
|
||||||
import { t, loadTranslation } from './translations.js'
|
|
||||||
let ready = false;
|
|
||||||
onMount(async () => {
|
|
||||||
await loadTranslation('en','Login');
|
|
||||||
ready = true;
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
<style>
|
<style>
|
||||||
label { display: block; margin: 5px; }
|
label { display: block; margin: 5px; }
|
||||||
@@ -20,9 +14,8 @@
|
|||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
{#if ready}
|
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>{t('Login','Login')}</legend>
|
<legend>{t('login.Login')}</legend>
|
||||||
<label>
|
<label>
|
||||||
<input type="text" />
|
<input type="text" />
|
||||||
<span>Email/Username</span>
|
<span>Email/Username</span>
|
||||||
@@ -39,6 +32,3 @@
|
|||||||
<button>SRSoftware</button>
|
<button>SRSoftware</button>
|
||||||
<button>ORC ID</button>
|
<button>ORC ID</button>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
{:else}
|
|
||||||
<p>Loading translations...</p>
|
|
||||||
{/if}
|
|
||||||
@@ -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
Normal file
19
frontend/src/translations.svelte.js
Normal file
@@ -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;
|
||||||
|
}
|
||||||
@@ -3,13 +3,17 @@ package de.srsoftware.umbrella.translations;
|
|||||||
|
|
||||||
import static java.lang.System.Logger.Level.INFO;
|
import static java.lang.System.Logger.Level.INFO;
|
||||||
import static java.lang.System.Logger.Level.WARNING;
|
import static java.lang.System.Logger.Level.WARNING;
|
||||||
|
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||||
|
|
||||||
import com.sun.net.httpserver.HttpExchange;
|
import com.sun.net.httpserver.HttpExchange;
|
||||||
import de.srsoftware.tools.Path;
|
import de.srsoftware.tools.Path;
|
||||||
import de.srsoftware.tools.PathHandler;
|
import de.srsoftware.tools.PathHandler;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@@ -18,29 +22,31 @@ public class Translations extends PathHandler {
|
|||||||
|
|
||||||
private HashMap<String, JSONObject> translations = new HashMap<>();
|
private HashMap<String, JSONObject> translations = new HashMap<>();
|
||||||
|
|
||||||
public Translations(){
|
|
||||||
translations.put("en", new JSONObject(Map.of("Login",Map.of("Login","Nooo!"))));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doGet(Path path, HttpExchange ex) throws IOException {
|
public boolean doGet(Path path, HttpExchange ex) throws IOException {
|
||||||
LOG.log(INFO,"doGet({0},ex)",path);
|
LOG.log(INFO,"doGet({0},ex)",path);
|
||||||
allowOrigin(ex,"*");
|
allowOrigin(ex,"*");
|
||||||
if (path.empty())return sendContent(ex,501,"Language missing");
|
if (path.empty())return sendContent(ex,501,"Language missing");
|
||||||
var lang = path.pop();
|
var lang = path.pop();
|
||||||
if (path.empty())return sendContent(ex,501,"Page missing");
|
|
||||||
var page = path.pop();
|
|
||||||
var translationsForLang = translations.get(lang);
|
var translationsForLang = translations.get(lang);
|
||||||
if (translationsForLang == null) translations.put(lang,translationsForLang = loadTranslations(lang));
|
if (translationsForLang == null) translations.put(lang,translationsForLang = loadTranslations(lang));
|
||||||
|
|
||||||
if (!translationsForLang.has(page)) return sendContent(ex,404,new JSONObject());
|
return sendContent(ex,translationsForLang);
|
||||||
var translations = translationsForLang.get(page);
|
|
||||||
if (translations instanceof JSONObject json) sendContent(ex,json);
|
|
||||||
return sendContent(ex,500,translations);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private JSONObject loadTranslations(String lang) {
|
private JSONObject loadTranslations(String lang) throws IOException {
|
||||||
LOG.log(WARNING,"loadTranslations({0} not implemented!",lang);
|
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
Normal file
5
translations/src/main/resources/de.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
'login' : {
|
||||||
|
'Login' : "Mist!"
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user