Skip to content

Commit e521158

Browse files
committed
Added internationalization
1 parent 5cefed2 commit e521158

File tree

2 files changed

+134
-3
lines changed

2 files changed

+134
-3
lines changed

src/main/java/org/javawebstack/framework/WebApplication.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,8 @@
1212
import org.javawebstack.framework.seed.FileSeeder;
1313
import org.javawebstack.framework.seed.MergedSeeder;
1414
import org.javawebstack.framework.seed.Seeder;
15-
import org.javawebstack.framework.util.CORSPolicy;
16-
import org.javawebstack.framework.util.Crypt;
17-
import org.javawebstack.framework.util.MultipartPolicy;
15+
import org.javawebstack.framework.util.*;
16+
import org.javawebstack.graph.GraphElement;
1817
import org.javawebstack.httpserver.HTTPServer;
1918
import org.javawebstack.httpserver.transformer.response.JsonResponseTransformer;
2019
import org.javawebstack.injector.Injector;
@@ -26,6 +25,7 @@
2625
import org.javawebstack.orm.wrapper.SQL;
2726
import org.javawebstack.orm.wrapper.SQLite;
2827

28+
import java.io.IOException;
2929
import java.util.*;
3030
import java.util.logging.Logger;
3131

@@ -42,6 +42,7 @@ public abstract class WebApplication {
4242
private final ModelBindParamTransformer modelBindParamTransformer = new ModelBindParamTransformer();
4343
private final CommandSystem commandSystem = new CommandSystem();
4444
private final Map<String, Seeder> seeders = new HashMap<>();
45+
private final I18N translation = new I18N();
4546

4647
public WebApplication(){
4748
injector = new SimpleInjector();
@@ -52,6 +53,7 @@ public WebApplication(){
5253
injector.setInstanceUnsafe(getClass(), this);
5354
injector.setInstance(WebApplication.class, this);
5455
injector.setInstance(CommandSystem.class, commandSystem);
56+
injector.setInstance(I18N.class, translation);
5557
commandSystem.setInjector(injector);
5658

5759
setupModules();
@@ -126,6 +128,20 @@ public WebApplication(){
126128
);
127129
}
128130

131+
public void addTranslation(Locale locale, ClassLoader classLoader, String resource){
132+
try {
133+
GraphElement element = GraphElement.fromJson(IO.readTextResource(classLoader, resource));
134+
if(element.isObject())
135+
translation.add(locale, element.object());
136+
if(element.isArray())
137+
translation.add(locale, element.array());
138+
} catch (IOException ignored) {}
139+
}
140+
141+
public void addTranslation(Locale locale, String resource){
142+
addTranslation(locale, ClassLoader.getSystemClassLoader(), resource);
143+
}
144+
129145
public void addDatabaseJobQueue(String name, boolean defaultQueue){
130146
addQueue(name, new DatabaseJobQueue(name), defaultQueue);
131147
}
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package org.javawebstack.framework.util;
2+
3+
import org.javawebstack.graph.GraphArray;
4+
import org.javawebstack.graph.GraphObject;
5+
6+
import java.util.HashMap;
7+
import java.util.Locale;
8+
import java.util.Map;
9+
10+
public class I18N {
11+
12+
private Locale defaultLocale = Locale.ENGLISH;
13+
private final Map<Locale, Map<String, I18NString>> translations = new HashMap<>();
14+
15+
public void setDefaultLocale(Locale defaultLocale) {
16+
this.defaultLocale = defaultLocale;
17+
}
18+
19+
public Locale getDefaultLocale() {
20+
return defaultLocale;
21+
}
22+
23+
public void set(Locale locale, String key, Map<String, Object> fields){
24+
if(!translations.containsKey(locale))
25+
translations.put(locale, new HashMap<>());
26+
Map<String, I18NString> strings = translations.get(locale);
27+
strings.put(key, new I18NString(fields));
28+
translations.put(locale, strings);
29+
}
30+
31+
public void set(String key, Map<String, Object> fields){
32+
set(getDefaultLocale(), key, fields);
33+
}
34+
35+
public void add(GraphArray array){
36+
add(getDefaultLocale(), array);
37+
}
38+
39+
public void add(Locale locale, GraphArray array){
40+
GraphObject object = new GraphObject();
41+
array.forEach(e -> object.set(e.object().get("key").string(), e));
42+
add(locale, object);
43+
}
44+
45+
public void add(GraphObject object){
46+
add(getDefaultLocale(), object);
47+
}
48+
49+
public void add(Locale locale, GraphObject object){
50+
for(String key : object.keys()){
51+
Map<String, Object> fields = new HashMap<>();
52+
object.forEach((k, v) -> fields.put(k, v.isNumber() ? v.number() : v.string()));
53+
set(locale, key, fields);
54+
}
55+
}
56+
57+
public I18NString getString(Locale locale, String key){
58+
if(!translations.containsKey(locale))
59+
locale = getDefaultLocale();
60+
if(!translations.containsKey(locale))
61+
return new I18NString(key);
62+
Map<String, I18NString> strings = translations.get(locale);
63+
if(!strings.containsKey(key) && locale.equals(getDefaultLocale()))
64+
return new I18NString(key);
65+
strings = translations.get(getDefaultLocale());
66+
return strings.containsKey(key) ? strings.get(key) : new I18NString(key);
67+
}
68+
69+
public I18NString getString(String key){
70+
return getString(getDefaultLocale(), key);
71+
}
72+
73+
public String translate(Locale locale, String key, Object... params){
74+
return getString(locale, key).translate(params);
75+
}
76+
77+
public String translate(String key, Object... params){
78+
return translate(getDefaultLocale(), key, params);
79+
}
80+
81+
public static class I18NString {
82+
private Map<String, Object> fields;
83+
private I18NString(){}
84+
public I18NString(String message){
85+
this(new HashMap<String, Object>(){{
86+
put("message", message);
87+
}});
88+
}
89+
public I18NString(Map<String, Object> fields){
90+
this.fields = fields;
91+
}
92+
public Object getField(String key){
93+
return fields.get(key);
94+
}
95+
public String getString(String key){
96+
if(!fields.containsKey(key))
97+
return null;
98+
return getField(key).toString();
99+
}
100+
public Integer getInt(String key){
101+
if(!fields.containsKey(key))
102+
return null;
103+
if(fields.get(key) instanceof Integer)
104+
return (Integer) fields.get(key);
105+
return Integer.parseInt(getString(key));
106+
}
107+
public String translate(Object... params){
108+
String message = getString("message");
109+
for(int i=0; i<params.length; i++)
110+
message = message.replace("{"+i+"}", params[i].toString());
111+
return message;
112+
}
113+
}
114+
115+
}

0 commit comments

Comments
 (0)